LBP特征提取(opencv3&python)

基本的LBP特征提取主要流程如下:

LBP特征提取(opencv3&python)_第1张图片

更通俗的理解是将周围的像素与中间位置像素进行比较,并将比较结果以0 | 1写入对应的像素位中(etc: 左上角 1 < 5 , 故 第二幅图左上角写入 0),从左上角顺时针依次填入二进制字符串中(二进制表示依次为: 00010011),然后转换成十进制(19),即是结果。

最终的代码:

import cv2
import numpy as np
import os

def LBP(image):
    W, H = image.shape                    #获得图像长宽
    xx = [-1,  0,  1, 1, 1, 0, -1, -1]  
    yy = [-1, -1, -1, 0, 1, 1,  1,  0]    #xx, yy 主要作用对应顺时针旋转时,相对中点的相对值.
    res = np.zeros((W - 2, H - 2),dtype="uint8")  #创建0数组,显而易见维度原始图像的长宽分别减去2,并且类型一定的是uint8,无符号8位,opencv图片的存储格式.
    for i in range(1, W - 2):
        for j in range(1, H - 2):
            temp = ""
            for m in range(8):
                Xtemp = xx[m] + i    
                Ytemp = yy[m] + j    #分别获得对应坐标点
                if image[Xtemp, Ytemp] > image[i, j]: #像素比较
                    temp = temp + '1'
                else:
                    temp = temp + '0'
            #print int(temp, 2)
            res[i - 1][j - 1] =int(temp, 2)   #写入结果中
    return res



def Tran(src, drc):
    list = os.listdir(src)
    sum = 0
    for i in list:
        try:
            img = cv2.imread(src + "/" + i, 0)
            img = cv2.resize(img, (224, 224), interpolation=cv2.INTER_AREA)    #将图片变成固定大小224,224,这步可以不用,自己选择
            cv2.imshow("temp", img)
            cv2.waitKey(0)
            cv2.destroyAllWindows()
            res = LBP(img.copy())
            cv2.imwrite(drc + "/" + i, res)
            sum = int(sum) + 1
            print i + " is finnished, number is " + str(sum)
        except:
            print "error in " + i





src = "/home/rui/ttt/val"
drc = "/home/rui/ttt/end"


Tran(src, drc)

如果是简单使用,则只需更改src以及drc部分,分别源目标目录以及结果目录

你可能感兴趣的:(Opencv3笔记)