CLAHE(对比度受限的自适应直方图均衡化)
CLAHE(Contrast Limited Adaptive Histogram Equalization)是一种用于提升图像对比度的技术。在传统的图像处理方法中,直方图均衡化通常会改变整张图像的对比度,而 CLAHE 则通过将图像分割成较小的部分(网格),并分别调整每个部分的对比度来工作。这种方法有助于避免图像的某些区域出现过亮或过暗的情况。在本文中,我们将一起来探索如何结合 Python 使用 OpenCV 来应用 CLAHE。
在使用 CLAHE 时,我们需要记住两个关键参数:
- clipLimit:该参数用于设置对比度限制的阈值。默认值为 40。
- tileGridSize:它用于将图像划分为网格以应用 CLAHE。它指定了网格的行数和列数。默认设置为 8×8。
我们利用自适应直方图均衡化来处理每个图块(tile),该过程会根据像素值的局部分布来调整像素强度。在处理完这些图块后,算法会使用双线性插值(Bilinear Interpolation)将它们重新组合,以消除图块之间可见的边界。这一步骤确保了相邻图块之间的过渡平滑一致,在增强局部区域对比度的同时,保留了图像的自然外观。
现在,让我们看看如何使用 Python 来实现它。
输入图像:
!image输入图像
- image_resized = cv2.resize(image, (500, 600)): 将图像的大小调整为 500×600 像素。
- imagebw = cv2.cvtColor(imageresized, cv2.COLOR_BGR2GRAY): 将调整大小后的图像转换为灰度图。
- clahe = cv2.createCLAHE(clipLimit=5): 创建一个 CLAHE 对象,并将对比度限制设置为 5。
- claheimg = np.clip(clahe.apply(imagebw) + 30, 0, 255).astype(np.uint8): 对图像应用 CLAHE 并将结果加上 30,这有助于将数值裁剪到有效范围内。
- , thresholdimg = cv2.threshold(imagebw, 155, 255, cv2.THRESHBINARY): 对灰度图像应用二值化阈值处理,阈值设定为 155。
Python 代码示例
import cv2
import numpy as np
import os
def display_image(title, image):
try:
from google.colab.patches import cv2_imshow
cv2_imshow(image)
except ImportError:
cv2.imshow(title, image)
cv2.waitKey(0)
cv2.destroyAllWindows()
image_path = "image.jpg"
image = cv2.imread(image_path)
image_resized = cv2.resize(image, (500, 600))
image_bw = cv2.cvtColor(image_resized, cv2.COLOR_BGR2GRAY)
clahe = cv2.createCLAHE(clipLimit=5)
clahe_img = np.clip(clahe.apply(image_bw) + 30, 0, 255).astype(np.uint8)
_, threshold_img = cv2.threshold(image_bw, 155, 255, cv2.THRESH_BINARY)
display_image("Ordinary Threshold", threshold_img)
display_image("CLAHE Image", clahe_img)
输出结果:
!image普通阈值处理
!image应用 CLAHE 后
通过对比我们可以看到,使用 CLAHE 处理后的图像在可读性和视觉效果上都明显优于普通的阈值处理。这种技术也被广泛应用于医学影像和卫星照片的处理中。