上一节我们提到可以使用拉伸直方图的方法,使图像中包含所有的灰度级,来改善图片的质量。但是有的时候,图像的视觉缺陷不是由于图像的所占用的灰度级数少儿导致的。而是一些图像中的一些灰度级出现太频繁,例如有时候中间灰度级出现太频繁,而偏黑色或者偏白色的灰度级太少,导致了颜色失衡等等。这样我们就会得出结论,一个视觉效果好的图片,应当所有灰度级数所占有的像素数基本都是相同的。对于图片做这种处理就叫做直方图均衡化,也就是使直方图尽可能的平坦。
OpenCV中含有这个功能的函数是cv::equalizeHist:
cv::Mat equalize(const cv::Mat &image) {
cv::Mat result;
cv::equalizeHist(image,result);
return result;
}
可以再做一下比较,还是lena图:
下面让我们详细解释一下直方图均衡化。如果比较极端的话,最均匀的直方图就是直方图是平的,每一个坐标点的像素数都是相同的。也就是说,有50%的像素值小于128,25%小于64,以此类推。也就是说P%的像素值要小于255*P%。那么查找表可以如下定义:
lookup.at<uchar>(i)= static_cast<uchar>(255.0*p[i]);
这里的p[i]是什么呢,是像素值小于i的所有像素所占的比例。也就是累积直方图中所用到的累积比例。一般情况下,均衡化直方图可以改善图像的视觉效果,但是不是绝对的。