一、引言
直方图均衡化是一种用于增强图像对比度的图像处理技术。它的原理是通过重新分布图像的像素值,使图像的直方图变得更加均匀,从而增强图像中不同区域的亮度差异,使图像更具视觉吸引力和清晰度。
二、原理解释
-
计算原始图像的直方图:
- 首先,对输入的图像进行灰度化处理,将彩色图像转换为灰度图像。
- 然后,计算灰度图像的直方图,直方图是一个表示不同灰度级别在图像中出现频率的图表。
-
计算累积直方图:
- 累积直方图是将每个灰度级别的频率累积起来的直方图。
- 累积直方图的目的是为了确定每个灰度级别在均衡化后图像中所占的比例。
-
均衡化像素值:
- 对于每个像素,使用累积直方图来映射原始灰度级别到新的灰度级别。
- 这个映射过程将使直方图变得更加均匀,以便更多的像素值可以覆盖整个灰度范围。
-
创建均衡化后的图像:
- 使用映射后的灰度级别替代原始图像中的每个像素值。
- 这将生成一个均衡化后的图像,其中亮度差异更加明显,对比度增强。
-
优点和应用:
- 直方图均衡化可以用于图像增强、目标检测、图像分割和计算机视觉中的许多应用,特别是在具有低对比度的图像中。
- 它帮助凸显图像中的细节,改善可视化效果。
三、代码实现
img = cv2.createCLAHE(clipLimit=None, tileGridSize=None)
参数说明:
clipLimit
:对比度的阈值,用于限制直方图的幅度,通常设置为8.0~40.0之间。tileGridSize
:分割图像为小块的大小,通常设置为(8,8)。
import cv2
from matplotlib import pyplot as plt
import numpy as np
face = cv2.imread('face1.jpg', cv2.IMREAD_GRAYSCALE) # 将图像读取为灰度图像
phone_hist = cv2.calcHist([face], [0], None, [256], [0, 256])
plt.hist(face.ravel(), bins=256) # numpy中的ravel将数组多维度拉成一维数组
plt.show()
face_equalize = cv2.equalizeHist(face)
plt.hist(face_equalize.ravel(), bins=256) # numpy中的ravel将数组多维度拉成一维数组
plt.show()
res = np.hstack((face, face_equalize)) # 横向拼接,将多个数组按水平方向(列顺序)堆叠成一个新的数组。
cv2.imshow('face_equalize', res)
cv2.waitKey(100000)
clahe = cv2.createCLAHE(clipLimit=1.0, tileGridSize=(16, 16)) # 通过类创建了一个局部均衡化对象
face_clahe = clahe.apply(face)
res = np.hstack((face, face_equalize, face_clahe))
cv2.imshow('face_equalize', res)
cv2.waitKey(100000)
运行结果:
四、总结
然而,需要注意的是,直方图均衡化可能会导致一些不希望的效果,如图像的噪声增强和失真。因此,在应用均衡化时,需要谨慎选择合适的参数和调整,以确保最佳的结果。