opencv学习笔记十七:直方图均衡

原理:设灰度为r的像素个数为n_{r},则该像素占的概率p_{r} = n_{r}/M*N,将其进行某种映射得到s=T(r),使得p_{s} = 1/(L-1),即映射后的像素服从均匀密度函数,有较高的对比度;

s的概率密度函数可由下式得到:p_{s} = p_{r} * |d_{r}/d_{s}|

p_{s} = 1/(L-1), 得d_{s} = (L-1)*P_{r}d_{r},故s = (L-1)\int_{0}^{r}p_{w}dw,所以到直方图均衡化的像素映射公式,这里是假设像素服从连续的概率分布,如果是离散的,则有s_{k} = (L-1)* \sum _{j=0}^{k}p_{j}

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;
}

运行结果如下:

扫描二维码关注公众号,回复: 3096717 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82496422