Opencv4 -Python官方教程学习笔记21---直方均衡化

目标

学习直方图均衡化的概念,并利用它来提高图像的对比度。

理论

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

OpenCV中的直方图均衡

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

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
path = r'D:\Laboratory\Study\Computer Vision\opencv4-python\junhenghua.png'  
img = cv.imread(path,0)     #读取图像,并转化为灰度图像
equ = cv.equalizeHist(img)      #输入为灰度图,输出为处理后的均衡图像
res = np.hstack((img,equ)) #j合并图像
cv.imshow('tu',res)

结果:
Opencv4 -Python官方教程学习笔记21---直方均衡化_第2张图片处理前后的灰度直方图:
Opencv4 -Python官方教程学习笔记21---直方均衡化_第3张图片当图像的直方图限制在特定区域时,直方图均衡化效果很好。在直方图覆盖较大区域(即同时存在亮像素和暗像素)的强度变化较大的地方,效果不好。请检查其他资源中的SOF链接。

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

我们刚刚看到的第一个直方图均衡化考虑了图像的整体对比度。在许多情况下,这不是一个好主意。例如,下图显示了输入图像及其在全局直方图均衡后的结果。
Opencv4 -Python官方教程学习笔记21---直方均衡化_第4张图片
直方图均衡后,背景对比度确实得到了改善。但是在两个图像中比较雕像的脸。由于亮度过高,我们在那里丢失了大多数信息。这是因为它的直方图不像我们在前面的案例中所看到的那样局限于特定区域(尝试绘制输入图像的直方图,您将获得更多的直觉)。

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

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

import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
path = r'D:\Laboratory\Study\Computer Vision\opencv4-python\zishiyingjunhenghua.png'  
img = cv.imread(path,0)     #读取图像,并转化为灰度图像
equ = cv.equalizeHist(img)      #输入为灰度图,输出为处理后的均衡图像
clahe = cv.createCLAHE(clipLimit=2.0, tileGridSize=(8,8))
cl1 = clahe.apply(img)
plt.subplot(2,2,1),plt.imshow(img,'gray'),plt.title('ORIGINAL')
plt.subplot(2,2,2),plt.imshow(equ,'gray'),plt.title('jieguo')
plt.subplot(2,2,3),plt.imshow(cl1,'gray'),plt.title('jieguo1')

查看下面的结果,并将其与上面的结果进行比较,尤其是雕像区域:
Opencv4 -Python官方教程学习笔记21---直方均衡化_第5张图片

你可能感兴趣的:(opencv4,图像处理,opencv,计算机视觉,图像识别)