gpt4 book ai didi

详解python OpenCV学习笔记之直方图均衡化

转载 作者:qq735679552 更新时间:2022-09-28 22:32:09 24 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章详解python OpenCV学习笔记之直方图均衡化由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

本文介绍了python OpenCV学习笔记之直方图均衡化,分享给大家,具体如下:

官方文档 – https://docs.opencv.org/3.4.0/d5/daf/tutorial_py_histogram_equalization.html 。

考虑一个图像,其像素值仅限制在特定的值范围内。例如,更明亮的图像将使所有像素都限制在高值中。但是一个好的图像会有来自图像的所有区域的像素。所以你需要把这个直方图拉伸到两端(如下图所给出的),这就是直方图均衡的作用(用简单的话说)。这通常会改善图像的对比度.

详解python OpenCV学习笔记之直方图均衡化

建议阅读关于直方图均衡的wikipedia页面Histogram Equalization,了解更多有关它的详细信息。它给出了一个很好的解释,给出了一些例子,这样你就能在读完之后理解所有的东西。同样,我们将看到它的Numpy实现。之后,我们将看到OpenCV函数.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
 
img = cv.imread( 'wiki.jpg' , 0 )
 
hist, bins = np.histogram(img.flatten(), 256 , [ 0 , 256 ])
 
cdf = hist.cumsum()
cdf_normalized = cdf * float (hist. max ()) / cdf. max ()
 
plt.plot(cdf_normalized, color = 'b' )
plt.hist(img.flatten(), 256 ,[ 0 , 256 ], color = 'r' )
plt.xlim([ 0 , 256 ])
plt.legend(( 'cdf' , 'histogram' ), loc = 'upper left' )
plt.show()

详解python OpenCV学习笔记之直方图均衡化

你可以看到,直方图位于更亮的区域。我们需要完整的频谱。为此,我们需要一个转换函数,它将更亮区域的输入像素映射到全区域的输出像素。这就是直方图均衡所做的.

现在我们找到了最小的直方图值(不包括0),并应用了在wiki页面中给出的直方图均衡等式。但我用在Numpy的遮罩数组的概念数组上。对于遮罩数组,所有操作都是在非遮罩元素上执行的.

?
1
2
3
cdf_m = np.ma.masked_equal(cdf, 0 )
cdf_m = (cdf_m - cdf_m. min ()) * 255 / (cdf_m. max () - cdf_m. min ())
cdf = np.ma.filled(cdf_m, 0 ).astype( 'uint8' )

现在我们有了一个查找表,它提供了关于每个输入像素值的输出像素值的信息。所以我们只要应用变换.

?
1
img2 = cdf[img]

现在我们计算它的直方图和cdf,就像之前一样,结果如下:

详解python OpenCV学习笔记之直方图均衡化

另一个重要的特征是,即使图像是一个较暗的图像(而不是我们使用的更亮的图像),在均衡之后,我们将得到几乎相同的图像。因此,它被用作一种“参考工具”,使所有的图像都具有相同的光照条件。这在很多情况下都很有用。例如,在人脸识别中,在对人脸数据进行训练之前,人脸的图像是均匀的,使它们具有相同的光照条件.

OpenCV中的直方图均衡化 。

OpenCV有一个函数可以这样做,cv.equalizeHist()。它的输入只是灰度图像,输出是我们的直方图均衡图像.

?
1
2
3
4
img = cv.imread( 'wiki,jpg' , 0 )
equ = cv.equalizeHist(img)
res = np.hstack((img, equ)) # 并排叠加图片
cv.imwrite( 'res.png' , res)

详解python OpenCV学习笔记之直方图均衡化

所以现在你可以用不同的光条件来拍摄不同的图像,平衡它,并检查结果.

当图像的直方图被限制在一个特定的区域时,直方图均衡是很好的。在那些有很大强度变化的地方,直方图覆盖了一个大区域,比如明亮的和暗的像素,这样的地方就不好用了.

CLAHE(对比有限的自适应直方图均衡/Contrast Limited Adaptive Histogram Equalization) 。

我们刚刚看到的第一个直方图均衡化,考虑到图像的全局对比。在很多情况下,这不是一个好主意。例如,下图显示了一个输入图像及其在全局直方图均衡之后的结果.

详解python OpenCV学习笔记之直方图均衡化

在直方图均衡化之后,背景对比得到了改善。但是比较两幅图像中的雕像的脸。由于亮度过高,我们丢失了大部分的信息。这是因为它的直方图并不局限于一个特定的区域,就像我们在前面的例子中看到的那样.

为了解决这个问题,可以使用了自适应直方图均衡。在这一点上,图像被划分为几个小块,称为“tiles”(在OpenCV中默认值是8x8)。然后每一个方块都是像平常一样的直方图。因此,直方图会限制在一个小区域(除非有噪声)。如果噪音在那里,它就会被放大。为了避免这种情况,会应用对比限制。如果任何直方图bin超出指定的对比度限制(默认情况下是40),在应用直方图均衡之前,这些像素被裁剪并均匀地分布到其他bin。均衡后,删除边界中的工件,采用双线性插值.

cv.createCLAHE([, clipLimit[, tileGridSize]]) 。

?
1
2
3
4
5
6
7
8
9
10
import numpy as np
import cv2 as cv
 
img = cv.imread( 'tsukuba_1.png' , 0 )
 
# create a CLAHE object (Arguments are optional).
clahe = cv.createCLAHE(clipLimit = 2.0 , tileGridSize = ( 8 , 8 ))
cl1 = clahe. apply (img)
 
cv.imread( 'clahe_2.jpg' , cl1)

详解python OpenCV学习笔记之直方图均衡化

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://blog.csdn.net/JS_XH/article/details/79263572 。

最后此篇关于详解python OpenCV学习笔记之直方图均衡化的文章就讲到这里了,如果你想了解更多关于详解python OpenCV学习笔记之直方图均衡化的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com