使用 OpenCV 实现 CLAHE 直方图均衡化

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 处理后的图像在可读性和视觉效果上都明显优于普通的阈值处理。这种技术也被广泛应用于医学影像和卫星照片的处理中。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。如需转载,请注明文章出处豆丁博客和来源网址。https://shluqu.cn/46922.html
点赞
0.00 平均评分 (0% 分数) - 0