LBP特征提取算法的提取与实现
2015-12-25 08:42
591 查看
LBP的基本思想是对图像的像素和它周围8个像素进行比较,然后求和。如果中心像素的亮度大于等于他的相邻像素,把他标记为1,否则标记为0。最终可以获取2^8个可能的组合,称为局部二值模式或LBP码。
这样做的原理:因为对于一张图片,相邻像素之间的的值是有关系的。因此中心点和相邻像素比较后就能得到一个二进制串,这个二进制串就能很好的表示这个点和相邻像素之间的模式,这个模式就是这个二进制串。这种描述方法就可以很好的捕捉到图像中的细节。
这样做的原理:因为对于一张图片,相邻像素之间的的值是有关系的。因此中心点和相邻像素比较后就能得到一个二进制串,这个二进制串就能很好的表示这个点和相邻像素之间的模式,这个模式就是这个二进制串。这种描述方法就可以很好的捕捉到图像中的细节。
#include"imgProcess.h" int main() { IplImage* color_face = cvLoadImage("D://test.png",1); IplImage* gray_face = cvCreateImage(cvSize(color_face->width, color_face->height), color_face->depth, 1); cvCvtColor(color_face, gray_face, CV_BGR2GRAY); IplImage* LBP_face = cvCreateImage(cvSize(color_face->width, color_face->height), color_face->depth, 1);//先分配图像空间 cvNamedWindow("Color Image", 1); cvShowImage("Color Image", color_face); cvNamedWindow("Gray Image", 1); cvShowImage("Gray Image", gray_face); ImgProcess imgp; imgp.src_LBP(gray_face, LBP_face); cvNamedWindow("LBP Image", CV_WINDOW_AUTOSIZE); cvShowImage("LBP Image", LBP_face); waitKey(); cvReleaseImage(&color_face); cvReleaseImage(&gray_face); cvReleaseImage(&LBP_face); cvDestroyWindow("Color Image"); cvDestroyWindow("Gray Image"); cvDestroyWindow("LBP Image"); return 0; } imgProcess.h #include <opencv2/opencv.hpp> #include <cv.h> #include <highgui.h> #include <cxcore.h> using namespace std; using namespace cv; class ImgProcess{ public: int tmp[8]; IplImage *temp; ImgProcess(){}; ~ImgProcess(){}; void src_LBP(IplImage *src, IplImage *dst); }; imgProcess.cpp #include "imgProcess.h" void ImgProcess::src_LBP(IplImage *src, IplImage *dst){ CvScalar s; temp = cvCreateImage(cvGetSize(src), IPL_DEPTH_8U, 1); uchar *data = (uchar*)src->imageData; int step = src->widthStep; tmp[8] = { 0 }; cout << "step" << step << endl; for (int i = 1; i<src->height - 1; i++) for (int j = 1; j<src->width - 1; j++) { int sum = 0; if (data[(i - 1)*step + j - 1]>data[i*step + j]) tmp[0] = 1; else tmp[0] = 0; if (data[i*step + (j - 1)]>data[i*step + j]) tmp[1] = 1; else tmp[1] = 0; if (data[(i + 1)*step + (j - 1)]>data[i*step + j]) tmp[2] = 1; else tmp[2] = 0; if (data[(i + 1)*step + j]>data[i*step + j]) tmp[3] = 1; else tmp[3] = 0; if (data[(i + 1)*step + (j + 1)]>data[i*step + j]) tmp[4] = 1; else tmp[4] = 0; if (data[i*step + (j + 1)]>data[i*step + j]) tmp[5] = 1; else tmp[5] = 0; if (data[(i - 1)*step + (j + 1)]>data[i*step + j]) tmp[6] = 1; else tmp[6] = 0; if (data[(i - 1)*step + j]>data[i*step + j]) tmp[7] = 1; else tmp[7] = 0; //计算LBP编码 s.val[0] = (tmp[0] * 1 + tmp[1] * 2 + tmp[2] * 4 + tmp[3] * 8 + tmp[4] * 16 + tmp[5] * 32 + tmp[6] * 64 + tmp[7] * 128); cvSet2D(dst, i, j, s); //写入LBP图像 } }
相关文章推荐
- 运算符
- 昨天晚上画了个带apple的图:ide插件与php和xdebug通信原理图,周末写1个调试器。
- Sql语句备份恢复数据库
- unity+高通vuforia开发增强现实(AR)教程
- OpenTSDB研究---安装过程
- 【Android开发经验】来,咱们自己写一个Android的IOC框架!
- evnetlet hub
- 手机日期插件mobiscroll奇巧淫技&mobiscroll 中文API
- DB
- 杭电ACM1028(母函数)
- 不用asp.net MVC,用WebForm照样可以实现MVC
- LeetCode-14-Longest Common Prefix(Number/Vector/String)-Easy
- PHP邮件发送类
- maven基础
- SQLServer中char、varchar、nchar、nvarchar的区别:
- IOS学习笔记之UISearchBar
- 文本格式ANSI,Unicode等有什么区别
- c语言项目总结
- 如何获取有价值的用户反馈?
- Windows系统下一些操作技巧