C++ VS2010
Opencv 2.4.9
参考自:https://blog.csdn.net/u013263891/article/details/82987417
参考自:https://www.cnblogs.com/brucemu/archive/2013/10/17/3374558.html
直方图均衡
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void main()
{
//以灰度图读取图片 使其通道为1
Mat img = imread("Fig0316(4)(bottom_left).tif",0);
int gray[256]={
0};//记录灰度级别下的像素个数
int mn;//像素总数
double r_prob[256]={
0};//输入图像的概率
double pdf[256]={
0};//累积概率密度
double r[256]={
0};//r与s的映射
double s_prob[256]={
0};//均衡化之后的概率
Mat img_temp = img.clone();
//得出每个灰度级下像素个数
for(int i = 0;i<img.rows;i++)
{
for(int j = 0;j<img.cols;j++)
{
int gray_value = img.at<uchar>(i,j);
gray[gray_value]++;
}
}
//得出每个灰度级概率分布
mn = img.rows*img.cols;
for(int i = 0;i<256;i++)
{
r_prob[i] = ((double)gray[i])/mn;
}
//得出每个灰度级概率密度函数
pdf[0] = r_prob[0];
for(int i = 1;i<256;i++)
{
pdf[i] = pdf[i-1] + r_prob[i];
}
//计算直方图均衡映射的各个灰度级个数
for(int i = 0;i<256;i++){
r[i] = (int)cvRound(255*pdf[i]);
}
//重新绘制图片 根据上述的灰度值均衡的结果
for(int i = 0;i<img.rows;i++)
{
for(int j = 0;j<img.cols;j++)
{
int gray_value = img.at<uchar>(i,j);
img_temp.at<uchar>(i,j) = r[gray_value];
}
}
imshow("原图像",img);
imshow("Mine_code",img_temp);
//直方图显示
int bins=256;
int hist_size[]={
bins};
float range[]={
0,256};
const float* ranges[]={
range};
cv::Mat histsrc,histdst;
int channels[]={
0};
/*
const Mat* images:输入图像
int nimages:输入图像的个数
const int* channels:需要统计直方图的第几通道
InputArray mask:掩膜,,计算掩膜内的直方图 ...Mat()
OutputArray hist:输出的直方图数组
int dims:需要统计直方图通道的个数
const int* histSize:指的是直方图分成多少个区间,就是 bin的个数
const float** ranges: 统计像素值得区间
bool uniform=true::是否对得到的直方图数组进行归一化处理
bool accumulate=false:在多个图像时,是否累计计算像素值得个数
*/
calcHist(&img,1,channels,Mat(),histsrc,1,hist_size,ranges,true,false);
calcHist(&img_temp,1,channels,Mat(),histdst,1,hist_size,ranges);
cout<<histsrc.size()<<endl;
int scale=1;
Mat srcImage(256*scale,256,CV_8U,cv::Scalar(0));
Mat dstImage(256*scale,256,CV_8U,cv::Scalar(0</