OpenCV入门学习(三)HistogramEquivalent

                                 直方图均衡





#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;
}

posted @ 2017-05-08 13:19  yfceshi  阅读(309)  评论(0编辑  收藏  举报