今天学习了直方图均衡化(histogram equalization)的方法,用于增强图像的对比度,就是把灰度直方图中在某个比较集中的灰度区间上的像素点更加均衡地重新分配到全部灰度区间上的方法。实质上就是建立一个映射,一个单调的像素亮度变换q=T(p),将输入直方图H(p)转换为输出直方图G(q)。具体的算法很多地方都可以找到,这里就不赘述了。按照我自己的通俗理解,就是把像素比较集中的灰度区间拉伸,使它们直接的灰度差变大,这样就更加容易区分,从而增加了对比度。当然,这么做一方面可以加大前景和背景的差别,但同时也可能放大噪声,它是一种无差别的变换。
在OpenCV中可以用equallizeHist函数实现图像的直方图均衡化,但它只能对灰度图像进行均衡化,如果要对彩色图像使用,可以用split函数先将图像三个通道分开分别均衡化,再用merge进行合并。彩色图像的直方图均衡化实现代码如下:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat src=imread("1.jpg");
vector<Mat> rgb_plane, rgb_equ(3);
split(src, rgb_plane); //拆分成三个通道
equalizeHist(rgb_plane[0], rgb_equ[0]);
equalizeHist(rgb_plane[1], rgb_equ[1]);
equalizeHist(rgb_plane[2], rgb_equ[2]);
merge(rgb_equ, src); //合并三个通道
imshow("merge", src);
waitKey();
return 0;
}