1、求原图的灰度直方图

2、求原图的灰度分布概率

3、计算图像各个灰度值的累计分布概率

4、直方图均衡化,得到处理后的像素值

附录:
均衡化原图的灰度分布概率

均衡化原图的灰度累计分布概率

源码
#include <iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
void hist(uchar data[],int width,int height,float hf[])
{
int len=width*height;
for(int i=0;i<len;i++)
hf[data[i]]++;
}
void print(float x[],int len)
{
for(int i=0;i<len;i++)
cout<<x[i]<<" \t";
cout<<"\n";
}
int main()
{
Mat image=imread("gudian.jpg",IMREAD_GRAYSCALE);
imshow("gudian.jpg",image);
if(image.data==0) return -1;
cout<<image.channels();
int width,height;
float h[256]={0};
uchar *data=image.data;
width=image.cols;
height=image.rows;
hist(data,width,height,h);
cout<<"---------------------\t--------------------输出累计灰度数----------------------\t---------------------------------------\n";
print(h,256);
int NF=width*height;
float pf[256];
for(int i=0;i<256;i++)
pf[i]=h[i]/NF;
cout<<"---------------------\t--------------------输出灰度分布概率----------------------\t--------------------------------------\n";
print(pf,256);
float pa[256]={0};
pa[0]=pf[0];
for(int i=1;i<256;i++)
pa[i]=pa[i-1]+pf[i];
pa[0]=0;
cout<<"---------------------\t--------------------输出灰度累计分布概率-----------------------\t--------------------------------------\n";
print(pa,256);
for(int i=1;i<256;i++)
pa[i]*=255;
cout<<"---------------------\t--------------------输出灰度累计分布概率*255-----------------------\t--------------------------------------\n";
print(pa,256);
for(int i=1;i<NF;i++) data[i]=pa[data[i]]+0.5;
imshow("",image);
waitKey(0);
cout<<"---------------------\t--------------------输出均衡化后图片像素值----------------------\t--------------------------------------\n";
for(int i=0;i< height;i++)
{
for(int j=0;j<width;j++)
{
cout<<(int)data[i*width+j]<<" ";
}
cout << "\n"<<endl;
}
imwrite("b.bmp",image);
return 0;
}