C++ OpenCV直方图均衡化

直方图定义

图像直方图由于其计算代价较小,且具有图像平移、旋转、缩放不变性等众多优点,广泛地应用于图像处理的各个领域,特别是灰度图像的阈值分割、基于颜色的图像检索以及图像分类。

数码时代,直方图可以说是无处不在。无论是相机的显示屏,还是后期PS、ACR里的窗口,甚至色阶、曲线的工具之中,都可以看到直方图的身影。

要理解直方图,绕不开“亮度”这个概念。人们把照片的亮度分为0到255共256个数值,数值越大,代表的亮度越高。其中0代表纯黑色的最暗区域,255表示最亮的纯白色,而中间的数字就是不同亮度的灰色。人们还进一步把这些亮度分为了5个区域,分别是黑色,阴影,中间调,高光和白色。

如果一副图像的像素占有很多的灰度级而且分布均匀,那么这样的图像往往有高对比度和多变的灰度色调。直方图均衡化就是一种能仅靠输入图像直方图信息自动达到这种效果的变换函数。它的基本思想是对图像中像素个数多的灰度级进行展宽,而对图像中像素个数少的灰度进行压缩,从而扩展像元取值的动态范围,提高了对比度和灰度色调的变化,使图像更加清晰。

C++ OpenCV直方图均衡化_第1张图片

C++ OpenCV直方图均衡化_第2张图片

基本思想

直方图均衡化处理的“中心思想”是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。直方图均衡化就是对图像进行非线性拉伸,重新分配图像像素值,使一定灰度范围内的像素数量大致相同。直方图均衡化就是把给定图像的直方图分布改变成“均匀”分布直方图分布。

直方图均衡化的基本思想是把原始图的直方图变换为均匀分布的形式,这样就增加了象素灰度值的动态范围从而可达到增强图像整体对比度的效果。

C++ OpenCV直方图均衡化_第3张图片

通过上一篇《C++ OpenCV图像的重映射》我们用到了remap这个函数,可以将图像灰度分布从一个分布映射到另一个分布,然后再得到映射后的像素值即可。

C++ OpenCV直方图均衡化_第4张图片

直方图均衡化API   cv::equalizeHist

C++ OpenCV直方图均衡化_第5张图片

代码演示

新建一个项目opencv-0020,配置属性(VS2017配置OpenCV通用属性),然后在源文件写入#include和main方法

C++ OpenCV直方图均衡化_第6张图片

C++ OpenCV直方图均衡化_第7张图片

直方图均衡化

代码非常简单

C++ OpenCV直方图均衡化_第8张图片

我们来看看显示效果

C++ OpenCV直方图均衡化_第9张图片

我们再换换别的图试一下效果

C++ OpenCV直方图均衡化_第10张图片


-END-

长按下方二维码关注

你可能感兴趣的:(opencv,计算机视觉,qt,slam,图像识别)