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

栏目: 编程工具 · 发布时间: 5年前

内容简介:版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dugudaibo/article/details/87896415

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dugudaibo/article/details/87896415

1. 基本原理

在这里将给大家介绍三种常见的直方图均衡化的方法。

考虑一个图像,其像素值仅限于某些特定的值范围。例如,较亮的图像将所有像素限制在较高的值内。但是一个好的图像将有来自图像所有区域的像素。所以您需要将这个柱状图拉伸到两端(如下图所示,来自维基百科),这就是柱状图均衡的作用(简单来说)。这通常会提高图像的对比度。

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

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

基于 opecv 和 numpy 的直方图均衡化 你可以看到直方图位于更亮的区域。我们需要全谱。为此,我们需要一个转换函数,将较亮区域中的输入像素映射为全区域中的输出像素。柱状图均衡就是这样做的。

现在我们找到最小直方图值(不包括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(您可以这样做),结果如下:

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

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

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)

基于 opecv 和 numpy 的直方图均衡化 所以现在你可以在不同的光线条件下拍摄不同的图像,平衡它并检查结果。

当图像的直方图局限于某一特定区域时,直方图均衡化效果较好。在直方图覆盖大区域(即既有亮像素,也有暗像素)的强度变化较大的地方,这种方法效果不佳。

3. 基于 opencv 的限制对比度自适应直方图均衡化(CLAHE)

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

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

经过直方图均衡后,背景对比度确实有所改善。但比较两幅图像中雕像的脸。由于亮度过高,我们在那里丢失了大部分信息。这是因为它的柱状图并不局限于我们在前面的例子中看到的特定区域(尝试绘制输入图像的柱状图,你会得到更多的直觉)。

为了解决这一问题,采用了自适应直方图均衡。在这种情况下,图像被分成称为“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 = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)

cv2.imwrite('clahe_2.jpg',cl1)

请参见下面的结果,并将其与上面的结果进行比较,尤其是雕像区域:

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

[1] Opencv Histograms - 2: Histogram Equalization


以上所述就是小编给大家介绍的《基于 opecv 和 numpy 的直方图均衡化》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

自品牌

自品牌

陈为、孙郁婷 / 机械工业出版社 / 2015-9-7 / 39

移动互联网来势汹涌,让品牌重新回到人的时代。微信旗帜鲜明地宣示,“再小的个体也有自己的品牌”。《自品牌:个人如何玩转移动互联网时代》作者历经一年,深度访谈10位嘉宾,挖掘其品牌与商业成功密码。吴晓波、雕爷、罗永浩、鬼脚七、马佳佳……这些商业新浪潮中的探路者与领军者,要么是传统领域的老将,要么是新领域里的先锋,但都能以新媒体为载体,构建个人品牌,打造商业生态,抓住互联网的时代红利,顺风而起,顺势而为......一起来看看 《自品牌》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具