目录
一、原始LBP算子的matlab代码
二、圆形LBP算子的matlab代码
三、均匀LBP算子的matlab代码(含旋转不变性)
四、SVM提取建筑物信息
一、原始LBP算子的matlab代码
原始LBP算法,官方的定义是在一个3x3的矩阵区域中,根据对比像素值的大小来对图像进行编码,即以3x3矩阵区域的中心像素的灰度值作为参照,利用8个邻域像素灰度值依次与中心像素点的灰度值进行比较,大于该区域中心像素的灰度值的编码为1,小于的则编码为0,最后以8个像素点中最左上的点为起点,围绕区域中心,按照顺时针方向编码,得到8位的二进制编码,中心像素的LBP码值即是该二进制对应的十进制数值。以此方法遍历图像中的其他点进行同样的编码,则可以得到最终的纹理特征图像。原始LBP算子的计算公式如式2-1所示。
其中,n表示矩阵区域中的第n个像素点,I(c)表示中心像素的灰度值,I(n)表示8邻域中的第n个像素点的灰度值;s(x)的计算公式如式2-2所示。
看了一些GPT和其它博主写的代码(喜欢从下标2开始,matlab的数组下标从1开始,他们写的代码直接忽略下标1,这指定对轮廓细节有一定的损失,如果是后期的圆形LBP算子也直接忽视,那就不用做了,图一乐就可以了),简直不忍直视。
function [LBP_image] = LBP_origin(image)
%UNTITLED3 此处显示有关此函数的摘要
% 此处显示详细说明
[height,width,h] = size(image);%m:长度 n:宽度
I = imresize(image,[height width]);
lbpI = uint8(zeros([height width]));
for i = 1:width %宽度
for j = 1:height %长度(高度)
r=int32(I(j,i,1));%红色分量
g=int32(I(j,i,2));%绿色分量
b=int32(I(j,i,3));%蓝色分量
%彩色转灰度,通过设置二值化的位数可以提高二值化的精度,是二值化的效果更加清晰
%CenterValue=bitshift((r*38+g*75+b*15),-7);
CenterValue=bitshift((r*19595+g*38469+b*7472),-16);
%记录8领域的二进制数组
array = int32(zeros(1, 8));
k=1;
for w=i-1:i+1
for h=j-1:j+1
if h==j && w==i
continue;
end
if (w<1) || (w>width)||(h<1)||(h>height)
value=CenterValue;
else
R=int32(I(h,w,1));
G=int32(I(h,w,2));
B=int32(I(h,w,3));
%value=bitshift(R*38+G*75+B*15,-7);
value=bitshift(R*19595+G*38469+B*7472,-16);
%value=(I(w,h,1)*38+I(w,h,2)*75+I(w,h,3)*15)/128;
end
if value<CenterValue
array(k)=0;
else
array(k)=1;
end
k=k+1;
end
end
%逆时针
%lbpI(j,i)=bitshift(array(1),7)+bitshift(array(2),6)+bitshift(array(3),5)+bitshift(array(5),4)+bitshift(array(8),3)+bitshift(array(7),2)+bitshift(array(6),1)+array(4);
%顺时针
lbpI(j,i)=bitshift(array(1),7)+bitshift(array(4),6)+bitshift(array(6),5)+bitshift(array(7),4)+bitshift(array(8),3)+bitshift(array(5),2)+bitshift(array(3),1)+array(2);
end
end
figure;imshow(lbpI);
LBP_image=lbpI;
end
这个代码稍微做的改进就是利用16位精度系数的灰度计算公式计算灰度图像,运算细节上改用左移或者右移代替乘法或者除法运算。
最后我提一嘴,后面想往计算机方向发展的,你去用python吧,matlab这种二次开发语言,老总也不懂是什么玩意,这基本上就是给非程序员用的。