Posted on

LBP 區域二值模式

其實會發這一篇文,主要是看到這個博客的文章真的感動到快哭了…

這幾天因為想增加OCR辨識正確率開始與LBP打交道
https://zh.wikipedia.org/wiki/%E5%B1%80%E9%83%A8%E4%BA%8C%E5%80%BC%E6%A8%A1%E5%BC%8F
我找到了一個看起來很強大很棒的函式庫
https://scikit-image.org/docs/stable/api/skimage.feature.html#skimage.feature.local_binary_pattern

網路上有很多教學文章,看起來是很知名的套件
a href=\”https://machine-learning-python.kspax.io/classification/ex1_recognizing_hand-written_digits\”>https://machine-learning-python.kspax.io/classification/ex1_recognizing_hand-written_digits
然後我遇到了和這位博主一樣的問題
https://www.cnblogs.com/ilk123/p/11797261.html
沒錯…….LBP明明出來的應該是1-256的值阿…我也是設定R=1, P=8\r\n這樣用default的LBP出來的應該要是1-256之間的值,但是卻是0和1的二值陣列….

我一直想..這麼偉大的一個scikit-image怎麼可能有錯,一定是我的使用方法有誤…
害我撞頭撞到快崩潰…..
沒想到在此遇到一個和我一樣的苦主
太感動了,特此記錄!

另外,後來我也找到了一個最原始的LBP算法
程式碼下載於 https://github.com/zhongqianli/local_binary_pattern/blob/master/local_binary_pattern.py

def original_lbp(image):
"""origianl local binary pattern"""
rows = image.shape[0]
cols = image.shape[1]

lbp_image = np.zeros((rows - 2, cols - 2), np.uint8)

for i in range(1, rows - 1):
for j in range(1, cols - 1):
code = 0
center_pix = image[i, j]
if image[i - 1, j - 1] > center_pix:
code = code | (1 << 7) if image[i - 1, j] > center_pix:
code = code | (1 << 6) if image[i - 1, j + 1] > center_pix:
code = code | (1 << 5) if image[i, j + 1] > center_pix:
code = code | (1 << 4) if image[i + 1, j + 1] > center_pix:
code = code | (1 << 3) if image[i + 1, j] > center_pix:
code = code | (1 << 2) if image[i + 1, j - 1] > center_pix:
code = code | (1 << 1) if image[i, j - 1] > center_pix:
code = code | (1 << 0) lbp_image[i - 1, j - 1] = code return lbp_image[/code]