一、均衡化原理
均衡化是一种用于提升图像质量的技术。均衡化可以增强图像的对比度,使得图像中的细节更加清晰可见。
均衡化的原理是通过重新分配图像的像素值来实现。它基于图像的直方图,将像素值在整个像素范围内进行重新分布,使得图像的亮度分布更加均匀。这样可以增强图像的细节和边缘,并改善整体的视觉效果。在均衡化过程中,首先计算图像的累积直方图,然后将像素值映射到新的像素值,使得累积直方图变得均匀分布。这样,原本过暗或过亮的区域将得到适当的调整,从而提高图像的质量。
均衡化是图像处理中常用的一种增强技术,适用于各种类型的图像,包括黑白图像和彩色图像。它可以用于改善图像的显示效果,增强图像的细节,并提升图像的可视性。使用均衡化技术可以使图像更加清晰明亮,对于一些需要突出细节的应用场景特别有用,如医学影像分析、图像识别等领域。
均衡化方法分类:直方图均衡化(HE)、自适应直方图均衡化(AHE)、对比度受限制自适应直方图均衡化(CLAHE)
二、直方图均衡化(HE)
直方图均衡化的原理是通过重新分配图像的像素值来实现。它基于图像的直方图,将像素值在整个像素范围内进行重新分布,使得图像的亮度分布更加均匀。这样可以增强图像的细节和边缘,并改善整体的视觉效果。
设原始图像为 I I I,其灰度级范围为 [ 0 , L − 1 ] [0, L-1] [0,L−1],其中 L L L 是灰度级的数量。设 n i n_i ni为原始图像中灰度级为 i i i的像素数(即直方图中的频数),则 p i = n i N p_i=\frac{n_i}{N} pi=Nni 表示灰度级为 i i i 的像素在图像中的占比,其中 N N N 是图像的总像素数。
直方图均衡化的目标是将原始图像的灰度级分布变换为均匀分布,即使得变换后的图像具有平坦的直方图。为了实现这个目标,可以通过**累积分布函数(CDF)**来进行变换。
CDF 表示在某一灰度级以下的像素的累积占比。设 s i s_i si 表示灰度级为 i i i 的像素在均衡化后的图像中的灰度级值,则有 s i = L − 1 ∑ j = 0 i p j s_i = \frac{L-1}{\sum_{j=0}^{i}p_j} si=∑j=0ipjL−1。
对图像中的每个像素,将其灰度级值替换为对应的 s i s_i si,即可得到均衡化后的图像。
import cv2
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('car.jpg', cv2.IMREAD_GRAYSCALE)
if image is None:
print("Could not read the image.")
else:
equalized_image = cv2.equalizeHist(image)
# 创建两个子图
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
# 显示原始图像和HE处理后的图像
axs[0, 0].imshow(image, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 1].imshow(equalized_image, cmap='gray')
axs[0, 1].set_title('HE Image')
# 绘制原始图像和HE处理后的直方图
axs[1, 0].hist(image.ravel(), bins=256, range=(0, 256), color='r', alpha=0.7)
axs[1, 0].set_title('Histogram of Original Image')
axs[1, 1].hist(equalized_image.ravel(), bins=256, range=(0, 256), color='g', alpha=0.7)
axs[1, 1].set_title('Histogram of HE Image')
# 调整子图之间的间距
plt.tight_layout(pad=2.0)
# 显示子图
plt.show()
思考:如何使用简单的网络达到HE的效果??
trick:主要是损失函数的构造,比如可以使用 MSELoss + 对比度度量 + 卡方距离(衡量直方图相似性的度量)+ SSIM 等组成 (后续将提出HE的深度学习版本)
三、自适应直方图均衡化(AHE)
自适应直方图均衡化(Adaptive Histogram Equalization,AHE)是一种改进的均衡化方法,可以更好地处理图像中不均匀的亮度分布。与直方图均衡化相比,AHE将图像分成小块,并对每个小块进行均衡化处理,从而提高了对比度的增强效果。
AHE的目标是将每个小块内的灰度级分布变换为均匀分布。为了实现这个目标,可以通过**累积分布函数(CDF)**来进行变换。CDF 表示在某一灰度级以下的像素的累积占比。设 s i s_i si 表示灰度级为 i i i 的像素在均衡化后的图像中的灰度级值,则有 s i = L − 1 ∑ j = 0 i p j s_i = \frac{L-1}{\sum_{j=0}^{i}p_j} si=∑j=0ipjL−1。
对对应小块中的每个像素,将其灰度级值替换为对应的 s i s_i si ,即可得到自适应均衡化后的图像。
AHE方法广泛应用于医学影像处理、图像增强等领域,能够有效改善图像的视觉效果和细节可见性。
import cv2
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('car.jpg', cv2.IMREAD_GRAYSCALE)
if image is None:
print("Could not read the image.")
else:
# 创建AHE对象
clahe = cv2.createCLAHE(clipLimit=0.0, tileGridSize=(8, 8))
# 对图像进行CLAHE处理
equalized_image = clahe.apply(image)
# 创建两个子图
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
# 显示原始图像和AHE处理后的图像
axs[0, 0].imshow(image, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 1].imshow(equalized_image, cmap='gray')
axs[0, 1].set_title('AHE Image')
# 绘制原始图像和AHE处理后的直方图
axs[1, 0].hist(image.ravel(), bins=256, range=(0, 256), color='r', alpha=0.7)
axs[1, 0].set_title('Histogram of Original Image')
axs[1, 1].hist(equalized_image.ravel(), bins=256, range=(0, 256), color='g', alpha=0.7)
axs[1, 1].set_title('Histogram of AHE Image')
# 调整子图之间的间距
plt.tight_layout(pad=2.0)
# 显示子图
plt.show()
自适应直方图均衡化器通过cv2.createCLAHE()
函数创建,可以设置对比度限制(clipLimit
)和小块的大小(tileGridSize
)。对比度限制用于控制均衡化后的图像对比度增强的程度,小块的大小决定了均衡化的局部性。
AHE方法广泛应用于医学影像处理、图像增强等领域,能够有效改善图像的视觉效果和细节可见性。
四、对比度受限制自适应直方图均衡化(CLAHE)
CLAHE通过限制局部直方图的高度来限制噪声放大和局部对比度增强。该方法将图像划分为多个子区域, 然后对每个子区域的直方图进行分类。再对每个子区域分别进行直方图均衡化,最后通过对每个子区域进行对比度的限制,以此实现对比度受限自适应直方图均衡化图像增强个像素进行插值运算来获得变换后的灰度值
CLAHE与AHE不同的地方是增加对比度限幅,这就可以克服AHE的过度放大噪声的问题:
import cv2
import matplotlib.pyplot as plt
# 读取图像
image = cv2.imread('car.jpg', cv2.IMREAD_GRAYSCALE)
if image is None:
print("Could not read the image.")
else:
# 创建CLAHE对象
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
# 对图像进行CLAHE处理
equalized_image = clahe.apply(image)
# 创建两个子图
fig, axs = plt.subplots(2, 2, figsize=(10, 10))
# 显示原始图像和CLAHE处理后的图像
axs[0, 0].imshow(image, cmap='gray')
axs[0, 0].set_title('Original Image')
axs[0, 1].imshow(equalized_image, cmap='gray')
axs[0, 1].set_title('CLAHE Image')
# 绘制原始图像和CLAHE处理后的直方图
axs[1, 0].hist(image.ravel(), bins=256, range=(0, 256), color='r', alpha=0.7)
axs[1, 0].set_title('Histogram of Original Image')
axs[1, 1].hist(equalized_image.ravel(), bins=256, range=(0, 256), color='g', alpha=0.7)
axs[1, 1].set_title('Histogram of CLAHE Image')
# 调整子图之间的间距
plt.tight_layout(pad=2.0)
# 显示子图
plt.show()
五、总结
HE(直方图均衡化)、AHE(自适应直方图均衡化)和CLAHE(对比度受限制的自适应直方图均衡化)都是用于图像增强的方法,它们在处理图像对比度不足或不均匀光照等问题时有各自的优点和缺点。
直方图均衡化(HE):
- 优点:
- 简单且易于实现。
- 可以有效增强图像的对比度,特别是当图像的直方图分布不均匀时。(对于本car例子效果还是很不错的)
- 缺点:
- 不适用于所有类型的图像,可能会导致图像噪声的增加。(因为要考虑整体像素区间的平均)
- 无法保留图像的原始细节。
自适应直方图均衡化(AHE):
- 优点:
- 通过局部均衡化,能够在不同区域中自适应地增强对比度。
- 可以避免全局直方图均衡化可能引入的噪声问题。
- 缺点:
- 计算复杂度高,因为它需要对图像中的每个小区域进行均衡化。
- 可能会引入均衡化噪声,尤其是在光照变化较大的区域。(可以看到本car例子中车子靠近车轮反光较为严重的位置)
对比度受限制的自适应直方图均衡化(CLAHE):
- 优点:
- 类似于AHE,它能够在不同区域中自适应地增强对比度。
- 引入了对比度限制,以避免过度增强噪声。
- 相对于AHE,计算开销较小,因为它将图像分成较大的块进行均衡化。
- 缺点:
- 有时可能会导致块状伪影,特别是在图像中存在急剧对比度变化的区域。
- 需要根据特定的应用来调整
clipLimit
参数,这可能需要一些经验。
总的来说,HE是最简单的直方图均衡化方法,但在某些情况下可能不适用。AHE和CLAHE更适合处理具有局部对比度变化的图像,但它们的计算成本较高,而CLAHE则通过对比度限制来抑制噪声。选择适当的方法通常取决于特定应用和图像的要求。
项目及数据链接:数据集及对应项目链接