LBP(局部二值模式)是一种用来描述图像局部纹理特征的算子,具有旋转不变性和灰度不变性等显著优点。
(1) 原始LBP
原始的LBP算子定义在一个3*3的窗口内,以窗口中心像素为阈值,与相邻的8个像素的灰度值比较,若周围的像素值大于中心像素值,则该位置被标记为1,否则标记为0.可以得到一个8位二进制,将这个值作为窗口中心像素点的LBP值,来反映这个3*3区域的纹理信息。LBP记录的是中心像素点与领域像素点之间的差值,所以当光照变化引起像素灰度值同增同减时,LBP变化并不明显,可以认为LBP对于光照变化不敏感,LBP检测的仅仅是图像的纹理信息,因此,进一步还可以将LBP做直方图统计,这个直方图可以用来作为纹理分析的特征算子。
数学公式:
其中,p表示3*3窗口中除中心像素点外的第p个像素点,I(c)表示中心像素点的灰度值,I(p)表示领域内第p个像素点的灰度值。
(2) 圆形LBP
为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,将3*3领域扩展到任意领域,并用圆形领域代替正方形领域,改进后的LBP算子在半径为R的圆形领域内有任意多个像素点。假设半径为R的圆形区域内含有P个采样点的LBP算子:
p=16,R=2时,圆形边界上的点可能不是整数或者正好落在某个格子内,可能位于交界处,可以使用双线性插值法来计算该点的像素值。
其中,p表示圆形区域中总计P个采样点中的第p个采样点,I(c)表示中心像素的灰度值,I(p)表示圆形边界像素点中第p个点灰度值。总共有p个点在圆形边界上,点坐标计算:
(3) 旋转不变LBP
从原始LBP的定义来看,LBP算子是灰度不变的,但不是旋转不变的,图像旋转的话就会得到不同的LBP值。提出具有旋转不变性的LBP算子,即不断旋转圆形领域得到一系列初始定义的LBP值,取其最小值作为该领域的LBP值。
在于对LBP的结果进行二进制编码,并做循环位移,取所有结果中最小的那个值:
def value_rotation(num):
value_list = np.zeros((8), np.uint8)
temp = int(num)
value_list[0] = temp
for i in range(7):
temp = ((temp << 1) | (temp / 128)) % 256
value_list[i+1] = temp
return np.min(value_li
(4) 均匀模式LBP
对于半径为R的圆形区域内含有P个采样点,会有2P-1种模式。很显然,随着采样点数P的增加,二进制模式的种类是呈指数趋势增长的。尽可能少且具有代表性的特征,因此需要对LBP得到的二进制模式种类进行降维,使用更少的数据量来最好地表示图像的信息,这种降维的方法就是uniform LBP。限制一个二进制序列从0到1或1到0的跳变次数不超过2次。模式数量从原来的2P种减少为P(P-1)+2种,其中P表示领域集内的采样点数。
目的就是统计二进制数的跳变次数,跳变次数小于等于2,则各自代表一类,跳变次数大于2的所有情况归为一类。
(5) 均匀模式+旋转不变模式LBP
先计算跳变次数:
跳变次数小于等于2,则各自代表一类,跳变次数大于2的所有情况归为一类。得到的结果设为LBPuniP,R,再对其二进制编码做循环移位,求出最小值。