您的位置:首页 > 产品设计 > UI/UE

OpenCV入门学习(三)HistogramEquivalent

2015-08-10 21:09 363 查看
直方图均衡



#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: