CLAHE直方图均衡化 - OpenCV


直方图均衡化是一种图像处理技术,用于通过重新分配像素强度来增强图像的对比度,从而最大化整体亮度和细节。该方法通过调整图像中像素值的频率分布来工作,使得生成的图像具有均匀的直方图。均匀的直方图确保图像中的每个像素都有相同的出现机会,从而产生对比度增强的分布良好的图像。

直方图均衡化是图像处理中一个重要的工具,常用于各种应用中,包括医学影像、遥感和计算机视觉。该技术在增强对比度或亮度较差的图像(例如在低光照条件下拍摄的图像或过度曝光的图像)方面特别有用。

直方图均衡化是图像处理中一个重要的工具,常用于各种应用中,包括医学影像、遥感和计算机视觉。该技术在增强对比度或亮度较差的图像(例如在低光照条件下拍摄的图像或过度曝光的图像)方面特别有用。

尽管直方图均衡化在增强图像对比度方面非常有效,但它可能会导致生成的图像中出现一些伪影,例如噪声的过度放大和细节的丢失。因此,多年来开发了该方法的各种变体和改进,例如自适应直方图均衡化、对比度受限自适应直方图均衡化和局部直方图均衡化等。

现在让我们了解一下CLAHE。

CLAHE

对比度受限自适应直方图均衡化(CLAHE)是直方图均衡化的一种变体,已广泛用于图像处理应用中,以提高图像对比度,同时避免噪声的过度放大并保留图像细节。CLAHE背后的主要思想是在图像的较小区域中局部执行直方图均衡化,而不是全局执行。

在传统的直方图均衡化中,图像被分成小的不重叠区域或子图像,并且每个子图像都被单独均衡化。此过程可能导致对比度低的子图像中的噪声过度放大,从而导致图像出现噪点和人工效果。相比之下,CLAHE将图像划分为重叠区域,并分别对每个区域应用直方图均衡化。这允许在保留局部细节和避免噪声过度放大的同时更好地增强对比度。

CLAHE涉及两个主要步骤:对比度增强和对比度限制。在第一步中,局部直方图均衡化应用于图像的每个小区域,从而提高对比度。在第二步中,通过对直方图应用非线性函数来限制图像的对比度,从而减少具有非常高或非常低强度的像素的数量。非线性函数由称为裁剪限制的参数定义,该参数确定要应用的对比度限制量。

裁剪限制是CLAHE中的一个重要参数。它决定了在对比度受限之前每个区域可以执行的最大对比度放大量。如果裁剪限制设置得太高,图像可能会过度增强并出现人工效果,例如边缘周围的光晕或整体冲淡的外观。另一方面,如果裁剪限制设置得太低,对比度增强可能不足,图像可能看起来暗淡。

CLAHE与传统的直方图均衡化相比有几个优点。首先,它可以更有效地保留局部细节和增强对比度。其次,它可以避免噪声过度放大,这在医学影像应用中尤其重要,因为图像可能存在噪声。最后,它是一种简单且计算效率高的算法,使其适用于实时应用。

总之,CLAHE是一种强大的技术,用于增强图像对比度,同时保留局部细节并避免噪声过度放大。它已广泛用于各种应用中,包括医学影像、遥感和计算机视觉。它能够适应局部对比度变化并避免噪声过度放大的能力使其成为许多领域中增强图像的宝贵工具。

本教程将演示使用对比度受限自适应直方图均衡化(CLAHE)均衡图像的过程。

可以使用此算法增强图像的对比度。此外,CLAHE可以应用于彩色图像,当仅对HSV图像的亮度通道应用算法而不是均衡BGR图像的所有通道时,可以获得更好的结果。

使用CLAHE时,需要注意两个参数:clipLimit和tileGridSize。

clipLimit设置对比度限制的阈值,默认值为40。同时,tileGridSize在将图像划分为CLAHE应用的区域时确定每行和每列的图块数量,其默认值为8x8。

现在理论知识足够了,让我们探索如何利用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”的图像,并将其大小调整为500x600以确保兼容性。

接下来,使用cv2.cvtColor()函数将图像转换为灰度。生成的image_bw变量存储灰度图像。

之后,代码使用cv2.createCLAHE()函数对灰度图像应用对比度受限自适应直方图均衡化(CLAHE)。clipLimit参数设置为5,它决定对比度限制的阈值。然后通过添加值30来调整生成的图像以增加其亮度。

除了CLAHE图像外,代码还使用cv2.threshold()函数对灰度图像执行普通阈值处理。阈值设置为155,这意味着任何高于155的像素值都设置为255(白色),任何低于155的值都设置为0(黑色)。生成的图像存储在变量ordinary_img中。

最后,代码使用cv2.imshow()函数显示所有三个图像,“普通阈值”表示普通阈值处理图像,“CLAHE图像”表示CLAHE增强的图像。代码在使用cv2.waitKey()关闭窗口之前等待按键。

要运行以上代码,我们需要运行下面显示的命令。

命令

python3 main.py

运行以上命令后,我们可以期望输出与下面显示的输出相同。

输出

左侧是未经clahe处理的原始图像,右侧是使用CLAHE处理的图像。

现在让我们再举一个例子。

我们将更改cliplimit和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()函数向“final_img”变量添加值50来调整输出图像的亮度。我们使用cv2.imshow()函数并排显示原始图像和CLAHE增强的图像,并使用cv2.waitKey()函数等待按键。

要运行以上代码,我们需要运行下面显示的命令。

命令

python3 main.py

运行以上命令后,我们可以期望输出与下面显示的输出相同。

输出

结论

总之,对比度受限自适应直方图均衡化(CLAHE)是一种强大的图像增强技术,可以改善图像的对比度和动态范围。

借助OpenCV,可以轻松地在灰度和彩色图像上实现CLAHE。通过调整clipLimit和tileGridSize参数,我们可以微调CLAHE算法的性能以满足我们的需求。总的来说,CLAHE是图像处理中一个有用的工具,可以帮助提高各种应用中图像的视觉质量。

更新于: 2023年8月2日

3K+ 浏览量

开启你的职业生涯

通过完成课程获得认证

立即开始
广告