利用LBP算子结合SVM提取建筑物(一)

目录

一、原始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这种二次开发语言,老总也不懂是什么玩意,这基本上就是给非程序员用的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值