CV学习-直方图均衡化

直方图均衡化是一种常见的图像对比度增强方法,尤其适用于局部对比度相近的图像。它通过扩展常用的亮度来提升图像的局部对比度,使灰度在直方图上分布更均匀。该过程涉及累积分布函数的使用,确保灰度值在转换后仍保持0到L-1的范围。在C++中,可以利用CImg库实现直方图均衡化,增强图像的视觉效果。

利用直方图均衡化增强图像

概述

  • 图像对比度增强的方法可以分成两类:一类是直接对比度增强方法;另一类是间接对比度增强方法。直方图拉伸和直方图均衡化是两种最常见的间接对比度增强方法。直方图拉伸是通过对比度拉伸对直方图进行调整,从而“扩大”前景和背景灰度的差别,以达到增强对比度的目的,这种方法可以利用线性或非线性的方法来实现;直方图均衡化则通过使用累积函数对灰度值进行“调整”以实现对比度的增强。

  • 直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。这种方法通常用来增加许多图像的局部对比度,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法,亮度可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

灰度直方图

  1. 概念

    • 灰度直方图(histogram)是灰度级的函数,它表示图象中具有每种灰度级的象素的个数,反映图象中每种灰度出现的频率。灰度直方图的横坐标是灰度级,纵坐标是该灰度级出现的频率,是图象的最基本的统计特征。
    • 从概率的观点来理解,灰度出现的频率可看作其出现的概率,这样直方图就对应于概率密度函数pdf,而概率分布函数就是直方图的累积和,即概率密度函数的积分.
  2. 性质
    它只反映该图像中不同灰度值出现的次数,而未反映某一灰度值像素所在的位置。也就是说,它只包含了该图像中某一灰度值的像素出现的概率,而丢失了其所在位置的信息。

核心思想

  1. 直方图均衡化处理的中心思想是把原始图像的灰度直方图从比较集中的某个灰度区间变成在全部灰度范围内的均匀分布。
  2. 对图像空间域点的增强过程是通过增强函数t=EH(s)来完成的,t、s分别为目标图像和原始图像上的像素点(x, y)处的灰度值。
  3. 在进行均衡化处理时,增强函数EH需要满足两个条件:
    1)、增强函数EH(s)在0≤s≤L-1的范围内是一个单调递增函数,这个条件保证了在增强处理时没有打乱原始图像的灰度排列次序;
    2)、对于0≤s≤L−1应当有0≤EH(s)≤L−1,它保证了变换过程中灰度值的动态范围的一致性。同样的,对于反变换过程s=EH-(t),在0≤t≤1时也必须满足上述两个条件。
  4. 可以证明累积分布函数就是满足上述条件,通过该函数可以完成s到t的均匀分布转换,即使直方图均衡化的灰度变化函数是累积分布函数(概率分部函数)。
  5. 离散情况下的增强转换方程为:
    这里写图片描述
  6. 彩色图片可以分别提取RGB三个通道的值分别进行直方图均衡化操作,然后再将三个通道的值合并成彩色图像。

证明过程

### 使用直方图均衡化增强图像强度 #### 方法概述 直方图均衡化是一种用于提升图像对比度的技术,能够通过扩展像素值的动态范围来改善图像质量。具体而言,这种方法通过对图像中的像素值重新分配,使其更均匀地分布在灰度范围内[^1]。 #### 实现过程 在 Python 中,可以利用 OpenCV 库轻松实现直方图均衡化。以下是具体的实现方法: 对于 **灰度图像**,可以直接调用 `cv2.equalizeHist()` 函数完成操作。此函数会自动计算并应用累积分布函数(CDF),从而将输入图像的像素值分布调整为更加均匀的状态[^4]。 ```python import cv2 import matplotlib.pyplot as plt # 加载灰度图像 image_gray = cv2.imread('input_image.jpg', cv2.IMREAD_GRAYSCALE) # 执行直方图均衡化 equalized_image = cv2.equalizeHist(image_gray) # 展示原图与处理后的效果 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1), plt.title("Original Image"), plt.imshow(image_gray, cmap='gray') plt.subplot(1, 2, 2), plt.title("Equalized Image"), plt.imshow(equalized_image, cmap='gray') plt.show() ``` 然而,在实际应用场景中,许多图像都是彩色的。为了对彩色图像进行直方图均衡化,通常需要先将其转换到 YUV 或 LAB 颜色空间,并仅对亮度通道执行均衡化操作后再转回 RGB 空间[^4]。 ```python # 加载彩色图像 image_color = cv2.imread('input_image.jpg') # 转换至YUV颜色空间 image_yuv = cv2.cvtColor(image_color, cv2.COLOR_BGR2YUV) # 对Y通道(亮度)进行直方图均衡化 image_yuv[:, :, 0] = cv2.equalizeHist(image_yuv[:, :, 0]) # 将YUV图像转换回BGR色彩模式 enhanced_image = cv2.cvtColor(image_yuv, cv2.COLOR_YUV2BGR) # 显示结果 plt.figure(figsize=(10, 5)) plt.subplot(1, 2, 1), plt.title("Original Color Image"), plt.imshow(cv2.cvtColor(image_color, cv2.COLOR_BGR2RGB)) plt.subplot(1, 2, 2), plt.title("Enhanced Color Image"), plt.imshow(cv2.cvtColor(enhanced_image, cv2.COLOR_BGR2RGB)) plt.show() ``` #### 进阶技术——CLAHE (Contrast Limited Adaptive Histogram Equalization) 全局直方图均衡化虽然有效,但在某些情况下可能会导致过度放大噪声的效果。因此引入了一种改进算法 CLAHE,它可以局部地应用于图像的不同部分,从而更好地保留细节并减少噪点影响[^2]。 下面是一个使用 CLAHE 处理灰度图像的例子: ```python # 创建CLAHE对象 clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8)) # 应用CLAHE到灰度图像 clipped_equalized_image = clahe.apply(image_gray) # 结果展示 plt.figure(figsize=(10, 5)) plt.subplot(1, 3, 1), plt.title("Original Gray Image"), plt.imshow(image_gray, cmap='gray') plt.subplot(1, 3, 2), plt.title("Global Equalized Image"), plt.imshow(equalized_image, cmap='gray') plt.subplot(1, 3, 3), plt.title("CLAHE Enhanced Image"), plt.imshow(clipped_equalized_image, cmap='gray') plt.show() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值