1灰度直方图

 

灰度直方图histogram:

是反映一幅图像中各灰度级像素出现的频率与灰度级的关系,以灰度级为横坐标,频率为纵坐标,绘制频率同灰度级的关系图像就是一幅灰度图像的直方图。
简单地说,就是把一幅图像中每一个像素出现的次数都先统计出来,然后把每一个像素出现的次数除以总的像素个数,得到的就是这个像素出现的频率,然后再把像素与该
像素出现的频率用图表示出来,就是灰度直方图。

1灰度直方图_第1张图片

 
   

 

 

 


直方图的一些性质:
 1)灰度直方图只能反映图像的灰度分布情况,而不能反映图像像素的位置,即丢失了像素的位置信息
 2)一幅图像对应唯一的灰度图像图,但是不同的图像可对应相同的直方图,如下
  黑白黑白黑白    黑白黑白黑白
  黑白黑白黑白    白黑白黑白黑
  黑白黑白黑白    黑白黑白黑白
  黑白黑白黑白    白黑白黑白黑
 3)一幅图像分成多个区域,多个区域的直方图之和即为原图像的直方图
 直方图有一个应用就是它可以确定图像二值化的阈值。当我们的发现某一幅图像的灰度直方图中有两个波峰,有一个波谷的话,那么这个波谷就可以作为这幅图像二值化的阈值
1.2 灰度直方图作用
  1)在使用轮廓线确定物体边界时,通过直方图更好的选择边界阈值,进行阈值化处理;
  2)对物体与背景有较强对比的景物的分割特别有用;
  3)简单物体的面积和综合光密度IOD可以通过图像的直方图求得。

 

matplotlib库 绘制直方图-hist()

hist(数据源, 像素级)

其中,参数:

数据源:必须是一维数组,通常需要通过函数 ravel() 拉直图像

像素级:一般是256,表示[0, 255]

函数 ravel() 将多维数组降为一维数组,其格式为:

一维数组 = 多维数组.ravel()

代码如下所示:

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. src = cv2.imread('zxp.jpg')   
  5. cv2.imshow("src", src)
  6. plt.hist(src.ravel(), 256)
  7. plt.show()
  8. cv2.waitKey(0)
  9. cv2.destroyAllWindows()

运行结果如下图所示:

https://img-blog.csdnimg.cn/20190504073737296.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3phaXNodWl5aWZhbmd4eW0=,size_16,color_FFFFFF,t_70

OpenCV库 绘制直方图-calcHist()

hist = cv2.calcHist(images, channels, mask, histSize, ranges, accumulate)

其中,参数:

hist 表示直方图,返回的是一个二维数组;

images 表示原始 图像;

channels 表示指定通道,通道编号需要用中括号括起,输入图像是灰度图像时,它的值为[0],彩色图像则为[0]、[1]、[2],分别表示B、G、R;

mask 表示掩码图像,统计整副图像的直方图,设为None,统计图像的某一部分直方图时,需要掩码图像;

histSize 表示BINS的数量,参数子集的数目,如下图当bins=3表示三个灰度级;

https://img-blog.csdnimg.cn/20190504075019231.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3phaXNodWl5aWZhbmd4eW0=,size_16,color_FFFFFF,t_70

 

ranges 表示像素值范围,例如[0, 255]

accumulate 表示累计叠加标识,默认为false,如果被设置为true,则直方图在开始分配时不会被清零,该参数允许从多个对象中计算单个直方图,或者用于实时更新直方图;多个直方图的累积结果用于对一组图像的直方图计算

 

  1. 计算图像灰度级的基本大小、形状及内容

代码如下所示:

  1. #encoding:utf-8
  2. import cv2
  3. import numpy as np
  4. import matplotlib.pyplot as plt
  5. src = cv2.imread('zxp.jpg')
  6. # 参数:原图像 通道[0]-B 掩码 BINS为256 像素范围0-255
  7. hist = cv2.calcHist([src], [0], None, [256], [0,255])
  8. print('type=',type(hist))
  9. print('size=',hist.size)
  10. print('shape=',hist.shape)
  11. print("-------------------")
  12. print('hist=',hist)

运行结果如下图所示:

1灰度直方图_第2张图片

 

补充:matplotlib库 绘制图像

 

代码如下所示:

  1. #encoding:utf-8
  2. import cv2
  3. import numpy as np
  4. import matplotlib.pyplot as plt

 

  1. #绘制sin函数曲线
  2. x1 = np.arange(0, 6, 0.1)
  3. y1 = np.sin(x1)
  4. plt.plot(x1, y1)

 

  1. #绘制坐标点折现
  2. x2 = [0, 1, 2, 3, 4, 5, 6]
  3. y2 = [0.3, 0.4, 2.5, 3.4, 4, 5.8, 7.2]
  4. plt.plot(x2, y2)

 

  1. #省略有规则递增的x2参数
  2. y3 = [0, 0.5, 1.5, 2.4, 4.6, 8]
  3. plt.plot(y3, color="r")

 

  1. plt.show()

 

运行结果如下图所示:

https://img-blog.csdnimg.cn/20190504080420845.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3phaXNodWl5aWZhbmd4eW0=,size_16,color_FFFFFF,t_70

使用OpenCV库 中的 calcHist() 函数 计算B、G、R通道的灰度级并绘制图形

代码如下所示:

  1. #encoding:utf-8
  2. import cv2
  3. import numpy as np
  4. import matplotlib.pyplot as plt

 

  1. src = cv2.imread('zxp.jpg')

 

  1. histb = cv2.calcHist([src], [0], None, [256], [0,255])
  2. histg = cv2.calcHist([src], [1], None, [256], [0,255])
  3. histr = cv2.calcHist([src], [2], None, [256], [0,255])

 

  1. cv2.imshow("src", src)

 

  1. plt.plot(histb, color='b')
  2. plt.plot(histg, color='g')
  3. plt.plot(histr, color='r')
  4. plt.show()

 

  1. cv2.waitKey(0)
  2. cv2.destroyAllWindows()

运行结果如下图所示:

https://img-blog.csdnimg.cn/20190504080816417.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3phaXNodWl5aWZhbmd4eW0=,size_16,color_FFFFFF,t_70

 

 

你可能感兴趣的:(图像处理)