索引地址:系列索引
灰度直方图均衡化
大多数自然图像,其灰度分布集中在较窄的区间,引起图像细节不够清晰,采用直方图修正后可使图像的灰度间距拉开或使灰度分布均匀,从而增大反差,使图像细节清晰,达到增强的目的。例如一幅过曝光的图片,其灰度级都集中在高亮度范围内,而曝光不足的图片,其灰度集中在低亮度范围内,具有这样直方图的图片其可视效果比较差。
直方图均衡化方法的基本思想是,对在图像中像素个数多的灰度级进行展宽,而对像素个数少的灰度级进行缩减。从而达到清晰图像的目的,增强图像的整体对比度。
其基本处理思路是,把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。即在每个灰度级上都具有相同像素点数的过程。
直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法.
说得更清楚一些, 对于一些直方图来说, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是 拉伸 这个范围. 见下面左图: 绿圈圈出了 少有像素分布其上的 强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.
测试代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" using namespace cv;
int main() { Mat srcImage, dstImage; srcImage = imread("1.jpg", 1); if (!srcImage.data) { printf("读取图片错误,请确定目录下是否有imread函数指定图片存在~! \n"); return false; }
cvtColor(srcImage, srcImage, COLOR_BGR2GRAY); imshow("Original", srcImage);
equalizeHist(srcImage, dstImage);
imshow("Result", dstImage);
waitKey(0); return 0; }
|
测试结果:
彩色直方图均衡化
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
|
#include <opencv2/opencv.hpp> int main() { cv::Mat srcImage = cv::imread("..\\images\\flower3.jpg"); if (!srcImage.data) return 1; cv::Mat colorHeqImage; std::vector<cv::Mat> BGR_plane; cv::split(srcImage, BGR_plane); for (int i = 0; i < BGR_plane.size(); i++) cv::equalizeHist(BGR_plane[ i ], BGR_plane[ i ]); cv::merge(BGR_plane, colorHeqImage); cv::imshow("srcImage", srcImage); cv::imshow("colorHeqImage", colorHeqImage); cv::waitKey(0); return 0; }
|
效果为