Uniform Pattern LBP特征

Uniform Pattern,也被称为等价模式或均匀模式,由于一个LBP特征有多种不同的二进制形式,对于半径为R的圆形区域内含有P个采样点的LBP算子将会产生2P种模式。很显然,随着邻域集内采样点数的增加,二进制模式的种类是以指数形式增加的。例如:5×5邻域内20个采样点,有220=1,048,576种二进制模式。这么多的二进制模式不利于纹理的提取、分类、识别及存取。例如,将LBP算子用于纹理分类或人脸识别时,常采用LBP模式的统计直方图来表达图像的信息,而较多的模式种类将使得数据量过大,且直方图过于稀疏。因此,需要对原始的LBP模式进行降维,使得数据量减少的情况下能最好的表示图像的信息。
为了解决二进制模式过多的问题,提高统计性,Ojala提出了采用一种“等价模式”(Uniform Pattern)来对LBP算子的模式种类进行降维。Ojala等认为,在实际图像中,绝大多数LBP模式最多只包含两次从1到0或从0到1的跳变。因此,Ojala将“等价模式”定义为:当某个LBP所对应的循环二进制数从0到1或从1到0最多有两次跳变时,该LBP所对应的二进制就称为一个等价模式类。如00000000(0次跳变),00000111(只含一次从0到1的跳变),10001111(先由1跳到0,再由0跳到1,共两次跳变)都是等价模式类。除等价模式类以外的模式都归为另一类,称为混合模式类,例如10010111(共四次跳变)。通过这样的改进,二进制模式的种类大大减少,而不会丢失任何信息。模式数量由原来的2P种减少为 P ( P-1)+2种,其中P表示邻域集内的采样点数。对于3×3邻域内8个采样点来说,二进制模式由原始的256种减少为58种,即:它把值分为59类,58个uniform pattern为一类,其它的所有值为第59类。这样直方图从原来的256维变成59维。这使得特征向量的维数更少,并且可以减少高频噪声带来的影响。
具体实现:采样点数目为8个,即LBP特征值有28种,共256个值,正好对应灰度图像的0-255,因此原始的LBP特征图像是一幅正常的灰度图像,而等价模式LBP特征,根据0-1跳变次数,将这256个LBP特征值分为了59类,从跳变次数上划分:跳变0次—2个,跳变1次—0个,跳变2次—56个,跳变3次—0个,跳变4次—140个,跳变5次—0个,跳变6次—56个,跳变7次—0个,跳变8次—2个。共9种跳变情况,将这256个值进行分配,跳变小于2次的为等价模式类,共58个,他们对应的值按照从小到大分别编码为1—58,即它们在LBP特征图像中的灰度值为1—58,而除了等价模式类之外的混合模式类被编码为0,即它们在LBP特征中的灰度值为0,因此等价模式LBP特征图像整体偏暗。


matlab源码

function imglbp = getUniformPatternLBPFeature(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));
%     LBP特征值对应图像灰度编码表,直接默认采样点为8位
    temp = 1;
    table = zeros(256);
    for i=0:255
        if getHoptimes(i) < 3
            table(i+1) = temp;
            temp = temp + 1;
        end
    end

    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));

                if k == neighbors-1
                    imglbp(i-radius, j-radius) = table(imglbp(i-radius, j-radius) + 1);
                end
            end
        end
    end
end

function count = getHoptimes(n)
    count = 0;
    binaryCode = dec2bin(n,8);

    for i=1:7
        i2 = mod(i+1, 8);
        if i2 == 0
            i2 = i2 + 1;
        end

        if binaryCode(i) ~= binaryCode(i2)
            count = count + 1;
        end
    end
end

效果图

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

猜你喜欢

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