目录
一、直方图
1、计算并显示直方图
2、使用matplotlib方法绘制直方图(不划分小的子区间)
3、使用opencv的方法绘制直方图 (划分16个小的子亮度区间)
4、绘制彩色图像的直方图,将各个通道的直方图值都画出来
二、直方图均衡化
(1)绘制原图的直方图
(2)绘制经过直方图均衡化后的图片的直方图
(3)自适应直方图均衡化(局部直方图处理)
三、直方图均衡化的应用
1. 增强图像对比度
2. 提升图像视觉效果
3. 统一图像灰度分布
4. 适用于低对比度图像
总结
一、直方图
直方图:是图像中像素强度分布的图形表达方式,统计各个强度像素值的个数。
直方图的作用:例如视频中。通过标记帧和帧之间显著的边缘和颜色的统计变化,来检测视频中场景的变换。
灰度值在0 - 255范围之间总共 256 个值,可以将我们的范围划分为子部分(称为bins),例如我们可以将这些像素亮度值划分为16个区间值,【0,15】、【16,31】,这两个就是两个亮度区间,它表示会统计亮度值在0到15的所有像素点的个数。
1、计算并显示直方图
cv2.calcHist(images,channels,mask,histSize,ranges) 计算图像的直方图,用于表示图像中像素灰度级别的分布情况.
images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]
channels: 表示传入的图像通道数。如果输入图像是灰度图它的值就是 [0]。
如果是彩色图像 的传入的参数可以是 [0][1][2] 它们分别对应着 BGR。
mask: 掩模图像。统计整幅图像的直方图就把它为None。但是如果你想统计图像某一部分的直方图,你就制作一个掩模图像并使用它。
histSize:BINS的数目。也需用中括号括来 (分成多少个区间)
BINS :上面的直方图显示了每个像素值的像素数,即从0到255。即您需要256个值才能显示上述直方图。
但是请考虑一下,如果您不需要单独查找所有像素值的像素数,而是在像素值间隔内查找像素数,
例如,您需要找到介于 0 到 15 之间的像素数,然后是 16 到 31、32到47...、240 到 255。
您只需要 16 个值来表示直方图。
因此,只需将整个直方图拆分为 16 个子部分,每个子部分的值就是其中所有像素计数的总和。
这每个子部分都称为"BIN"。在第一种情况下,条柱数为256(每个像素一个),而在第二种情况下,它只有16。BINS 在 OpenCV 文档中由术语histSize表示。
ranges: 像素值范围常为 [0 256]
2、使用matplotlib方法绘制直方图(不划分小的子区间)
这里使用了 numpy 的 ravel 函数,将多维数组拉成一维数组。
img =cv2.imread('../data/310.jpg',cv2.IMREAD_GRAYSCALE)# 转成一维
a=img.ravel()# 使用 matplotlib 的 hist 函数绘制直方图。
plt.hist(a,bins=256)
plt.show()# 参数解释:
# - a:一维数组,即图像的像素值组成的数组。
# - bins=256:指定直方图的条数,即灰度级的数量。
效果:可以看出下面结果中有0~256的亮度值的统计情况
3、使用opencv的方法绘制直方图 (划分16个小的子亮度区间)
#这里的calcHist参数在上面有介绍,这里是对img图片做直方图统计,采用灰度图,即零通道,未设置掩膜,划分为16个区间,亮度值统计[0,256]的值
phone_hist = cv2.calcHist([img],[0],None,[16],[0,256])
plt.plot(phone_hist)#使用calcHist的值绘制曲线图
plt.show()
效果,统计的值为每个亮度区间内属于该亮度值的像素点个数
4、绘制彩色图像的直方图,将各个通道的直方图值都画出来
img=cv2.imread('zl.jpg')
color=('b','g','r') #设置绘制的折线图每条线的颜色
for i,col in enumerate(color): #依次遍历三个颜色通道histr=cv2.calcHist([img],[i],None,[256],[0,256]) #依次计算每个通道的直方图值plt.plot(histr,color=col) #绘制折线图
plt.show()
效果:分别统计了不同颜色通道下的直方图
二、直方图均衡化
直方图均衡化:直方图均衡化是一种图像增强技术,它可以通过增加图像的对比度和亮度来改善图像的质量。直方图均衡化通过将图像的像素值分布均匀化来实现这一目标。 在Python OpenCV中,可以使用cv2.equalizeHist()函数来实现直方图均衡化。该函数将输入图像转换为灰度图像,并将其像素值分布均匀化,从而增强图像的对比度和亮度。下面是将不均衡的直方图均衡化之后的结果。
(1)绘制原图的直方图
woman = cv2.imread('ja.jpg',cv2.IMREAD_GRAYSCALE)
# # # phone_hist = cv2.calcHist([phone],[0],None,[256],[0,256])
plt.hist(woman.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()
可以看出图像的亮度值集中在50左右
(2)绘制经过直方图均衡化后的图片的直方图
phone_equalize = cv2.equalizeHist(woman)
plt.hist(phone_equalize.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()
与原图对比,直方图均衡化是对全局做均衡化,这使亮度值很大的像素点增多了,表现在图像上就是图像整体变亮。
(3)自适应直方图均衡化(局部直方图处理)
普通直方图均衡化(HE)通过全局灰度变换增强对比度,但对噪声敏感且可能过度放大局部噪声(如暗部噪声)。自适应直方图均衡化(AHE) 将图像划分为多个子块(tiles),对每个子块独立进行直方图均衡化,从而实现局部对比度增强,避免全局均衡化的缺陷。
改进版:限制对比度的自适应直方图均衡化(CLAHE, Contrast-Limited AHE):在 AHE 基础上,通过设定灰度值裁剪阈值(clip limit),防止子块内噪声或纹理被过度增强,是实际应用中更常用的方法。
主要优点
- 局部对比度增强:针对不同区域的局部特征调整对比度,适合光照不均或局部细节丰富的图像(如医学影像、卫星图像)。
- 抑制噪声放大:通过裁剪阈值(clip limit)限制子块内直方图的峰值,避免噪声或纹理被过度增强。
- 保留细节与自然感:相比全局均衡化,CLAHE 在增强局部细节的同时,减少过增强导致的伪影(如棋盘效应)。
函数:cv2.createCLAHE([, clipLimit[, tileGridSize]])
参数说明: clipLimit:设定子块内直方图均衡化时的灰度值裁剪阈值,单位为 “像素数 / 面积”(即每个灰度级允许的最大像素数密度)。可选项,默认值 8 titleGridSize:设定子块的大小(行数 × 列数),单位为像素。可选项,默认值 (8,8)。
- titleGridSize取值影响:
- 较小尺寸(如 4x4):局部细节增强更精细,但计算量增加,可能引入棋盘效应(需通过插值缓解)。
- 较大尺寸(如 16x16):局部处理更粗糙,适合全局对比度增强需求,减少分块边界的影响。
创建一个自适应直方图对像,并将上面的woman这张图像传入
clahe = cv2.createCLAHE(clipLimit=1, tileGridSize=(16,16))#通过类创建了一个局部均衡化对象
phone_clahe = clahe.apply(woman)
plt.hist(phone_clahe.ravel(), bins=256)#numpy中的ravel将数组多维度拉成一维数组
plt.show()
自适应直方图均衡化则是划分子块均衡化会减少分块边界的影响。
使用hstack()函数水平堆叠上面的三张图片用于对比,直方图均衡化与自适应直方图均衡化的区别
hstack
(hconcat
):水平堆叠,沿列方向扩展。vstack
(vconcat
):垂直堆叠,沿行方向扩展(对应函数为np.vstack
和cv2.vconcat
)。
res = np.hstack((woman,phone_equalize,phone_clahe))
cv2.imshow('phone_equalize',res)
cv2.waitKey(0)
从左到右依次是原图、直方图均衡化、自适应直方图均衡化
三、直方图均衡化的应用
1. 增强图像对比度
- 原理:将图像中原本集中的灰度范围 “拉伸” 到更宽的动态范围,使图像中不同灰度级的像素分布更均匀(直方图趋于平坦)。
- 效果:让原本对比度低、细节模糊的图像(如暗部过暗或亮部过亮)变得更清晰,暗部和亮部的细节更容易分辨。
- 示例:在医学影像(如 X 光片)中,均衡化可增强组织间的对比度,便于医生观察病灶。
2. 提升图像视觉效果
- 通过均衡化,图像中原本难以区分的灰度区域(如相近的明暗过渡)会变得层次分明,整体视觉效果更自然。
-
例如:修复老照片时,均衡化可改善因曝光不足或过度导致的细节丢失。
3. 统一图像灰度分布
- 将图像的灰度直方图调整为近似均匀分布,使像素灰度值覆盖更广泛的范围。
- 这为后续的图像处理任务(如图像分割、特征提取、模式识别等)提供更优质的输入,提升算法效果。
4. 适用于低对比度图像
- 特别适合处理因光照不均、传感器噪声等导致对比度低下的图像(如阴天拍摄的照片、卫星遥感图像),通过均衡化恢复图像细节。
总结
直方图均衡化通过重新分配像素的灰度值,将图像的动态范围最大化利用,使图像从 “对比度不足” 转变为 “层次丰富”,是图像处理中基础且高效的增强手段。其本质是通过数学变换(累积分布函数,CDF)实现灰度的非线性映射,从而优化视觉效果和后续处理的可行性。