码迷,mamicode.com
首页 > 其他好文 > 详细

OpenCV入门学习(三)HistogramEquivalent

时间:2015-08-10 22:11:24      阅读:183      评论:0      收藏:0      [点我收藏+]

标签:opencv

                                 直方图均衡


技术分享



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

版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenCV入门学习(三)HistogramEquivalent

标签:opencv

原文地址:http://blog.csdn.net/u012816621/article/details/47404999

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!