直方图均衡
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
/*
有的版本号CV_BGR2GRAY宏定义没有,须要载入个legacy文件来获取,可是会与其它调用的宏定义出现冲突,所以
这里单独定义一个彩色图像到灰度图像的case number
*/
#define CV_BGR2GRAY 6
#include <iostream>
using namespace std;
using namespace cv; Mat HistogramEquivalent(Mat,int); int main(){
Mat img = imread("lenna.jpg");
imshow("HistogramEqiovalent",HistogramEquivalent(img,256));
waitKey(100000000);
} /**
方法:直方图均衡
作用:增强图像的对照度,使图像更加清楚,即图像增强的一种方法
參数:img表示源图像,scalar表示的是最大灰度级(为2时表示二值图像)
*/
Mat HistogramEquivalent(Mat img,int scalar){ //把图像变成灰度图像
if(img.channels()!=1)
cvtColor(img,img,CV_BGR2GRAY);
//创建个与源图像一样的空图像
Mat newImage=Mat(img.rows,img.cols,img.type());
//获取图像的行和列
int width = img.cols , height = img.rows;
int count[256]={0};
double prob[256] = {0};
int maxPixel = 0,minPixel =scalar-1; for(size_t i = 0;i<height;i++)
for(size_t j=0;j<width;j++){
int currPixel = img.at<uchar>(i,j);
count[currPixel]++; //统计每一个灰度级有多少个点
//统计该图像中最大和最小的像素值
if(currPixel>maxPixel)
maxPixel = currPixel;
else if(currPixel<minPixel)
minPixel = currPixel;
} //计算每一个灰度级出现的概率,为获取double型的数据,在后面乘个小数1.0进行隐式转换
for(size_t num = 0;num<scalar;num++)
prob[num] = count[num]*1.0/(height*width);
//计算累积数组
for(size_t i = 1;i<scalar;i++)
prob[i] += prob[i-1];
for(size_t i=0;i<height;i++)
for(size_t j=0;j<width;j++)
newImage.at<uchar>(i,j) = prob[img.at<uchar>(i,j)]*(maxPixel-minPixel)+minPixel;
return newImage;
}