【数字图像处理】直方图均衡化

文章目录

  • 1. 算法原理
  • 2. 算法缺陷及改进
    • 2.1 缺陷
    • 2.2 改进
  • 3. 实现
    • 3.1 调包侠版本
    • 3.2 自由发挥版本

1. 算法原理

直方图均衡化是一种常见的图像增强方法,可以增强图像的对比度。其数学原理如下:

首先,我们需要了解直方图的概念。直方图是对图像像素分布的一种统计,它将每个像素值出现的次数记录下来,并以图形的方式呈现出来。在一幅图像中,像素值的范围通常是有限的。例如,对于一个 8 位灰度图像,像素值的范围是 0 到 255。

直方图均衡化的目的是将一幅图像的直方图变成一个均匀分布的直方图,从而增强图像的对比度。具体来说,直方图均衡化的步骤如下:

  1. 统计原始图像的直方图。我们可以计算每个像素值出现的次数,然后将它们归一化,得到每个像素值的频率。

  2. 计算累计分布函数(CDF)。CDF 是对频率分布函数(PDF)的积分,它表示每个像素值在原始图像中出现的概率。CDF 可以通过对 PDF 进行累加计算得到。对于一个灰度值 i,CDF 的计算公式如下:
    在这里插入图片描述
    其中, P ( j ) P(j) P(j) 表示灰度值为 j j j 的像素在图像中出现的频率。

  3. 计算均衡化后的像素值。我们需要将原始图像中的每个像素值映射到一个新的像素值,使得均衡化后的直方图近似为一个均匀分布的直方图。这个映射函数可以通过以下公式计算:
    在这里插入图片描述
    其中, H ( i ) H(i) H(i) 表示映射后的像素值, M M M N N N 分别表示图像的宽度和高度, L L L 表示像素值的范围, m i n min min 表示原始图像中的最小像素值。

  4. 将原始图像中的像素值替换为映射后的像素值。这样就完成了直方图均衡化的过程。

总的来说,直方图均衡化的数学原理就是通过对原始图像的直方图进行变换,将其变成一个均匀分布的直方图,从而增强图像的对比度。

2. 算法缺陷及改进

2.1 缺陷

尽管直方图均衡化是一种简单且有效的图像增强算法,但它也存在一些缺陷:

  1. 全局变换:直方图均衡化是一种全局变换方法,它将整个图像的直方图都变成了均匀分布的直方图,这可能会导致一些像素值的细节信息丢失或被模糊化。

  2. 非线性变换:直方图均衡化的映射函数是非线性的,这意味着它会改变像素值之间的距离,从而可能导致一些图像特征的失真。

  3. 计算复杂度:直方图均衡化需要计算原始图像的直方图和累计分布函数,这可能会增加算法的计算复杂度,尤其是对于大型图像。

  4. 对噪声敏感:由于直方图均衡化是一种全局变换,它对图像中的噪声也会进行增强,可能会使噪声更加明显。

因此,在实际应用中,直方图均衡化算法可能需要结合其他方法进行优化或改进,以克服其缺陷。例如,可以使用局部直方图均衡化等技术来改进算法的局限性。

2.2 改进

限制对比度自适应直方图均衡化(CLAHE)是一种改进的直方图均衡化算法,它通过在图像的局部区域内进行直方图均衡化,以保留图像的局部细节信息。

CLAHE 的基本原理如下:

  1. 将原始图像分成许多小块(或称为子图像),每个小块大小为 N × N N \times N N×N

  2. 对于每个小块,计算其直方图,并将直方图进行均衡化,得到映射函数。

  3. 对于每个小块,使用对应的映射函数对其像素值进行变换。

  4. 由于像素值在小块之间可能存在不连续的变化,因此需要进行插值处理,以使得整个图像的对比度保持连续。

CLAHE 的优点如下:

  1. 保留了图像的局部细节信息,不会将整个图像都变成均匀分布的直方图。

  2. 具有自适应性,可以根据图像的局部特征来调整直方图均衡化的参数。

  3. 通过限制对比度,可以有效地减少直方图均衡化算法对噪声的敏感性。

CLAHE 的缺点如下:

  1. 对计算资源的要求较高,需要对整个图像进行分块、直方图均衡化和插值处理,因此计算量较大。

  2. 对算法的参数设置较为敏感,需要合理地设置参数,以获得良好的增强效果。

  3. 由于对比度的限制,可能会导致一些像素值的变化受到限制,从而降低图像的视觉效果。

综上所述,CLAHE 是一种比较优秀的图像增强算法,可以有效地保留图像的局部细节信息,但其计算量较大,对算法的参数设置较为敏感,需要进行合理的参数设置和优化。

3. 实现

3.1 调包侠版本

import cv2
import numpy as np
import matplotlib.pyplot as plt

# 读取原始图像
img = cv2.imread('example.jpg', 0)

# 判断图像是否为灰度图
if len(img.shape) == 2:
    print('The image is a grayscale image.')
else:
    # 将RGB图像转换为灰度图像
    img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    print('The image is a RGB image. Converting to grayscale...')

# 降低图像的对比度
img = img.astype(np.float32) / 255.0
img_low_contrast = np.power(img, 2.2) * 255.0

# 将图像转换为uint8
img_low_contrast = np.uint8(img_low_contrast)
# 进行直方图均衡化
img_he = cv2.equalizeHist(img_low_contrast)
# 进行自适应直方图均衡化
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
img_clahe = clahe.apply(img_low_contrast)

# 显示原始图像、降低对比度后的图像和均衡化后的图像
plt.subplot(221), plt.imshow(img, cmap='gray')
plt.title('Original Image'), plt.xticks([]), plt.yticks([])
plt.subplot(222), plt.imshow(img_low_contrast, cmap='gray')
plt.title('Low Contrast Image'), plt.xticks([]), plt.yticks([])
plt.subplot(223), plt.imshow(img_he, cmap='gray')
plt.title('Equalized Image'), plt.xticks([]), plt.yticks([])
plt.subplot(224), plt.imshow(img_clahe, cmap='gray')
plt.title('Adaptive Equalized Image'), plt.xticks([]), plt.yticks([])
plt.show()

【数字图像处理】直方图均衡化_第1张图片

3.2 自由发挥版本

TODO

你可能感兴趣的:(图像处理基础,图像处理)