特征提取算法之LBP
图像特征,图像纹理,图像频域等多种角度提取图像的特征。
LBP,局部二值模式,局部特征描述算子,具有很强的纹理特征描述能力,具有光照不变性和旋转不变性。用python进行简单的LBP算法实验:
1 from skimage import data,io 2 import matplot.pyplot as plt 3 import cv2 4 from skimage.feature import local_binary_pattern 5 image = cv2.imread('Lena.jpg') 6 plt.subplot(1,2,2) 7 plt.imshow(image) 8 plt.show(image) 9 radius = 1 10 n_points = radius * 8 11 lbp=local_binary_pattern(image,n_points,radius) 12 plt.inshow(lbp) 13 plt.show(lbp)
(1)LBP旋转模式不变性
初始的LBP算法不具有旋转不变性,LBP串的连接顺序是固定的,当图像旋转后LBP就会发生改变,为了保持旋转不变性,制定一个规则,计算所有旋转产生的LBP值,取其中最小的(不知道为什么取最小的而不是最大的)作为该点的LBP值,则无论图像如何旋转,最小值始终是不变的,获得了旋转不变性。代价是增大了算法的计算量。
(2)LBP等价模式
一个LBP算子可以产生多种不同的二进制模式,如果有P个采样点,每个采样点有两种可能的取值,一个有2^P种模式,不利于分析。使用一种等价模式对LBP算子的模式种类进行降维。Ojala对等价模式的定义,即当某个局部二进制模式所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该局部二进制模式所对应的二进制就成为一个等价模式类,其他的归为混合模式类,有两次跳变的等价模式一个有P*(P-1)种,0次跳变的2种,混合模式类1种,将维数从2*P降为P*(P-1)+3种。
对LBP特征向量进行提取的步骤
1)首先将检测窗口划分为16*16的小区域(cell)
2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0.这样,3*3领域内的8个点经过比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
3)然后计算每个cell的直方图,即每个数字出现的频率,然后对该直方图进行归一化处理
4)最后将得到的每个cell的统计直方图进行连接成一个特征向量,也就是整幅图的LBP纹理特征向量
然后便可以用SVM或者其他机器学习算法进行分类了。