一般直接可使用matplotlib.pyplot中的hist()绘制直方图。OpenCV中的cv2.calcHist()函数能够计算统计直方图,还可以在此基础上绘制图像的直方图。

在正式开始之前,需要安装一下matplotlib库。在cmd窗口中输入命令pip install matplotlib

matplotlib库

使用Numpy绘制直方图

matplotlib库中的hist()函数是通过数据源和灰度级分组绘制直方图。其基本语法是:

matplotlib.pyplot.hist(X, BINS)

参数含义如下:

  • X:数据源,必须是一维的。图像通常是二维的,因此需要将其转换为一维的,使用函数ravel()处理,将结果作为数据源。
  • BINS:BINS是具体值,表示灰度级的分组情况。

ravel()处理:

b = a.reval()

左侧矩阵为a,经转换后为一维矩阵b

结果

 

例1:使用hist()函数绘制一幅图像的直方图。

import cv2
import matplotlib.pyplot as plt
o = cv2.imread(r'E:\Blog\OpenCV\Process\fisher.png')
cv2.imshow('ORIGINAL',o)
plt.hist(o.ravel(),256)
plt.show(  ) # 显示图像
cv2.waitKey()

运行结果

 

例2:使用hist函数将一幅图像的灰度等级划分为16组后,绘制该图像的直方图。

import cv2
import matplotlib.pyplot as plt
o = cv2.imread(r'E:\Blog\OpenCV\Process\fisher.png')
cv2.imshow('ORIGINAL',o)
plt.hist(o.ravel(),16)
plt.show(  ) # 显示图像
cv2.waitKey()

运行结果

使用OpenCV绘制直方图

先使用cv2.calcHist()函数统计图像的直方图信息,然后使用matplotlab.plot来对统计信息进行绘制。

cv2.calcHist()进行统计

语法:

hist = cv2.calcHist(img, channels, mask, histSize, ranges[, accumulate])
  • hist:返回的统计直方图,是一个一维数组,数组内的元素是各个灰度级的像素个数。
  • img:原始图像,需要用[]括起来
  • channels:通道编号。需要用[]括起来。可以是[0][1][2],分别对应通道B、G、R
  • mask:掩模图像。当统计的为整个图像的时候,这个值为None。当统计图像的某一部分时,需要用到掩模图像。
  • histSize:BINS的值,该值需要用[],例如,BINS的值为256,则使用[256]作为此参数值
  • ranges:即像素值范围,例如,8位灰度图像的像素值范围为[0,255]
  • accumulate:累计标志。默认为False。一般不设置该参数.

例:使用cv2.calcHist()函数计算一幅图像的统计直方图结果,并观察统计值的信息。

import cv2
import matplotlib.pyplot as plt
o = cv2.imread(r'E:\Blog\OpenCV\Process\fisher.png')

hist = cv2.calcHist([o],[0],None,[256],[0,255])
print(type(hist))  #类型
print(hist.shape)  #数据尺寸
print(hist.size)   #数据个数
print(hist)        #数据信息

运行结果:

<class 'numpy.ndarray'>
(256, 1)
256
[[0.0000e+00]
[0.0000e+00]
[0.0000e+00]
[0.0000e+00]
[0.0000e+00]

.........

[1.9833e+04]
[1.4899e+04]
[0.0000e+00]]

plot()函数的使用

语法:

import matplotlib.pyplot as plt
x = [横坐标的值]
y = [纵坐标的值]
plt.plot(x,y)
plt.show()

例:演示plot函数,并观察绘制结果。

import matplotlib.pyplot as plt
x = [0,0.5,1,3,5]
y = [3,0.8,0,2.1,5.4]
plt.plot(x,y)
plt.show()

显示结果

注意:

  • 如果仅给plot赋予一个参数,默认为y值,且x=[0, 1, 2, ..., n-1]
  • 可以给参数color='r'color='g'来设置颜色,r为red红色,g为green绿色
import matplotlib.pyplot as plt
x = [0,0.5,1,3,5]
y = [3,0.8,0,2.1,5.4]
plt.plot(x,color='r')
plt.plot(y,color='g')
plt.show()

运行结果

绘制统计直方图

例:使用函数plot()和函数cv2.calcHist(),将彩色图像各个通道的直方图绘制在一个图像内。

import cv2
import matplotlib.pyplot as plt
o = cv2.imread(r'E:\Blog\OpenCV\Process\fisher.png')

histb = cv2.calcHist([o],[0],None,[256],[0,255])
histg = cv2.calcHist([o],[1],None,[256],[0,255])
histr = cv2.calcHist([o],[2],None,[256],[0,255])
plt.plot(histb,color='b')
plt.plot(histg,color='g')
plt.plot(histr,color='r')

plt.show()

运行结果

使用掩模绘制直方图

直方图

  • 与掩模图像中的黑色背景位置对应的部分,该部分像素值都被置为0
  • 与掩模图像中的白色背景位置对应的部分,该部分像素值保留原有值

首先,回顾一下函数cv2.calcHist()的语法格式:

hist = cv2.calcHist(img, channels, mask, histSize, ranges[, accumulate])

其中,mask参数就是掩模图像。

例:演示绘制掩模结果图像的直方图。

根据题目要求,需要构造一个和img图像一样大小的黑色图案,再构造一块区域为白色,即形成一块mask。然后通过cv2.calcHist()进行统计,最后使用plot来绘制。

import cv2
import numpy as np
import matplotlib.pyplot as plt
o = cv2.imread(r'E:\Blog\OpenCV\Process\fisher.png',0)

mask = np.zeros(o.shape,np.uint8)
mask[200:400,200:400] = 255

histIMG = cv2.calcHist([o],[0],None,[256],[0,255])
histMASK = cv2.calcHist([o],[0],mask,[256],[0,255])

plt.plot(histIMG,color='b')
plt.plot(histMASK,color='g')

plt.show()

python运行结果


素材:

fisher.png图片



博主个人公众号
版权声明 ▶ 本网站名称:陶小桃Blog
▶ 本文链接:https://www.52txr.cn/2022/OpenCV43.html
▶ 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行核实删除。
▶ 转载本站文章需要遵守:商业转载请联系站长,非商业转载请注明出处!!

最后修改:2022 年 05 月 27 日
如果觉得我的文章对你有用,请随意赞赏