直方图均衡化是一种增强图像对比度的方法,特别是在图像的对比度较低时非常有用。这种方法通过调整图像的直方图来改善图像的视觉效果。直方图均衡化会将原始图像的直方图从一个形状改变为另一个形状,使得图像的灰度级分布更加均匀,从而增加图像的全局对比度。
直方图:是一个反映图像像素分布的统计图,其横坐标就是图像像素的取值,纵坐标是该像素的个数。通俗的说,就是对一张图像中不同像素值的像素点的个数的统计。
我们可以分别计算每个通道(如R、G、B)的直方图。直方图可以帮助我们了解图像的亮度、对比度等信息。例如,如果直方图集中在低灰度区域,说明图像偏暗;如果直方图分布均匀,说明图像对比度较好。
代码实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 读取图像
#img = cv2.imread('./images/png/test01.png', cv2.IMREAD_GRAYSCALE)
img = cv2.imread('./images/jpg/ct_sample02.jpg', cv2.IMREAD_GRAYSCALE)
# 将图片从BGR转换为RGB
src_img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#img = cv2.imread('./EqualizeHistogram.jpg', cv2.IMREAD_GRAYSCALE)
# 计算直方图
hist = cv2.calcHist([img], [0], None, [256], [0, 256])
#src_img = mpimg.imread('./images/jpg/ct_sample02.jpg')
# 绘制直方图
plt.subplot(1, 2, 1)
plt.imshow(src_img)
plt.title('Original Image')
plt.xlabel('')
plt.ylabel('')
plt.subplot(1, 2, 2)
plt.plot(hist)
plt.title('Grayscale Histogram')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()

代码实现:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 读取彩色图像
image_color = cv2.imread('./images/png/test01.png')
src_img = cv2.cvtColor(image_color, cv2.COLOR_BGR2RGB)
# 分离各个颜色通道
b, g, r = cv2.split(image_color)
# 计算并绘制每个通道的直方图
hist_b = cv2.calcHist([b], [0], None, [256], [0, 256])
hist_g = cv2.calcHist([g], [0], None, [256], [0, 256])
hist_r = cv2.calcHist([r], [0], None, [256], [0, 256])
# 绘制彩色直方图
# 绘制直方图
plt.subplot(1, 2, 1)
plt.imshow(src_img)
plt.title('Original Image')
plt.xlabel('')
plt.ylabel('')
plt.subplot(1, 2, 2)
plt.plot(hist_b, color='b')
plt.plot(hist_g, color='g')
plt.plot(hist_r, color='r')
plt.title('Color Histogram')
plt.xlabel('Pixel intensity')
plt.ylabel('Frequency')
plt.xlim([0, 256])
plt.show()

直方图均衡化(Histogram Equalization)是一种增强图像对比度(Image Contrast)的方法,其主要思想是将一副图像的直方图分布变成近似均匀分布,从而增强图像的对比度。直方图均衡化的核心目标是通过调整图像的灰度分布,使图像的亮度分布更加均匀,从而提升图像的对比度。其基本思想是将原始图像的直方图通过一种映射函数转换为均匀分布的形式。
直方图均衡化的意义主要体现在以下几个方面:
增强图像对比度 - 原理:通过重新分配像素灰度值,使原本集中在狭窄范围内的灰度分布变得广泛且均匀,从而拉伸图像的动态范围。 - 效果:提升暗区或亮区的细节可见性,例如医学影像中隐藏的病灶或卫星图中细微的地形差异。
改善视觉效果 - 主观优化:使图像整体更清晰、层次更分明,适用于摄影、艺术设计等领域,增强视觉吸引力。 - 适用场景:低对比度图像(如雾天拍摄或背光环境)经处理后更易观察。
归一化预处理 - 标准化作用:统一不同光照条件下的图像对比度,减少后续算法(如目标检测、分类)的输入差异,提升模型鲁棒性。 - 跨设备兼容:不同传感器采集的图像经均衡化后,特征提取更一致。
突出细节信息 - 细节增强:通过扩展高频率灰度区域(如边缘、纹理),强化图像中的结构性信息,对图像分析(如边缘检测、分割)有辅助作用。
直方图均衡化通过重新分布像素灰度值,有效改善图像对比度与细节表现,是图像处理中的基础且关键的技术。实际应用中需结合具体场景权衡其效果与潜在副作用(如噪声),必要时采用改进算法或与其他技术结合使用。
代码示例:
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
# 读取图像
image = cv2.imread('./images/jpg/ct_sample01.jpg', cv2.IMREAD_GRAYSCALE)
# 应用直方图均衡化
equ_image = cv2.equalizeHist(image)
# 显示原始图像和均衡化后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Equalized Image', equ_image)
cv2.imwrite('./EqualizeHistogram.jpg',equ_image)
# 计算直方图
hist1 = cv2.calcHist([image], [0], None, [256], [0, 256])
src_img = mpimg.imread('./EqualizeHistogram.jpg')
hist2 = cv2.calcHist([src_img], [0], None, [256], [0, 256])
plt.subplot(1, 2, 1)
plt.plot(hist1)
plt.title('Grayscale Histogram Original')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.subplot(1, 2, 2)
plt.plot(hist2)
plt.title('Grayscale Histogram Equalize')
plt.xlabel('Pixel Value')
plt.ylabel('Frequency')
plt.show()
# 等待按键后关闭所有窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

