一、LBP及原理
原理部分参考:https://www.jianshu.com/p/47ec293bf55d
作者:顽皮的石头7788121
链接:https://www.jianshu.com/p/47ec293bf55d
来源:简书
LBP(Local Binary Pattern,局部二值模式)是一种用来描述图像局部纹理特征的算子;它具有旋转不变性和灰度不变性等显著的优点。用于纹理特征提取。而且,提取的特征是图像的局部的纹理特征。
原始的LBP算子定义为在3*3的窗口内,以窗口中心像素为阈值,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素 点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数(通常转换为十进制数即LBP码,共256种),即得到该窗口中心像 素点的LBP值,并用这个值来反映该区域的纹理信息。
对LBP特征向量进行提取的步骤:
(1)首先将检测窗口划分为16×16的小区域(cell);
(2)对于每个cell中的一个像素,将相邻的8个像素的灰度值与其进行比较,若周围像素值大于中心像素值,则该像素点的位置被标记为1,否则为0。这样,3*3邻域内的8个点经比较可产生8位二进制数,即得到该窗口中心像素点的LBP值;
(3)然后计算每个cell的直方图,即每个数字(假定是十进制数LBP值)出现的频率;然后对该直方图进行归一化处理。
(4)最后将得到的每个cell的统计直方图进行连接成为一个特征向量,也就是整幅图的LBP纹理特征向量;
二、接口
1. Matlab()
features = extractLBPFeatures(I)
features = extractLBPFeatures(I,Name,Value)
三、代码实现
brickWall = imread('bricks.jpg');
[r, c] = size(brickWall);
LBP_data = [];
count = 1;
for i = 2:r-1
for j = 2:c-1
threshold = brickWall(i, j);
cell_data = [];
cell_data(1) = brickWall(i-1, j-1) > threshold;
cell_data(2) = brickWall(i-1, j) > threshold;
cell_data(3) = brickWall(i-1, j+1) > threshold;
cell_data(4) = brickWall(i, j+1) > threshold;
cell_data(5) = brickWall(i+1, j+1) > threshold;
cell_data(6) = brickWall(i+1, j) > threshold;
cell_data(7) = brickWall(i+1, j-1) > threshold;
cell_data(8) = brickWall(i, j-1) > threshold;
cell_value = zeros(1, 8);
for k = 1:8
for kk = 0:7
index = kk + k;
if index<=8
cell_value(k) = cell_value(k) + cell_data(index) * 2^(8-kk-1);
else
index = index - 8;
cell_value(k) = cell_value(k) + cell_data(index) * 2^(8-kk-1);
end
end
end
LBP_data(count) = min(cell_value);
count = count + 1;
end
end
freq = zeros(1, 255);
for i = 0:255
freq(i+1)=length(find(LBP_data == i));
end
freq = freq ./ sqrt(sum(freq .^2));
figure, histogram(freq, 59);