失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > opencv中 equalizeHist()均衡化直方图

opencv中 equalizeHist()均衡化直方图

时间:2020-10-04 02:15:08

相关推荐

opencv中 equalizeHist()均衡化直方图

1、EqualizeHist函数

函数作用:

直方图均衡化,,用于提高图像的质量

2、EqualizeHist函数调用形式

C++:voidequalizeHist(InputArray src, OutputArray dst)

#include <opencv2/imgproc/imgproc.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>#include <stdio.h>using namespace cv;using namespace std;int main(){Mat src = imread("C://1.bmp", 1);cvtColor(src, src, CV_BGR2GRAY);Mat dst;equalizeHist(src, dst);imshow("TEST", dst);waitKey(0);return 0;}

直方图均衡化

目标

在这个教程中你将学到:

什么是图像的直方图和为什么图像的直方图很有用 用OpenCV函数 equalizeHist 对图像进行直方图均衡化

原理

图像的直方图是什么?

直方图是图像中像素强度分布的图形表达方式. 它统计了每一个强度值所具有的像素个数.

直方图均衡化是什么?

直方图均衡化是通过拉伸像素强度分布范围来增强图像对比度的一种方法. 说得更清楚一些, 以上面的直方图为例, 你可以看到像素主要集中在中间的一些强度值上. 直方图均衡化要做的就是拉伸这个范围. 见下面左图: 绿圈圈出了少有像素分布其上的强度值. 对其应用均衡化后, 得到了中间图所示的直方图. 均衡化的图像见下面右图.

直方图均衡化是怎样做到的?

均衡化指的是把一个分布 (给定的直方图)映射到另一个分布 (一个更宽更统一的强度值分布), 所以强度值分布会在整个范围内展开.

要想实现均衡化的效果, 映射函数应该是一个累积分布函数 (cdf)(更多细节, 参考*学习OpenCV*). 对于直方图 , 它的累积分布是:

要使用其作为映射函数, 我们必须对最大值为255 (或者用图像的最大强度值) 的累积分布 进行归一化. 同上例, 累积分布函数为:

最后, 我们使用一个简单的映射过程来获得均衡化后像素的强度值:

例程

咋个例程是用来干嘛的?

加载源图像 把源图像转为灰度图 使用OpenCV函数 EqualizeHist 对直方图均衡化 在窗体中显示源图像和均衡化后图像.

下载例程: 点击 这里

例程一瞥:

#include "opencv2/highgui/highgui.hpp"#include "opencv2/imgproc/imgproc.hpp"#include <iostream>#include <stdio.h>using namespace cv;using namespace std;int main( int argc, char** argv ){Mat src, dst;char* source_window = "Source image";char* equalized_window = "Equalized Image";/// 加载源图像src = imread( "C://1.bmp", 1 );if( !src.data ){ cout<<"Usage: ./Histogram_Demo <path_to_image>"<<endl;return -1;}/// 转为灰度图cvtColor( src, src, CV_BGR2GRAY );/// 应用直方图均衡化equalizeHist( src, dst );/// 显示结果namedWindow( source_window, CV_WINDOW_AUTOSIZE );namedWindow( equalized_window, CV_WINDOW_AUTOSIZE );imshow( source_window, src );imshow( equalized_window, dst );/// 等待用户按键退出程序waitKey(0);return 0;}

结果

为了更好地观察直方图均衡化的效果, 我们使用一张对比度不强的图片作为源图像输入, 如下图:

它的直方图为:

注意到像素大多集中在直方图中间的强度上.

使用例程进行均衡化后, 我们得到下面的结果:

这幅图片显然对比度更强. 再验证一下均衡化后图片的直方图:

注意到现在像素在整个强度范围内均衡分布.

虹膜图像测试:

原图像:

equalizeHist均衡化直方图后:图像有些地方增强了。

如果觉得《opencv中 equalizeHist()均衡化直方图》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。