图像的灰度直方图

  灰度直方图是图像处理中一个重要的工具,用于展示图像中不同灰度级别的像素数量分布。它可以从数学角度帮助我们分析图像的亮度分布情况,从而更好地理解图像的特征和内容。
  灰度直方图的数学定义如下:
  给定一幅图像 I I I,其灰度直方图 H ( i ) H(i) H(i) 表示了图像中具有灰度级别 i i i 的像素数量。
H ( i ) = ∑ x = 0 M − 1 ∑ y = 0 N − 1 δ ( I ( x , y ) − i ) H(i) = \sum_{x=0}^{M-1} \sum_{y=0}^{N-1} \delta(I(x, y) - i) H(i)=x=0M1y=0N1δ(I(x,y)i)
  其中, I ( x , y ) I(x, y) I(x,y) 是图像的像素值, M M M N N N 分别是图像的宽度和高度, δ \delta δ 是一个取值为 1 或 0 的函数,当 I ( x , y ) I(x, y) I(x,y) 等于 i i i 时为 1,否则为 0。
  当我们谈论图像的灰度直方图时,我们实际上在分析图像中像素的亮度级别分布。在这里,亮度级别可以理解为图像像素的颜色深浅,通常从0(黑色)到255(白色)。灰度直方图告诉我们不同亮度级别的像素有多少个。想象一下你正在查看一张黑白照片,你可能会注意到图像中有很多很亮的地方,也有很多很暗的地方。灰度直方图就是在告诉我们这些信息,但是用数学和图表的方式来表示。让我们从简单的例子开始解释灰度直方图。假设我们有一个10x10像素的图像,每个像素的亮度级别是0到255之间的一个数字。我们可以统计图像中有多少个像素具有相同的亮度级别,然后用图表来表示。假设我们的图像如下所示,每个数字代表像素的亮度级别:

[100, 150, 200, ...]
[ 50,  75, 100, ...]
[ 25,  50,  75, ...]
  ...

  我们可以看到,像素的亮度级别在不同的区域变化。现在,我们想知道有多少个像素具有亮度级别在0到50之间,有多少个像素在50到100之间,以此类推。这就是灰度直方图的概念。我们可以绘制一个图表,横轴表示亮度级别,纵轴表示具有该亮度级别的像素数量。图表可能看起来像这样:

 ^
 |       x
 |     x x
 |   x x x
 | x x x x
 +------------------>
 0               255

  在这个图表中,x轴上的位置代表亮度级别,y轴上的高度代表具有该亮度级别的像素数量。从图表中,我们可以看到哪些亮度级别更常见,哪些亮度级别更少见。这种信息对于了解图像的亮度分布和特点非常有帮助。在实际应用中,我们可以使用各种工具和技术来计算和绘制灰度直方图。这些信息可以帮助我们调整图像的对比度、亮度,或者检测图像中特定亮度区域的特征。通过灰度直方图,我们可以更好地理解图像,从而更好地处理和分析它们。
  灰度直方图的作用和意义:
  1. 分析图像的亮度分布:灰度直方图可以显示图像中不同灰度级别的像素数量,帮助我们了解图像的亮度分布情况。这有助于判断图像的整体亮暗情况,以及是否存在过曝光或欠曝光的区域。
  2. 对比度调整:通过灰度直方图,我们可以判断图像的对比度是否适当,从而进行对比度的调整,使图像更具有视觉吸引力。
  3. 图像增强:根据灰度直方图的分布情况,可以进行直方图均衡化等操作,增强图像的细节和特征。
  4. 目标检测:在一些应用中,可以根据灰度直方图的特征来检测特定的目标物体,例如在医学图像中检测病变区域。
  下面是使用Python代码和Matplotlib来绘制一幅图像的灰度直方图的示例:

import cv2
import numpy as np
import matplotlib.pyplot as plt

def CalcHist(image):
    img=cv2.imread(image,flags=0)
    if img is None:
        print('Unable to load image!')
    else:
        #计算灰度直方图
        img_hist=cv2.calcHist([img],[0],None,[256],[0,256])

        # 创建一个图框,包含两个图
        fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 6))
        #显示原图
        ax1.imshow(img, cmap='gray')
        ax1.set_title('Image')
        # ax1.axis('off')
        #显示直方图
        ax2.bar(np.arange(256), img_hist[:,0], color='black', width=0.5)
        ax2.set_xlabel('Pixel Value')
        ax2.set_ylabel('Frequency')
        ax2.set_xlim([0,255])
        ax2.set_title('Image_Hist')
        # ax2.axis('off')

        plt.tight_layout()#确保子图布局合适
        plt.show()


img_path="./Images/cat.jpg"
CalcHist(img_path)

你可能感兴趣的:(opencv_python,图像处理,opencv,python)