• LBP特征


    LBP 算子是一种有效的纹理描述算子, 它具有旋转不变性和灰度不变性等显著优点。其基本思想是用其中心像素的灰度值作为阈值,与它的邻域相比较得到的二进制码来表述局部纹理特征。

    基本LBP

    首先介绍LBP 算子的计算方式。对于一幅图像中的某个局部区域内的任意像素f(xc , yc ),以其为中心点gc , 对3 ×3 窗口内的8 个点g0 ,…, g7 , 纹理T 定义如下:


    以窗口中心点灰度值为阈值对窗口内其它像素做二值化处理, 如公式(2)所示:


    得到一个8 位的二进制数, 按公式(3)对像素不同位置进行加权求和, 即可得到该窗口的LBP 值:


    一个基本的LBP 算子如下图所示。

                     

                                                                     基本LBP算子示意图

    改进LBP

    为了适应不同尺度的纹理特征,对LBP 算子进行了改进, 将3 ×3 邻域扩展到任意邻域, 并用圆形邻域代替了正方形邻域, 采用双线性插值算法计算没有完全落在像素位置的点的灰度值。此外, 改进后的LBP 算子允许在半径为R 的圆形邻域内有任意多个像素点, 如图3 所示。符号表示在半径为R 的圆形邻域内有P 个像素点。

               

                                                                                 几种LBP算子

    原始LBP与改进LBP的差别:

    (1)原始定义于方形邻域上,而修改过的定义于圆形邻域中,从而更易于定义具有旋转不变性的纹理描述算子

    (2)修改后的,算子中,其邻域中对角线上的像素值是通过线性内插得到的

    uniform LBP

    注意到随着采样点数的增加, 二进制模式的种类会急剧增加。如3 ×3 邻域内8 个采样点, 对应有2^8 种二进制模式;5 ×5 邻域内20 个采样点, 对应有2^20 种二进制模式;7 ×7 的邻域内36个采样点, 对应的二进制模式种类多达2^36种。显然, 如此多的二值模式对于提取纹理是不利的。为了解决二进制模式过多的问题, 提高统计性,利用所谓的“等价模式类”(uniform patterns)对LBP 进行了改进。当某个局部二进制模式首尾相连环的形所对应的循环二进制数从0 到1 或从1 到0 最多有两次跳变时, 该局部二进制模式所对应的二进制就称为一个等价模式类, 如00000000 ,11111111 , 10001111 都是等价模式类, 除等价模式类以外的模式都归为另一类, 称为混合模式类。这使得基本LBP算子的二进制模式的种类由原来的2^P 种减少为P(P-1)+3 种,例如P=8时等价模式类58个,混合模式类1个,共59种。其中,P 表示邻域集内的采样点数。通过这样的改进, 局部二值模式的种类大大减少。等价模式类占总模式中的绝大多数, 利用这些等价模式类和混合模式类的直方图, 可提取更能代表图像本质特性的特征。

    LBP用于人脸识别

    人脸的分类识别是通过匹配LBP 直方图序列特征的相似度来实现分类,首先,面部区域被分成许多小区域,并在此基础上生成多个直方图。然后,将这些直方图连接,生成一个空间特征得以增强、有效表征面部图像的直方图。计算出分块完备LBP 直方图特征的不相似度,然后根据最近邻准则进行分类。目前常用的几种直方图间距离计算方法有:1) 直方图相交距离 ; 2) 对数似然统计法 ; 3) Chi 平方统计法。采用Chi 平方统计法进行直方图间的不相似性度量,两个样本间的Chi距离值越小,表明两个样本越相似。

    在Chi平方相似性度量过程中,为了实现对图像的识别,需要对测试集和训练集中的每一幅图像的增强直方图向量进行两两Chi平方距离计算,得到对应的平方距离矩阵。设训练集特征向量矩阵为A,大小为m*h1,其中m为训练集所包含的图像数,h1为特征向量维数;测试集特征向量矩阵为B,大小为n*h2,其中n为测试集所包含的图像数,h2为特征向量维数;则计算所得的平方距离矩阵为m*n维,Cij表示训练集中的图像i与测试集中的图像j之间的Chi平方距离。通过计算测试样本的分块完备LBP 直方图特征和所有训练样本的分块完备LBP 直方图特征的Chi距离值,然后根据最近邻准则,将测试样本归为距离值最小的那一类。



    LBP特征提取的matlab代码


    %getLBPFea.m
    function [histLBP, MatLBP] = getLBPFea(I)
    % 计算分区图像 I 的LBP特征,(8,2),uniform
    %
    % 输入:I --- 分区图像
    %
    % 返回值: MatLBP --- LBP响应矩阵
    %               histLBP --- 1维行向量,LBP直方图
    
    % 获得分块图像I的大小
    [m n] = size(I);
    rad = 2;
    if (m <= 2*rad) || (n <= 2*rad)
        error('I is too small to compute LBP feature!');
    end
    
    MatLBP = zeros(m-2*rad, n-2*rad);
    
    % 读入 LBP 映射(像素灰度与直方图收集箱索引的映射)
    load Mat/LBPMap.mat;
    
    for ii = 1+rad : m-rad
        for jj = 1+rad : n-rad
            nCnt = 1;
            
            
            % 计算(8,2)邻域的像素值,不在像素中心的点通过双线性插值获得其值
            nbPT(nCnt) = I(ii, jj-rad);
            nCnt = nCnt + 1;
            
            horInterp1 = I(ii-2, jj-2) + 0.5858*( I(ii-2, jj-1) - I(ii-2, jj-2) ); % 水平方向插值
            horInterp2 = I(ii-1, jj-2) + 0.5858*( I(ii-1, jj-1) - I(ii-1, jj-2) ); % 水平方向插值
            verInterp = horInterp1 + 0.5858*( horInterp2 - horInterp1 ); % 竖直方向插值
            nbPT(nCnt) = verInterp;
            nCnt = nCnt + 1;
            
            nbPT(nCnt) = I(ii-2, jj);
            nCnt = nCnt + 1;
            
            horInterp1 = I(ii-2, jj+1) + 0.4142*( I(ii-2, jj+2) - I(ii-2, jj+1) );
            horInterp2 = I(ii-1, jj+1) + 0.4142*( I(ii-1, jj+2) - I(ii-1, jj+1) );
            verInterp = horInterp1 + 0.5858*( horInterp2 - horInterp1 );
            nbPT(nCnt) = verInterp;
            nCnt = nCnt + 1;
            
            nbPT(nCnt) = I(ii, jj+2);
            nCnt = nCnt + 1;
            
            horInterp1 = I(ii+1, jj+1) + 0.4142*( I(ii+1, jj+2) - I(ii+1, jj+1) );
            horInterp2 = I(ii+2, jj+1) + 0.4142*( I(ii+2, jj+2) - I(ii+2, jj+1) );
            verInterp = horInterp1 + 0.4142*( horInterp2 - horInterp1 );
            nbPT(nCnt) = verInterp;
            nCnt = nCnt + 1;
            
            nbPT(nCnt) = I(ii+2, jj);
            nCnt = nCnt + 1;
            
            horInterp1 = I(ii+1, jj-2) + 0.5858*( I(ii+1, jj-1) - I(ii+1, jj-2) );
            horInterp2 = I(ii+2, jj-2) + 0.5858*( I(ii+2, jj-1) - I(ii+2, jj-1) );
            verInterp = horInterp1 + 0.4142*( horInterp2 - horInterp1 );
            nbPT(nCnt) = verInterp;
                    
            
            for iCnt = 1:nCnt
                if( nbPT(iCnt) >= I(ii, jj) )
                    MatLBP(ii-rad, jj-rad) = MatLBP(ii-rad, jj-rad) + 2^(nCnt-iCnt);
                end
            end
        end
    end
    
    
    
    % 计算LBP直方图
    histLBP = zeros(1, 59); % 对于(8,2)的uniform直方图共有59个收集箱
    
    for ii = 1:m-2*rad
        for jj = 1:n-2*rad
            histLBP( vecLBPMap( MatLBP(ii, jj)+1 ) ) = histLBP( vecLBPMap( MatLBP(ii, jj)+1 ) ) + 1;
        end
    end
    

    getLBPHist.m

    function histLBP = getLBPHist(I, r, c, nMB)
    % 取得I的分区 LBP 直方图
    %
    % 输入:r,c --- 了分区的数目,r*c个分区
    %       nMB --- MB-LBP 中块的大小
    %
    % 返回值:histLBP ---  连接 I 的各个分块的LBP直方图而形成的代表 I 的LBP复合特征向量
    
    [m n] = size(I);
    
    % 计算分区的大小
    mPartitionSize = floor(m / r);
    nPartitionSize = floor(n / c);
    
    for ii = 1:r-1
        for jj = 1:c-1
            Sub = I( (ii-1)*mPartitionSize+1:ii*mPartitionSize, (jj-1)*nPartitionSize+1:jj*nPartitionSize );
    %        hist{ii}{jj} = getMBLBPFea( Sub, nMB );
            hist{ii}{jj} = getMBLBPFea_33( Sub, nMB );
        end
    end
    
    
    % 处理最后一行和最后一列
    clear Sub
    for ii = 1:r-1
        Sub = I( (ii-1)*mPartitionSize+1:ii*mPartitionSize, (c-1)*nPartitionSize+1:n );
    %    hist{ii}{c} = getMBLBPFea(Sub, nMB);
        hist{ii}{c} = getMBLBPFea_33( Sub, nMB );
    end
    clear Sub
    
    for jj = 1:c-1
        Sub = I( (r-1)*mPartitionSize+1:m, (jj-1)*nPartitionSize+1:jj*nPartitionSize );
    %    hist{r}{jj} = getMBLBPFea(Sub, nMB);
        hist{r}{jj} = getMBLBPFea_33( Sub, nMB );
    end
    clear Sub
    
    Sub = I((r-1)*mPartitionSize+1:m, (c-1)*nPartitionSize+1:n);
    %hist{r}{c} = getMBLBPFea(Sub, nMB);
    hist{r}{c} = getMBLBPFea_33( Sub, nMB );
    
    
    % 连接各个分块的LBP直方图形成复合特征向量
    histLBP = zeros(1, 0);
    for ii = 1:r
        for jj = 1:c
            histLBP = [histLBP hist{ii}{jj}];
        end
    end
    


    makeLBPMap.m

    function vecLBPMap = makeLBPMap
    % 生成(8,2)临域uniform LBP直方图的映射关系,即将256个灰度值映射到59个收集箱中,
    % 所有的非 uniform 放入一个收集箱中
    
    vecLBPMap = zeros(1, 256); %初始化映射表
    
    bits = zeros(1, 8); %8位二进模式串
    
    nCurBin = 1;
    
    for ii = 0:255
        num = ii;
        
        nCnt = 0;
        
        % 获得灰度num的二进制表示bits
        while (num)
            bits(8-nCnt) = mod(num, 2);
            num = floor( num / 2 );
            nCnt = nCnt + 1;
        end
        
        if IsUniform(bits) % 判断bits是不是uniform模式
            vecLBPMap(ii+1) = nCurBin;% 每个uniform模式分配一个收集箱
            nCurBin = nCurBin + 1;
        else
            vecLBPMap(ii+1) = 59;%所有非uniform模式都放入第59号收集箱        
        end
        
    end
    
    % 保存映射表
    save('Mat/LBPMap.mat', 'vecLBPMap');
    
    
    
    
    
    function bUni = IsUniform(bits)
    % 判断某一个位串模式 bits 是否是 uniform 模式
    %
    % 输入:bits --- 二进制LBP模式串
    %
    % 返回值:bUni --- =1,if bits 是uniform模式串;=2,if bits 不是uniform模式串
    
    n = length(bits);
    
    nJmp = 0; % 位跳变数(0->1 or 1->0)
    for ii = 1 : (n-1)
        if( bits(ii) ~= bits(ii+1) )
            nJmp = nJmp+1;
        end
    end
    if bits(n) ~= bits(1)
        nJmp = nJmp+1;
    end
    
    if nJmp > 2
        bUni = false;
    else
        bUni = true;
    end
    


    dist_LBPFea.m

    function distVec = dist_LBPFea(LBPFea1, LBPFea2)
    % compute the difference vector between 2 LBP features
    
    nLBPFea = 59;
    nLen = length(LBPFea1);
    
    nBlock = nLen / nLBPFea;
    
    distVec = zeros(1, nBlock);
    
    for iBlock = 1:nBlock
        % 计算对应块的分块 LBP 直方图距离
        distVec(iBlock) = dist_LBPHist( LBPFea1( (iBlock-1)*nLBPFea+1:iBlock*nLBPFea ), LBPFea2( (iBlock-1)*nLBPFea+1:iBlock*nLBPFea ) );
    end
    


    dist_LBPHist.m

    function dist = dist_LBPHist(hist1, hist2)
    % compute the Chi square statistic distance between 2 LBP histograms
    
    nLBPFea = 59; % nBin
    
    
    dist = 0;
    
    for iBin = 1:nLBPFea
        dist = dist + (hist1(iBin) - hist2(iBin))^2 / (hist1(iBin)+hist2(iBin)+eps);
    %    id dist
    end
    



    版权声明:

  • 相关阅读:
    IntelliJ IDEA 常用快捷键
    IntelliJ IDEA 高效率配置
    Eclipse 设置保存代码时自动格式化
    SQL Server 事务隔离级别详解
    网络安全,互联网金融,高并发
    net user命令集合详解
    SQL不同服务器数据库之间的数据操作整理(完整版)
    sql优化
    在 Windows 上遇到非常多 TIME_WAIT 連線時應如何處理
    mvc和iis工作原理
  • 原文地址:https://www.cnblogs.com/walccott/p/4957051.html
Copyright © 2020-2023  润新知