原理见《数字图像处理》第三版3.3.2
下面直接上源码(VS2013+OpenCV3.0)
/*
//***************************************************************************************************************************************
//-----------------------------------------------作者:我三食堂不服-------------------------------------------------------------------
//***************************************************************************************************************************************
*/
#include <opencv2/opencv.hpp>
#include <math.h>
#include <vector>
using namespace std;
using namespace cv;
//计算直方图
int CalHist(const Mat &input, vector<long> &histogram);
//绘制直方图,dep - 位深度
Mat DrawHist(const vector<long> &hist);
//获取最大值
template<class T> T Max(const vector<T> &inputArray);
//直方图规定化,z - 规定的各灰度值的概率
int MatchHist(const Mat &input, double *z, Mat &out);
int main(int argc, char** argv)
{
Mat im_source1; //原图
Mat im_pro1; //处理后的图片
Mat im_Hist1; //灰度直方图
vector<long> histogram1; //灰度直方图数据
double *z; //规定的直方图概率分布
z = new double[256]{};
//输入概率分布规定
for (int i = 0; i < 5; i++)
z[i] = i * 7 / 4;
for (int i = 5; i < 21; i++)
z