基于opecv和numpy的直方图均衡化

更新时间:2023-07-20 19:30:00 阅读: 评论:0

基于opecv和numpy的直⽅图均衡化
1. 基本原理
  在这⾥将给⼤家介绍三种常见的直⽅图均衡化的⽅法。
  考虑⼀个图像,其像素值仅限于某些特定的值范围。例如,较亮的图像将所有像素限制在较⾼的值内。但是⼀个好的图像将有来⾃图像所有区域的像素。所以您需要将这个柱状图拉伸到两端(如下图所⽰,来⾃维基百科),这就是柱状图均衡的作⽤(简单来说)。这通常会提⾼图像的对⽐度。
史大奈2. 基于numpy 的直⽅图均衡化
  我们⾸先使⽤ numpy 画出⼀张图象的直⽅图
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('wiki.jpg',0)
hist,bins = np.histogram(img.flatten(),256,[0,256])
cdf = hist.cumsum()
大梁国萧皇帝列表
cdf_normalized = cdf * 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()
  你可以看到直⽅图位于更亮的区域。我们需要全谱。为此,我们需要⼀个转换函数,将较亮区域中的输⼊像素映射为全区域中的输出像素。柱状图均衡就是这样做的。
  现在我们找到最⼩直⽅图值(不包括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(您可以这样做),结果如下:
科目一顺口溜>吃天麻有什么好处
  另⼀个重要的特点是,即使图像是较暗的图像(⽽不是我们使⽤的较亮的图像),均衡后,我们将得到⼏乎与我们得到的图像相同的图像。因此,它被⽤作“参考⼯具”,使所有图像具有相同的照明条件。这在许多情况下都很有⽤。例如,在⼈脸识别中,在对⼈脸数据进⾏训练之前,对⼈脸图像进⾏直⽅图均衡,使其在相同的照明条件下都保持⼀致。
2. 基于 opencv 的直⽅图均衡化
  opencv有⼀个这样做的函数,cv2.equallehist()。它的输⼊只是灰度图像,输出是我们的直⽅图均衡图像。下⾯是⼀个简单的代码⽚段,显⽰了它对我们使⽤的相同图像的⽤法:
img = cv2.imread('wiki.jpg',0)
equ = cv2.equalizeHist(img)
深圳游玩res = np.hstack((img,equ))#stacking images side-by-side
cv2.imwrite('res.png',res)
所以现在你可以在不同的光线条件下拍摄不同的图像,平衡它并检查结果。
日本男生名字  当图像的直⽅图局限于某⼀特定区域时,直⽅图均衡化效果较好。在直⽅图覆盖⼤区域(即既有亮像素,也有暗像素)的强度变化较⼤的地⽅,这种⽅法效果不佳。
3. 基于 opencv 的限制对⽐度⾃适应直⽅图均衡化(CLAHE)
  我们刚刚看到的第⼀个直⽅图均衡,考虑了图像的全局对⽐度。在许多情况下,这不是⼀个好主意。例如,下图显⽰了全局直⽅图均衡后的输⼊图像及其结果。
  经过直⽅图均衡后,背景对⽐度确实有所改善。但⽐较两幅图像中雕像的脸。由于亮度过⾼,我们在那⾥丢失了⼤部分信息。这是因为它的柱状图并不局限于我们在前⾯的例⼦中看到的特定区域(尝试绘制输⼊图像的柱状图,你会得到更多的直觉)。
  为了解决这⼀问题,采⽤了⾃适应直⽅图均衡。在这种情况下,图像被分成称为“tiles”的⼩块(在opencv中,tileSize默认为
8x8)。然后,像往常⼀样,对每个块进⾏柱状图均衡。所以在⼀个⼩的区域,柱状图会限制在⼀个⼩的区域(除⾮有噪⾳)。如果有噪⾳,就会被放⼤。为了避免这种情况,应⽤对⽐度限制。如果任何⼀个柱状图bin⾼于指定的对⽐度限制(在opencv中默认为40),则在应⽤柱状图均衡之前,这些像素将被剪切并均匀分布到其他bin。均衡后,为了消除瓷砖边缘的伪影,采⽤双线性插值。
  下⾯的代码⽚段显⽰了如何在opencv中应⽤CLAHE:
import numpy as np
import cv2
img = cv2.imread('tsukuba_l.png',0)
# create a CLAHE object (Arguments are optional).
clahe = ateCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
cv2.imwrite('clahe_2.jpg',cl1)
请参见下⾯的结果,并将其与上⾯的结果进⾏⽐较,尤其是雕像区域:
参考
[1] Opencv

本文发布于:2023-07-20 19:30:00,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/1107478.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:图像   像素   区域   柱状图   数组   输出
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图