提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
一,简介
图像直方图是图像处理领域中的一个核心概念,它揭示了图像中不同灰度级像素的分布规律。具体而言,通过统计图像中每个灰度级的像素数量或概率,我们构建出图像的直方图,从而获得像素分布的详尽视图。
在图像处理的多个环节中,直方图扮演着至关重要的角色。例如,在图像增强领域,直方图均衡化和规定化技术被用来优化对比度和视觉表现。在图像分割任务中,直方图的双峰特性被利用来设定阈值,以便准确地区分图像的前景和背景。在图像分析过程中,直方图作为特征向量,用于解析图像的统计特征并进行分类。此外,在图像复原方面,直方图有助于分析图像退化的模型,而在图像压缩中,它则用于优化编码过程,如霍夫曼编码中的码字分配。同时,直方图还用于图像质量评估,通过比较处理前后直方图的变化来衡量图像处理的效果。
综上所述,图像直方图是图像处理与分析中不可或缺的工具,它以一种简洁而有效的方式揭示了图像内容的统计特性,并在图像处理的广泛领域中得到了广泛应用。
二,获取图像的直方图
图像直方图因其在计算上的高效性以及对图像变换如平移、旋转和缩放的鲁棒性,被广泛应用于多个图像处理领域,包括灰度图像的阈值分割和基于颜色的图像检索等。在OpenCV这一广泛使用的计算机视觉库中,提供了一个专门的函数cv2.calcHist,用于计算图像的直方图。图像的直方图有两个轴,横轴:表示图像中的灰度级,通常灰度范围是从0到L-1,其中L是图像中可能的灰度级总数,
纵轴:表示各个灰度级像素的数量或者该灰度级像素出现的概率。该函数的调用方式如下:cv2.calcHist(images, channels, mask, histSize, ranges, hist=None, accumulate=None),通过此函数,用户可以轻松获取图像的直方图,进而进行后续的图像分析和处理工作。
函数说明:
输入:
images: 这是一个图像数组的列表,可以是单张图像或多张图像的列表。对于彩色图像,通常是 [image]。
channels: 这是一个整数或整数数组,指定了计算直方图的通道。例如,如果输入是灰度图像,它的值是 [0];如果是彩色图像,可以是 [0]、[1] 或 [2] 分别代表蓝色、绿色或红色通道,或者 [0, 1, 2] 来计算所有通道的直方图。
mask: 这是一个可选参数,用于指定计算直方图的图像区域。如果指定了掩码,则只计算掩码中非零像素对应的直方图。如果没有提供掩码(默认值),则计算整个图像的直方图。
histSize: 这是一个整数或整数数组,代表直方图每个维度的直方图大小。例如,如果直方图是一维的,且灰度级范围是0到255,histSize 可以是 [256]。
ranges: 这是一个浮点数数组,代表每个维度直方图的边界值。对于灰度图像,通常是 [0, 256],表示灰度值的范围。
hist: 这是一个可选的输出参数,用于存储计算得到的直方图。如果这个参数没有指定,函数会分配并返回新的直方图。
accumulate: 这是一个可选的布尔参数。如果设置为 True,直方图在计算过程中会累加,这对于在多个图像上逐步构建直方图很有用。默认值为 False。
该函数返回计算得到的直方图hist,它是一个二维数组,其中第一维是直方图的维度,第二维是直方图的每个箱子(bin)的计数。如果输入图像是单通道的,则直方图是一维的;如果是多通道的,则直方图是多维的。
代码案例:
import cv2
from matplotlib import pyplot as plt
img = cv2.imread(r"E:\PS\2.png",0)
def hist_demo(img):
cv2.imshow("img", img)
hist = cv2.calcHist([img], [0], None, [256], [0, 256]) # 计算图像的直方图
plt.plot(hist) # 通过plt绘制图像直方图
plt.show() # 显示直方图
hist_demo(img)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
灰度图:
直方图:
经过分析可知 图像像素值主要集中在0-100,所以如果要增强就可以使用gama变换,对数变换等方法直接进行处理。
三,直方图均衡化
直方图均衡化是一种旨在提高图像对比度的图像处理技术。它通过对图像像素分布进行调整,使得输出图像的直方图趋于平坦,从而有效增强图像的全局对比度。具体实现步骤如下:首先,计算原始图像的直方图,即统计图像中各个灰度级出现的频率;接着,计算累积分布函数(CDF),对直方图进行累积求和,并将结果归一化至[0, 1]区间;然后,根据累积分布函数的值与最大灰度级(通常为255)相乘,计算出每个灰度级的新映射值;将原始图像的每个像素值替换为对应的新映射值后,便生成了均衡化后的图像。
直方图均衡化的应用非常广泛:它能够显著提高图像对比度,特别是在图像背景和前景都非常暗或亮的情况下,使得图像细节更加清晰;此外,它还能改善因不均匀照明影响的图像视觉效果,使图像内容更易于识别。在机器学习和计算机视觉领域,直方图均衡化常作为图像预处理的一个重要步骤,有助于提高图像识别和目标检测等后续处理的准确率。在医学成像、卫星图像和监控视频等应用中,均衡化技术用于增强图像的关键特征,助力专业人员更准确地解读图像内容。
尽管直方图均衡化是一种简单且有效的方法,无需用户设置任何参数,能够自动调整图像的灰度分布,它在许多实际应用中都非常实用。然而,需要注意的是,这种方法可能导致某些图像细节的丢失,并且并不适用于所有类型的图像。
在opencv中提供了函数 cv2.equalizeHist(img)可以直接对图像进行直方图均衡化。
函数介绍:
参数:
src: 输入图像,必须是灰度图像。如果输入图像是彩色图像,需要先将其转换为灰度图像。
返回值:
dst: 输出图像,与输入图像具有相同的尺寸和类型,但其直方图已经被均衡化。
功能描述: cv2.equalizeHist 函数计算输入灰度图像的直方图,然后通过累积分布函数(CDF)计算每个像素值的新映射,使得输出图像的直方图在整体上更加均匀分布。这个过程可以使得图像中的暗区域变得更亮,亮区域变得更暗,从而提高图像的对比度。
注意事项:
该函数仅适用于灰度图像。如果需要处理彩色图像,可以先使用 cv2.cvtColor 函数将其转换为灰度图像,或者分别对彩色图像的每个通道进行均衡化处理。均衡化可能会改变图像的亮度,有时可能会导致图像细节的丢失。在某些情况下,均衡化可能会过度增强图像的噪声。
代码案例:
import cv2
from matplotlib import pyplot as plt
img = cv2.imread(r"E:\PS\2.png",0)
img2 = cv2.equalizeHist(img) # 直方图均衡化
def hist_demo(img):
hist = cv2.calcHist([img], [0], None, [256], [0, 256]) # 计算图像的直方图
plt.plot(hist) # 通过plt绘制图像直方图
plt.show() # 显示直方图
cv2.imshow("img",img)
cv2.imshow("img2",img2)
hist_demo(img)
hist_demo(img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
效果:
左侧为原始图像,右侧为直方图均衡化后的图像:
原始图像直方图:
增强后直方图: