理论讲完了,咱们来动手试试!用Python实现直方图均衡化就像做一道简单的家常菜,只需要准备两个"食材":
OpenCV库:负责读取、显示和处理图像
NumPy库:负责数值计算
如果你还没有这些库,可以先在终端里输入这行命令安装:
pip install opencv-python numpy
然后复制下面这段代码,保存为histogram_equalization.py,运行后就能看到直方图均衡化的效果啦!
# 导入需要的库
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 读取灰度图像
gray_image = cv2.imread('images/gray_image.jpg', cv2.IMREAD_GRAYSCALE)
# 方法1:使用OpenCV内置函数实现直方图均衡化
equalized_image = cv2.equalizeHist(gray_image)
# 方法2:手动实现直方图均衡化(仅作演示,实际应用中推荐使用OpenCV内置函数)
def manual_histogram_equalization(image):
# 计算图像直方图
hist = cv2.calcHist([image], [0], None, [256], [0, 256])
# 计算累积分布函数(CDF)
cdf = hist.cumsum()
# 归一化CDF
cdf_normalized = cdf / cdf.max()
# 应用直方图均衡化
equalized = np.interp(image.flatten(), np.arange(256), cdf_normalized * 255)
return equalized.reshape(image.shape).astype(np.uint8)
# 手动实现的直方图均衡化
manual_equalized = manual_histogram_equalization(gray_image)
# 显示原图和均衡化后的图像
plt.figure(figsize=(18, 10))
# 显示原图
plt.subplot(231)
plt.imshow(gray_image, cmap='gray')
plt.title('灰度原图')
plt.axis('off')
# 显示原图直方图
plt.subplot(232)
plt.hist(gray_image.ravel(), 256, [0, 256])
plt.title('原图直方图')
plt.xlabel('亮度值')
plt.ylabel('像素数量')
# 显示OpenCV均衡化结果
plt.subplot(233)
plt.imshow(equalized_image, cmap='gray')
plt.title('OpenCV直方图均衡化')
plt.axis('off')
# 显示OpenCV均衡化后的直方图
plt.subplot(234)
plt.hist(equalized_image.ravel(), 256, [0, 256])
plt.title('均衡化后直方图')
plt.xlabel('亮度值')
plt.ylabel('像素数量')
# 显示手动均衡化结果
plt.subplot(235)
plt.imshow(manual_equalized, cmap='gray')
plt.title('手动直方图均衡化')
plt.axis('off')
# 显示手动均衡化后的直方图
plt.subplot(236)
plt.hist(manual_equalized.ravel(), 256, [0, 256])
plt.title('手动均衡化后直方图')
plt.xlabel('亮度值')
plt.ylabel('像素数量')
plt.tight_layout()
plt.show()
# 保存均衡化后的图像
cv2.imwrite('images/equalized_image.jpg', equalized_image)
print('均衡化图像已保存!')
💡 小技巧:直方图均衡化虽然能提升图像对比度,但并不是所有图像都适合使用。对于已经有良好对比度的图像,过度均衡化可能会导致噪声放大,影响图像质量。