搜索热词

考虑这样一个图像,它的像素值仅局限于某个特定的值范围。例如,较亮的图像将把所有像素限制在高值上。但是一幅好的图像会有来自图像所有区域的像素。因此,您需要将这个直方图拉伸到两端(如下图所示,来自wikipedia),这就是直方图均衡化的作用(简单来说)。这通常会提高图像的对比度。

在这里我们将看到其Numpy实现。之后,我们将看到OpenCV功能。

importnumpy as npcv2 as cvfrom matplotlib 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,256],color = r)

plt.xlim([0,256])

plt.legend((cdf',histogram'),loc = upper left)

plt.show()

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

现在我们找到最小的直方图值(不包括0),并应用wiki页面中给出的直方图均衡化方程。但我在这里用过,来自Numpy的掩码数组概念数组。对于掩码数组,所有操作都在非掩码元素上执行。您可以从Numpy文档中了解更多关于掩码数组的信息。

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')

现在我们有了查找表,该表为我们提供了有关每个输入像素值的输出像素值是什么的信息。因此,我们仅应用变换。

img2 = cdf[img]

现在,我们像以前一样计算其直方图和cdf(您这样做),结果如下所示:

hist,bins = np.histogram(img.flatten(),1)">)

plt.show()

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

opencv中直方图均衡:

OpenCV具有执行此操作的功能cv.equalizeHist()。它的输入只是灰度图像,输出是我们的直方图均衡图像。 下面是一个简单的代码片段,显示了它与我们使用的同一图像的用法:

img = cv.imread(cv.equalizeHist(img)

res= np.hstack((img,equ)) #stacking images side-by-side

cv.imwrite(res.png

因此,现在您可以在不同的光照条件下拍摄不同的图像,对其进行均衡并检查结果。

当图像的直方图限制在特定区域时,直方图均衡化效果很好。在直方图覆盖较大区域(即同时存在亮像素和暗像素)的强度变化较大的地方,效果不好。请检查其他资源中的SOF链接。

CLAHE:对比度受限的自适应直方图均衡

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

直方图均衡后,背景对比度确实得到了改善。但是在两个图像中比较雕像的脸。由于亮度过高,我们在那里丢失了大多数信息。这是因为它的直方图不像我们在前面的案例中所看到的那样局限于特定区域(尝试绘制输入图像的直方图,您将获得更多的直觉)。

因此,为了解决这个问题,使用了自适应直方图均衡。在这种情况下,图像被分成称为“tiles”的小块(在OpenCV中,tileSize默认为8x8)。然后,像往常一样对这些块中的每一个进行直方图均衡。因此,在较小的区域中,直方图将限制在一个较小的区域中(除非存在噪声)。如果有噪音,它将被放大。为了避免这种情况,应用了对比度限制。如果任何直方图bin超出指定的对比度限制(在OpenCV中默认为40),则在应用直方图均衡之前,将这些像素裁剪并均匀地分布到其他bin。均衡后,要消除图块边界中的伪影,请应用双线性插值。

下面的代码片段显示了如何在OpenCV中应用CLAHE:

cv2 as cv

img= cv.imread(tsukuba_l.pngcreate a CLAHE object (Arguments are optional).

clahe = cv.createCLAHE(clipLimit=2.0,tileGridSize=(8,8))

cl1=clahe.apply(img)

cv.imwrite(clahe_2.jpg

附加资源:

Wikipedia page on Histogram Equalization:http://en.wikipedia.org/wiki/Histogram_equalization

Masked Arrays in Numpy:http://docs.scipy.org/doc/numpy/reference/maskedarray.html)

有关对比度调整的问题:`

如何在C中的OpenCV中调整对比度? http://stackoverflow.com/questions/10549245/how-can-i-adjust-contrast-in-opencv-in-c

如何使用opencv均衡图像的对比度和亮度?http://stackoverflow.com/questions/10561222/how-do-i-equalize-contrast-brightness-of-images-using-opencv)

相关文章

总结

如果觉得编程之家网站内容还不错,欢迎将编程之家网站推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。

如您喜欢交流学习经验,点击链接加入交流1群:1065694478(已满)交流2群:163560250

python opencv直方图_【python opencv】直方图均衡相关推荐

  1. python 目标直方图_深入了解扩展事件–直方图目标

    python 目标直方图 An Extended events target is the destination for all of the information that is capture ...

  2. python keyboard模块_[python] PyMouse、PyKeyboard用python操作鼠标和键盘

    1.PyUserInput 简介 PyUserInput是一个使用python的跨平台的操作鼠标和键盘的模块,非常方便使用.支持的平台及依赖如下: Linux - Xlib Mac - Quartz, ...

  3. python画直方图代码-Python绘制直方图及子图的方法分析(代码示例)

    本篇文章给大家带来的内容是关于Python绘制直方图及子图的方法分析(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 1.直方图的绘制也需要用到matplotlib下的py ...

  4. python 病毒 基因_#Python#提取基因对应的蛋白质名

    提取基因对应的蛋白质官方名 最开始,是需要将基因跟其编码的蛋白质对应起来,找遍了各种数据库都没发现有相关的注释文件,Uniprot作为处理蛋白质的大佬,结果里都有,肯定有办法能够满足需求. 搜索TP5 ...

  5. python鱼眼图像识别_使用OpenCV校准鱼眼镜头的方法

    01.简介 当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头"经典"方法的效果可能就不是和理想了.即使我们仔细遵循OpenCV文档中的步骤,也可能会得到下面这个奇 ...

  6. opencv和python的区别_所有这些OpenCV Python接口之间有何不同?

    拉风的咖菲猫 OpenCV正式发布了两种类型的Python接口,cv和cv2.简历:我开始工作cv.这样,所有OpenCV数据类型都将保留下来.例如,加载时,图像的格式cvMat与C ++中的相同.对 ...

  7. python连通域标记_使用OpenCV获取图片连通域数量,并用不同颜色标记函

    一,原图和效果图 二,代码 //#########################产生随机颜色######################### cv::Scalar icvprGetRandomCo ...

  8. python 连通域面积_使用OpenCV去除面积较小的连通域

    这是后期补充的部分,和前期的代码不太一样 效果图 源代码 //测试 void CCutImageVS2013Dlg::OnBnClickedTestButton1() { vector > co ...

  9. python 椭圆检测_使用OpenCV和Python检测触摸/重叠圆/椭圆

    这是我检测圈子的尝试.综上所述 >执行BGR-> HSV转换,并使用V通道进行处理 V通道: >阈值,应用形态关闭,然后进行距离转换(我会称之为dist) 分区形象: >创建一 ...

最新文章

  1. smarty_modifier_truncate,无或者有md_substr的情况下都能正确截取字符串的php函数,可用于smarty。...
  2. Python 安装 xlsx模块
  3. 地...地...地震了
  4. vue 传递多行数据_vue 数据传递的方法
  5. ROS学习:创建机器人的urdf
  6. 【转】80后安稳上班,90后看心情上班,95后……太形象了!
  7. vs设置语言后引用dll的一个错误
  8. 满足 Google Play 目标 API 等级 (targetSdkLevel) 的要求
  9. jzoj5698-[gdoi2018day1]密码锁【贪心,差分】
  10. 具有Aspects的Java中的Mixin –用于Scala特性示例
  11. LBS由ip查经纬度
  12. redis-3.0.0_rc5的RPM包制定
  13. [Python3 填坑] 008 索引君的朋友 in
  14. vue 修改路由名字_Vue 路由设置title
  15. WinUSB Component for .Net WinForm
  16. 免费后台挂尔雅浏览器下载及使用教程
  17. mysql for centos下载_CentOS下载mysql哪个版本
  18. 基于FPGA的循迹小车,控制器:Xilinx-Ego1
  19. java 连接池配置_【Java】java数据库连接池配置的几种方法
  20. Windows 11 22H2 中文版、英文版 (x64、ARM64) 下载 (updated Jan 2023)

热门文章

  1. 东北大学软件项目管理与过程改进_工程项目管理信息化实施方案
  2. 这位电子工程师,你不能错过。
  3. Ubuntu18.04安装VCS、Verdi、dve全套教程亲测(有成功截图)
  4. mysql 是否为空字符串_MySql判断是否为null或空字符串
  5. 常见人名大全_生辰八字起名取名:2020年属鼠的女孩起名字大全
  6. php 修改html文件内容吗,请问你们怎么将html的文件的内容改变为php
  7. linux ppc64 是什么,docker - 在(模拟)PPC64 Linux上的backtrace()segfaults - 堆栈内存溢出...
  8. oracle 长事务 逻辑日志,goldengate中长事务引起的问题
  9. mfc 算方差函数_什么影响了你的工资?方差分析告诉你
  10. python输入年份月份输出天数_6.2(输入年份 月份 输出该月天数)