人脸图像的局部方向模式基本思想是图像每个相素点都有一个局部3×3 邻域像素灰度值,该相素处于邻域中心。将该局部与3×3 邻域的灰度值与8 个Kirsch 模板卷积得到相应方向的边缘梯度值 (i=0,1,…,7),将边缘梯度值的绝对值 进行排序,求出第k大的值 并将大于等于 的 对应的第i位二进制数设置为1,剩余8-i位置为0,得到一个八位的二进制编码,然后根据不同位置进行加权求和,所得的十进制数即为该像素点的 LDP 特征值。八个方向的 Kirsch 模板(M0~M7)如图 1 所示,LDP 特征提取流程如图 2 所示。
源码如下:
完整的Qt工程下载:http://download.youkuaiyun.com/detail/j_d_c/9328865
main.cpp
#include"ldp.h"
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc,char *argv[])
{
int R=1;
Mat grayImg,ldpImg;
Mat pImg = imread("F:/MyQt/Gaussian/1.bmp",1);
grayImg.create(pImg.rows,pImg.cols,CV_8UC1);
cvtColor(pImg,grayImg,CV_RGB2GRAY);//转换成灰度图像
imshow("oringe",pImg);
LDP ldp;
ldp.ldppattern(grayImg,ldpImg,R);
namedWindow("ldpImg",WINDOW_AUTOSIZE);
imshow("ldpImg",ldpImg);
waitKey(0);
}
ldp.cpp
#include "ldp.h"
#include <qDebug>
#include <iostream>
#include <vector>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
using namespace cv;
using namespace std;
typedef struct
{
int