OpenCV CLAHE直方图均衡化
直方图均衡化是一种在图像处理中用于增强图像对比度的技术,通过重新分配像素强度,使整体亮度和细节最大化。该方法通过调整图像中像素值的频率分布,使得结果图像具有均匀的直方图。均衡的直方图确保图像中每个像素的出现机会均等,从而得到对比度增强、分布均匀的图像。
直方图均衡化是图像处理中的重要工具,广泛应用于医学成像、遥感和计算机视觉等各种应用中。该技术特别适用于增强对比度或亮度较差的图像,例如在低光条件下拍摄或过曝的图像。
尽管直方图均衡化在增强图像对比度方面非常有效,但它可能会导致一些图像中的伪影,例如过度放大噪声和细节丢失。因此,多年来已经开发了各种改进和改进的方法,如自适应直方图均衡化、对比度限制的自适应直方图均衡化和局部直方图均衡化等。
现在让我们简单了解一下CLAHE。
CLAHE
对比度受限的自适应直方图均衡化(CLAHE)是直方图均衡化的一种变体,被广泛应用于图像处理应用中,以改善图像的对比度,同时避免过度放大噪声并保留图像细节。CLAHE的主要想法是在图像的较小区域内局部执行直方图均衡化,而不是全局调整。
在传统的直方图均衡化中,图像被划分为小的非重叠区域或子图像,每个子图像都被单独均衡化。这个过程可能导致低对比度的子图像中噪声过度放大,从而产生嘈杂和人工看起来的图像。相反,CLAHE将图像划分为重叠的区域,并分别对每个区域应用直方图均衡化。这样可以更好地增强对比度,同时保留本地细节并避免过度放大噪声。
CLAHE涉及两个主要步骤:对比度增强和对比度限制。在第一步中,对图像的每个小区域应用局部直方图均衡化,从而增加对比度。在第二步中,通过将非线性函数应用于直方图来限制图像的对比度,以减少具有非常高或非常低强度的像素数量。非线性函数由一个称为剪切限制的参数定义,它决定要应用的对比度限制程度。
剪辑限制是CLAHE中的一个重要参数。它决定了在每个区域中进行对比度放大的最大量 before the contrast is limited。如果剪辑限制设置得过高,图像可能过度增强,出现人工效果,例如边缘周围的光晕或整体浑浊的外观。另一方面,如果剪辑限制设置得太低,对比度增强可能不足,图像可能显得暗淡。
CLAHE相对于传统的直方图均衡化有几个优点。首先,它可以更有效地保留局部细节和增强对比度。其次,它可以避免过度放大噪声,这在医学成像应用中尤为重要,因为图像可能会有噪声。最后,它是一种简单且计算效率高的算法,适用于实时应用。
总之,CLAHE是一种强大的技术,可以增强图像对比度,同时保留局部细节并避免过度放大噪声。它已被广泛应用于医学成像、遥感和计算机视觉等各个领域。其适应局部对比度变化并避免过度放大噪声的能力使其成为增强图像的有价值工具。
本教程将演示使用对比限制自适应直方图均衡化(CLAHE)来均衡化图像的过程。
可以使用该算法来增强图像的对比度。此外,CLAHE还可应用于彩色图像,当仅将算法应用于HSV图像的亮度通道时,可获得更好的效果,而不是对BGR图像的所有通道进行均衡化。
在使用CLAHE时,需要记住两个参数:clipLimit和tileGridSize。
clipLimit设置对比度限制的阈值,默认值为40。与此同时,tileGridSize确定图像被分为多少行和多少列的图块(tile)应用于CLAHE,其默认值为8×8。
现在已经有足够的理论知识,让我们探索如何使用CLAHE进行直方图均衡化。
在开始编写代码前,我们首先需要确保我们的机器上安装了opencv模块,如果没有,则需要运行以下命令。
命令
pip3 install opencv-python
考虑下面显示的代码。
示例
import cv2
import numpy as np
# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))
# The initial processing of the image
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
clahe = cv2.createCLAHE(clipLimit = 5)
final_img = clahe.apply(image_bw) + 30
# Ordinary thresholding the same image
_, ordinary_img = cv2.threshold(image_bw, 155, 255, cv2.THRESH_BINARY)
# Showing all the three images
cv2.imshow("ordinary threshold", ordinary_img)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()
说明
这段代码使用Python中的OpenCV库执行一个简单的图像处理任务。
首先,它导入了必要的库:OpenCV和NumPy。然后,它从当前目录中读取名为”aircraft−ww2.jpeg”的图像,并将其调整为500×600以适配。
接下来,使用cv2.cvtColor()函数将图像转换为灰度图像。灰度图像被存储在变量image_bw中。
然后,代码使用cv2.createCLAHE()函数对灰度图像应用对比度有限自适应直方图均衡化(CLAHE)。clipLimit参数被设置为5,它确定了对比度限制的阈值。然后,对结果图像进行调整,通过添加一个值为30来增加亮度。
除了CLAHE图像之外,代码还对灰度图像执行了普通阈值处理,使用cv2.threshold()函数。阈值被设置为155,这意味着任何大于155的像素值将被设置为255(白色),任何小于155的值将被设置为0(黑色)。结果图像被存储在变量ordinary_img中。
最后,代码使用cv2.imshow()函数显示了所有三个图像,其中”ordinary threshold”表示普通阈值处理的图像,”CLAHE image”表示经过CLAHE增强的图像。代码在使用cv2.waitKey()的等待按键之前关闭窗口。
要运行上述代码,我们需要运行下面显示的命令:
命令
python3 main.py
一旦我们运行以上命令,我们可以期望输出与下面显示的一样。
输出
左边是没有使用CLAHE方法的原始图像,右边是使用CLAHE方法后的图像。
现在让我们再来看一个例子。
我们将改变cliplit和titleGridSize的值。
考虑下面展示的代码。
示例
import cv2
import numpy as np
# Reading the image from the present directory
image = cv2.imread("aircraft-ww2.jpeg")
# Resizing the image for compatibility
image = cv2.resize(image, (500, 600))
# The initial processing of the image
# Uncomment the line below to apply median filtering
# image = cv2.medianBlur(image, 3)
image_bw = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# The declaration of CLAHE
# clipLimit -> Threshold for contrast limiting
# tileGridSize -> Number of tiles in the row and column
clahe = cv2.createCLAHE(clipLimit=10, tileGridSize=(8, 8))
final_img = clahe.apply(image_bw)
# Adjust the brightness of the output
final_img = cv2.add(final_img, 50)
# Showing all the three images
cv2.imshow("Original image", image)
cv2.imshow("CLAHE image", final_img)
cv2.waitKey()
说明
首先,我们导入所需的库,OpenCV和NumPy。
然后,我们使用cv2.imread()函数从当前目录中读取名为”aircraft−ww2.jpeg”的图像,并将其存储在变量’image’中。我们将图像调整为500 x 600像素,以确保与显示窗口兼容。
接下来,我们使用cv2.cvtColor()函数将图像转换为灰度,并将其存储在名为’image_bw’的新变量中。
然后,我们使用cv2.createCLAHE()函数创建一个对比度受限自适应直方图均衡化(CLAHE)对象。我们将’clipLimit’参数设置为10,这设置了对比度限制的阈值,并将’tileGridSize’参数设置为(8,8),这设置了行和列中的瓦片数。
接下来,我们使用CLAHE对象的apply()方法对灰度图像应用CLAHE算法,并将结果存储在名为’final_img’的新变量中。
最后,我们通过使用cv2.add()函数将值50添加到’final_img’变量来调整输出图像的亮度。我们使用cv2.imshow()函数将原始图像和CLAHE增强图像并排显示,并使用cv2.waitKey()函数等待按键。
要运行上述代码,我们需要运行下面显示的命令。
命令
python3 main.py
一旦我们运行上述命令,我们可以期望输出与下面所示的相同。
输出
结论
综上所述,对比有限自适应直方图均衡化(CLAHE)是一种强大的图像增强技术,可以提高图像的对比度和动态范围。
借助OpenCV的帮助,可以很容易地在灰度图像和彩色图像上实现CLAHE。通过调整clipLimit和tileGridSize参数,我们可以对CLAHE算法进行微调,以适应我们的需求。总体而言,CLAHE是图像处理中的一个有用工具,可以帮助改善各种应用中的图像的视觉质量。