直方图均衡图像对比度(histogram equalization)PYTHON+OPENCV2

直方图均衡化是一种图像处理方法,用来提高图像的对比度,本博客涉及到直方图的应用PYTHON+OPENCV2

如果一个图像的像素取值范围在很狭窄的一个区域内,那么图像的细节就不是那么的明显,如果可以将图像的像素分布范围均衡化,那么能够提高图像的对比度,如下图所示:
在这里插入图片描述

使用python+opencv2计算一幅图像的直方图,图像如下图:

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

在这里插入图片描述
由直方图可以发现,图像的像素分布相对较狭窄。
进行直方图均衡化:

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]

此时img2即为均衡化之后的图像,我们重新计算其像素直方图得到下图:
在这里插入图片描述

对比度明显提高,细节也相对明显了一些。
有时候数据集中的图像数据是在不同的光照下或者场景下拍到的,比如说人脸的照片,通过直方图均衡化,面部识别中,在训练面部数据之前,将面部图像均衡化以使它们全部具有相同的照明条件。

Histograms Equalization in OpenCV 自带函数应用

opencv中有自带的函数 cv2.equalizeHist()它的输入只能是灰度图,输出是直方图均衡化后的图像。
代码:

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)

得到的结果:
在这里插入图片描述
所以现在你可以拍摄不同光线条件的不同图像,均衡它并检查结果。
当图像的直方图被限制在特定区域时,直方图均衡是好的。 在直方图覆盖大区域的强度变化较大的地方,即存在亮像素和暗像素时,它将无法正常工作。

CLAHE(对比度有限自适应直方图均衡)

我们刚看到的第一个直方图均衡,考虑了图像的全局对比度。 在许多情况下,这不是一个好主意。 例如,下图显示了全局直方图均衡后的输入图像及其结果。
在这里插入图片描述
确实,直方图均衡后背景对比度有所改善。但比较两个图像中的雕像的脸。由于亮度过高,我们丢失了大部分信息。这是因为它的直方图并不局限于特定区域,正如我们在之前的案例中看到的那样(尝试绘制输入图像的直方图,您将获得更多的直觉)。

因此,为了解决这个问题,使用自适应直方图均衡。在此,图像被分成称为“图块”的小块(在OpenCV中,tileSize默认为8x8)。然后像往常一样对这些块中的每一个进行直方图均衡。所以在一个小区域内,直方图会限制在一个小区域(除非有噪音)。如果有噪音,它会被放大。为避免这种情况,应用对比度限制。如果任何直方图区间高于指定的对比度限制(在OpenCV中默认为40),则在应用直方图均衡之前,将这些像素剪切并均匀分布到其他区间。均衡后,为了去除图块边框中的瑕疵,应用双线性插值。

下面的代码片段显示了如何在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)

得到的改善结果:
在这里插入图片描述


参考资料:

  1. 直方图均衡化(Histogram equalization)与直方图规定化
  2. Histograms - 2: Histogram Equalization
  3. Wikipedia page on Histogram Equalization

猜你喜欢

转载自blog.csdn.net/m0_37477175/article/details/83108084