1,均衡化原理
直方图均衡化的基本原理是:
直方图均衡化是一种简单有效的图像增强技术。根据直方图的形态可以判断图像的质量,通过调控直方图的形态可以改善图像的质量。
直方图均衡化是将原始图像通过函数变换,调控图像的灰度分布,得到直方图分布合理的新图像,以此来调节图像亮度、增强动态范围偏小的图像的对比度。
由于人眼视觉特性,直方图均匀分布的图像视觉效果较好。直方图均衡化的基本思想是对图像中占比大的灰度级进行展宽,而对占比小的灰度级进行压缩,使图像的直方图分布较为均匀,扩大灰度值差别的动态范围,从而增强图像整体的对比度。
因此,直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,本质上是根据直方图对图像进行线性或非线性灰度变换。
例如,直方图均衡化可以把原始图像的直方图调整到均匀分布,增加像素之间灰度值差别的动态范围,从而增强图像整体的对比度。
(1)计算原始灰度图像的直方图;
(2)通过直方图累加计算原始图像的累计分布函数 CDF;
(3)基于累计分布函数 CDF,通过插值计算得到新的灰度值。
OpenCV 提供了函数 cv2. equalizeHist 可以实现直方图均衡化。
函数说明:
CV_EXPORTS_W void equalizeHist( InputArray src, OutputArray dst );
参数说明:
src:输入图像
返回值 dst:输出图像,直方图均衡化
PS: 此API只接受灰度图
2,代码示例:
图像均衡化处理并进行直方图统计显示:首先读取RGB彩色三通道图,然后通过cvtColor进行彩色图转灰度图,然后对灰度图进行均衡化,通过直方图可以看到灰度图gray和均衡化后的灰度图dst的差别
Mat src = imread("F:/code/images/aero1.jpg");
if (src.empty()) {
printf("fail to read");
return -1;
}
namedWindow("input", WINDOW_AUTOSIZE);
imshow("input", src);
//直方图均衡化
Mat gray, dst;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow("gray", gray);
equalizeHist(gray, dst);//只能接受灰度图
imshow("eh-demo", dst);
//直方图计算
//设定像素取值范围
int histSize = 256;
float range[] = { 0,255 };
const float* histRanges = { range };
Mat gray_hist, dst_hist;
calcHist(&gray, 1, 0, Mat(), gray_hist, 1, &histSize, &histRanges, true, false);
calcHist(&dst, 1, 0, Mat(), dst_hist, 1, &histSize, &histRanges, true, false);
//创建直方图画布并归一化处理
Mat histImage = Mat::zeros(Size(600, 400), CV_8UC3);
int margin = 50;
int nm = histImage.rows - 2 * margin;
float bh = (float)(histImage.cols - 2 * margin) / (float)histSize;
normalize(gray_hist, gray_hist, 0, nm, NORM_MINMAX, -1, Mat());//使用最小值和最大值进行归一化处理,最小值是0,最大值是nm
normalize(dst_hist, dst_hist, 0, nm, NORM_MINMAX, -1, Mat());
//绘制前后两个统计点
for (int i = 0; i < histSize - 1; i++) {
line(histImage, Point(i * bh + margin, nm - gray_hist.at<float>(i) + margin),
Point((i + 2) * bh + margin, nm - gray_hist.at<float>(i + 1) + margin), Scalar(255, 0, 0), 1, LINE_AA);
line(histImage, Point(i * bh + margin, nm - dst_hist.at<float>(i) + margin),
Point((i + 2) * bh + margin, nm - dst_hist.at<float>(i + 1) + margin), Scalar(0, 255, 0), 1, LINE_AA);
}
imshow("histImage", histImage);
你的鼓励将是我创作的最大动力