直方图均衡
#include <opencv2corecore.hpp> #include <opencv2highguihighgui.hpp> #include <opencv2imgprocimgproc.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; }