原理:设灰度为r的像素个数为,则该像素占的概率,将其进行某种映射得到s=T(r),使得 = 1/(L-1),即映射后的像素服从均匀密度函数,有较高的对比度;
s的概率密度函数可由下式得到:;
由 = 1/(L-1), 得 = (L-1)*,故s = (L-1),所以到直方图均衡化的像素映射公式,这里是假设像素服从连续的概率分布,如果是离散的,则有。
API函数:equalizeHist(src, dst);
参数解释:原图像,目标图像
#include<opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int arc, char** argv)
{
Mat src,b, g, r, b_dst, g_dst, r_dst;
src = imread("2.jpg");
namedWindow("input",CV_WINDOW_AUTOSIZE);
imshow("input", src);
//拆分三通道
vector<Mat>channels;
split(src, channels);
b = channels[0];
g = channels[1];
r = channels[2];
//三通道分别直方图均衡化
equalizeHist(b, b_dst);
equalizeHist(g, g_dst);
equalizeHist(r, r_dst);
//合并均衡化后的三通道
Mat dst = Mat::zeros(src.size(), src.type());
vector<Mat>M;
split(dst, M);
M[0] = b_dst;
M[1] = g_dst;
M[2] = r_dst;
merge(M, dst);
imshow("output", dst);
waitKey(0);
return 0;
}
运行结果如下: