一、图像直方图Histogram
图像直方图,是指对整个图像像在灰度范围内的像素值(0~255)统计出现频率次数,据此生成的直方图,称为图像直方图-直方图。直方图反映了图像灰度的分布情况,是图像的统计学特征。
二、直方图均衡化
-
直方图均衡化是一种提高图像对比度的方法,拉伸图像灰度值范围,让图像更均衡。对于图像的特征提取是非常有用的
-
直方图均衡化是通过使用累积函数对灰度值进行“调整”以实现对比度的增强,其中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。也就是把一个分布(给定的直方图)映射到另一个分布(一个更宽更统一的强度值分布),所以强度值分布会在整个范围内展开,要实现均衡化的效果,映射函数应该是一个累积分布函数(cdf)。对于直方图H(i),它的累积分布H’(i)是:
要使用其作为映射函数,我们必须对最大值为255(或者用图像的最大强度值)的累积分布H’(i)进行归一化,同上,累积分布函数为:
最后,使用一个简单的映射过程来获得均衡化后像素的强度值:
图像直方图均衡化的实质是近似均匀分布,均衡化图像的动态范围扩大了,但其被值扩大了量化间隔,而量化级别反而减少了,原来灰度不同的像素经处理后可能变得相同,这样就形成了一片相同灰度的区域,各区域之间有明显的边界,造成对比度提高的视觉效果。如果原始图像对比度本来就很高,这再均衡化会降低图像对比度。
三、equalizeHist
void cv::equalizeHist ( InputArray src,
OutputArray dst
)
- src:8-bit单通道 输入图像
- dst: 目标图像,与原图像有相同的尺寸和类型
equalizeHist()函数实现的图像直方图均衡化算法就是把直方图的每个灰度级进行归一化处理,求每种灰度的累积分布,得到一个映射的灰度映射表,然后根据相应的灰度值来修正原图中的每个像素的像素值。
四、示例
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;
int main(int argc, char** argv)
{
Mat src, dst;
//1. 读取图像
src = imread("images/02.png");
if (src.empty()) {
cout << "Usage: ./Histogram_Demo <path_to_image>" << endl;
return -1;
}
// 2. 将其转换为灰度:
cvtColor(src, src, COLOR_BGR2GRAY);
// 3. 使用函数cv :: equalizeHist应用直方图均衡
equalizeHist(src, dst);
// 4. 显示两个图像(原始图像和均衡图像):
imshow("Source image", src);
imshow("Equalized Image", dst);
waitKey(0);
return 0;
}