图像处理中的直方图均衡化:原理与实现
目录
一、直方图是什么?
二、绘制直方图
代码示例
运行结果
三、直方图均衡化
1. 全局直方图均衡化
代码示例
运行结果
四、自适应直方图均衡化
1. 对比度受限的自适应直方图均衡化(CLAHE)
代码示例
运行结果
五、总结
在图像处理中,直方图均衡化是一种常用的图像增强技术,它可以帮助我们改善图像的对比度和亮度,使图像的细节更加清晰。本文将详细介绍直方图均衡化的原理和实现方法,并通过代码示例进行说明。
一、直方图是什么?
直方图是一种统计工具,用于表示图像中像素值的分布情况。具体来说,直方图的横坐标是像素值(从 0 到 255),纵坐标是每个像素值出现的频率(即像素数量)。通过直方图,我们可以直观地了解图像的亮度分布情况。
例如,如果一幅图像的直方图集中在左侧(低灰度值区域),说明图像整体偏暗;如果集中在右侧(高灰度值区域),说明图像整体偏亮。
二、绘制直方图
在 OpenCV 中,可以使用 cv2.calcHist()
函数来计算图像的直方图。这个函数会返回一个数组,表示每个灰度值的像素数量。
代码示例
以下是一个绘制直方图的函数:
import cv2
import numpy as npdef show_bins(img2):# 计算直方图bins = cv2.calcHist([img2], [0], None, [256], [0, 256])print(bins)# 获取直方图的最小值和最大值min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(bins)print(min_val, max_val, min_loc, max_loc)# 创建一个空白图像用于绘制直方图img_bins = np.zeros((512, 512, 3), dtype=np.uint8)dm = 450 / max_val # 缩放比例# 绘制直方图for index, el in enumerate(bins):cv2.line(img_bins, (index + 100, 490), (index + 100, int(490 - el[0] * dm)), (0, 0, 255), 2)cv2.imshow("img_bins", img_bins)cv2.waitKey(0)return img_bins
运行结果
运行上述代码后,你会看到一个窗口显示了图像的直方图。横坐标是像素值,纵坐标是每个像素值的频率。
三、直方图均衡化
直方图均衡化是一种改善图像对比度的技术。它的目标是将图像的直方图分布调整为均匀分布,从而使图像的亮度和对比度更加均衡。
1. 全局直方图均衡化
全局直方图均衡化是对整个图像进行均衡化处理。它通过重新映射像素值,使图像的直方图分布更加均匀。
在 OpenCV 中,可以使用 cv2.equalizeHist()
函数来实现全局直方图均衡化。
代码示例
def test002():# 读取图像img = cv2.imread("./zhifang.png")img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 绘制原始图像的直方图bins_img = show_bins(img2)cv2.imshow("bins_img", bins_img)cv2.imshow("img2", img2)# 进行直方图均衡化eq_img2 = cv2.equalizeHist(img2)eq_bins_img = show_bins(eq_img2)cv2.imshow("eq_bins_img", eq_bins_img)cv2.imshow("eq_img2", eq_img2)cv2.waitKey(0)cv2.destroyAllWindows()
运行结果
运行上述代码后,你会看到均衡化后的图像对比度明显提高,直方图分布也更加均匀。
四、自适应直方图均衡化
全局直方图均衡化虽然可以改善图像的整体对比度,但在某些情况下可能会导致局部细节丢失。为了解决这个问题,可以使用自适应直方图均衡化(AHE)。
自适应直方图均衡化将图像划分为多个小块,对每个小块分别进行直方图均衡化处理。这样可以更好地保留局部细节。
1. 对比度受限的自适应直方图均衡化(CLAHE)
CLAHE 是一种改进的自适应直方图均衡化方法,它通过限制对比度增强的程度,避免了噪声的过度放大。
在 OpenCV 中,可以使用 cv2.createCLAHE()
函数来创建 CLAHE 对象,然后使用 .apply()
方法对图像进行均衡化处理。
代码示例
import cv2
import numpy as npdef test_clahe():# 读取图像img = cv2.imread("./zhifang.png")img2 = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 创建 CLAHE 对象clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))# 应用 CLAHEclahe_img2 = clahe.apply(img2)# 绘制原始图像和均衡化后的图像cv2.imshow("Original Image", img2)cv2.imshow("CLAHE Image", clahe_img2)cv2.waitKey(0)cv2.destroyAllWindows()
运行结果
运行上述代码后,你会看到 CLAHE 处理后的图像对比度更高,同时局部细节也得到了更好的保留。
五、总结
直方图均衡化是一种非常实用的图像增强技术,可以帮助我们改善图像的对比度和亮度。通过本文的介绍和代码示例,相信你已经对直方图均衡化有了更深入的理解。
-
全局直方图均衡化:适用于整体对比度较低的图像。
-
自适应直方图均衡化(CLAHE):适用于局部对比度较低且需要保留细节的图像。