理论
什么是图像直方图?
- 它是图像强度分布的图形表示。
- 它量化了考虑的每个强度值的像素数量。
什么是直方图均衡化?
- 这是一种改善图像对比度的方法,以扩大强度范围(另请参阅相应的维基百科条目)。
- 为了更清楚起见,从上图可以看出,像素似乎聚集在可用强度范围的中间。直方图均衡化的作用是扩展此范围。请看下图:绿色圆圈表示填充不足的强度。应用均衡化后,我们得到一个像中间图一样的直方图。结果图像显示在右图中。
它是如何工作的?
- 均衡意味着将一个分布(给定的直方图)映射到另一个分布(更广泛和更均匀的强度值分布),以便强度值分布在整个范围内。
-
为了实现均衡效果,重新映射应该是累积分布函数 (cdf)(更多详细信息,请参阅学习 OpenCV)。对于直方图赫(我),其累积分布 赫′(我)是:
赫′(我)=∑0≤杰<我赫(杰)
要将其用作重映射函数,我们必须规范化赫′(我)这样最大值就是 255(或者图像强度的最大值)。从上面的例子来看,累积函数是:
-
最后,我们使用一个简单的重映射程序来获得均衡图像的强度值:
埃问你一个升我是埃d(十,是)=赫′(sr丙(十,是))
代码
C++JavaPython
- 这个程序是做什么的?
- 加载图片
- 将原始图像转换为灰度图像
- 使用 OpenCV 函数cv::equalizeHist均衡直方图
- 在窗口中显示源图像和均衡后的图像。
- 可下载代码:点击此处
- 代码一览:
#include " opencv2/imgcodecs.hpp "#包括“ opencv2/highgui.hpp ”#include " opencv2/imgproc.hpp "#包括 <iostream>使用命名空间cv;使用命名空间std;int main(int argc,char ** argv){CommandLineParser解析器(argc,argv,“{@input | lena.jpg |输入图像}”);if ( 源文件为空() ){cout << "无法打开或找到图像!\n" << endl;cout << "用法:" << argv[0] << " <输入图像>" << endl;返回-1;}cvtColor(src,src,COLOR_BGR2GRAY);垫dst;均衡直方图(src,dst);imshow( "源图像" , src );imshow( "均衡图像" , dst );等待键();返回0;}
解释
C++JavaPython
-
加载源图像:
CommandLineParser解析器(argc,argv,“{@input | lena.jpg |输入图像}”);if ( 源文件为空() ){cout << "无法打开或找到图像!\n" << endl;cout << "用法:" << argv[0] << " <输入图像>" << endl;返回-1;} -
将其转换为灰度:
cvtColor(src,src,COLOR_BGR2GRAY); -
使用函数cv::equalizeHist应用直方图均衡化:
可以很容易地看出,唯一的参数是原始图像和输出(均衡)图像。
-
显示两幅图像(原始图像和均衡后图像):
-
等到用户退出程序
等待键();
结果
- 为了更好地理解均衡的结果,让我们引入一张对比度不大的图像,例如:
顺便说一下,它有这样的直方图:
请注意像素聚集在直方图的中心周围。
- 使用我们的程序进行均衡后,我们得到了以下结果:
这幅图像的对比度确实更高。查看其新的直方图,如下所示:
注意像素数量在强度范围内的分布情况。