图像预处理~对左右部分分别直方图均衡化

来源:互联网 发布:市场份额数据 编辑:程序博客网 时间:2024/05/19 22:25

一般的直方图均衡化对于光照的处理难免会有些瑕疵,这里介绍一种改进的直方图均衡化方法:对图像左右部分分别直方图均衡化。

说明:以下的程序是关于我自己的项目:人脸识别 做的,分别对左右两部分脸进行直方图均衡化,最后,由于直方图均衡化会带来很多噪声,所以使用了双边滤波。


#include <iostream>#include <vector>#include "opencv2/opencv.hpp"#include <list>#include<math.h>#include <opencv2/highgui/highgui_c.h>using namespace cv;using namespace std;Mat double_equ(Mat faceImg){int w = faceImg.cols;int h = faceImg.rows;Mat wholeFace;equalizeHist(faceImg, wholeFace);//整均衡化int midX = w / 2;Mat leftSide = faceImg(Rect(0, 0, midX, h));//左脸区域Mat rightSide = faceImg(Rect(midX, 0, w - midX, h));//右脸区域equalizeHist(leftSide, leftSide);//左均衡化equalizeHist(rightSide, rightSide);//右均衡化for (int y = 0; y<h; y++) {//y为rows行for (int x = 0; x<w; x++) {//x为cols列int v;if (x < w / 4) {// 左边25%,仅使用左脸v = leftSide.at<uchar>(y, x);//读取某个坐标处的像素值}else if (x < w * 2 / 4) {//中-左25% 混合左边脸和整个人脸 int lv = leftSide.at<uchar>(y, x);//左int wv = wholeFace.at<uchar>(y, x);//整个float f = (x - w * 1 / 4) / (float)(w / 4);//当前位置在该1/4空间中所占的比例v = cvRound((1.0f - f) * lv + (f)* wv);//左边脸和整个人脸在混合时所占的比例不一样,越靠近中心位置,在混合时左手边的脸所占的比例减小}else if (x < w * 3 / 4) {// Mid-right 25%: 混合右脸和整个脸int rv = rightSide.at<uchar>(y, x - midX);int wv = wholeFace.at<uchar>(y, x);// Blend more of the right-side face as it moves// further right along the face.float f = (x - w * 2 / 4) / (float)(w / 4);//x为列采用渐进混合v = cvRound((1.0f - f) * wv + (f)* rv);//左边脸和整个人脸在混合时所占的比例不一样,越靠近中心位置,在混合时右手边的脸所占的比例减小}else {// Right 25%: just use the right face.v = rightSide.at<uchar>(y, x - midX);}faceImg.at<uchar>(y, x) = v;}// end x loop}//end y loopMat filtered = Mat(faceImg.size(), CV_8U);bilateralFilter(faceImg, filtered, 0, 20.0, 2.0);//双边滤波return filtered;}


其它常见的图像预处理方法:

1、为了提高图像的亮度和对比度,可以将人脸区域的左右及整个人脸区域分别进行直方图均衡化处理,然后再按照一定的比例进行融合。

2、在图像中检测人脸时,可以先将较大的图像区域进行一定尺度的缩放,然后检测人脸,最后只将人脸区域按与原来相同的尺寸进行放大,注意不要超过图像的边框即可。



2 0
原创粉丝点击