圆形LBP特征-matlab

由于原始LBP特征使用的是固定邻域内的灰度值,因此当图像的尺度发生变化时,LBP特征的编码将会发生错误,LBP特征将不能正确的反映像素点周围的纹理信息,因此研究人员对其进行了改进[3]。基本的 LBP 算子的最大缺陷在于它只覆盖了一个固定半径范围内的小区域,这显然不能满足不同尺寸和频率纹理的需要。为了适应不同尺度的纹理特征,并达到灰度和旋转不变性的要求,Ojala 等对 LBP 算子进行了改进,将 3×3 邻域扩展到任意邻域,并用圆形邻域代替了正方形邻域,改进后的 LBP 算子允许在半径为 R 的圆形邻域内有任意多个像素点。从而得到了诸如半径为R的圆形区域内含有P个采样点的LBP算子:
这里写图片描述


matlab源码

function imglbp = getCircularLBPFeature(img, radius, neighbors)
    imgSize = size(img);
    if numel(imgSize) > 2
        imgG = rgb2gray(img);
    else
        imgG = img;
    end
    [rows, cols] = size(imgG);
    rows=int16(rows);
    cols=int16(cols);
    imglbp = uint8(zeros(rows-2*radius, cols-2*radius));

    for k=0:neighbors-1
%       计算采样点对于中心点坐标的偏移量rx,ry        
        rx = radius * cos(2.0 * pi * k / neighbors);
        ry = -radius * sin(2.0 * pi * k / neighbors);
%       对采样点偏移量分别进行上下取整        
        x1 = floor(rx);
        x2 = ceil(rx);
        y1 = floor(ry);
        y2 = ceil(ry);
%       将坐标偏移量映射到0-1之间        
        tx = rx - x1;
        ty = ry - y1;
%       根据0-1之间的x,y的权重计算公式计算权重,权重与坐标具体位置无关,与坐标间的差值有关
        w1 = (1-tx) * (1-ty);
        w2 = tx * (1-ty);
        w3 = (1-tx) * ty;
        w4 = tx * ty;

        for i=radius+1:rows-radius
            for j=radius+1:cols-radius
                center = imgG(i, j);
%               根据双线性插值公式计算第k个采样点的灰度值                
                neighbor = imgG(i+x1, j+y1)*w1 + imgG(i+x1, j+y2)*w2 + imgG(i+x2, j+y1)*w3 + imgG(i+x2, j+y2)*w4;
%               LBP特征图像的每个邻居的LBP值累加,累加通过与操作完成,对应的LBP值通过移位取得
                if neighbor > center
                    flag = 1;
                else
                    flag = 0;
                end
                imglbp(i-radius, j-radius) = bitor(imglbp(i-radius, j-radius), bitshift(flag, neighbors-k-1));
            end
        end
    end
end

效果图

原图
这里写图片描述
radius=3,neighbors=8
这里写图片描述
radius=2,neighbors=8
这里写图片描述
radius=1,neighbors=8
这里写图片描述
radius=2,neighbors=4
这里写图片描述

猜你喜欢

转载自blog.csdn.net/jxch____/article/details/80561945
今日推荐