OpenCV-Python:绘制直方图和统计直方图

xiaohai 2023-07-25 16:39:21 2025人围观 标签: Opencv 
简介直方图(Histogram)又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况,一般用横轴表示数据类型,纵轴表示分布情况,本文主要介绍关于Python matplotlib.pyplot.hist()绘制直方图
一、一、matplotlib.pyplot.hist()语法
matplotlib.pyplot.hist(x, bins=None, range=None, density=False, weights=None, cumulative=False, bottom=None, histtype=’bar’, align=’mid’, orientation=’vertical’, rwidth=None, log=False, color=None, label=None, stacked=False, \*, data=None, \*\*kwargs)

参数:此方法接受以下描述的参数:

  • x:此参数是数据序列。
  • bins:此参数是可选参数,它包含整数,序列或字符串。
  • range:此参数是可选参数,它是箱子的上下限。
  • density:此参数是可选参数,它包含布尔值。
  • weights:此参数是可选参数,并且是一个权重数组,与x的形状相同。
  • bottom:此参数是每个容器底部基线的位置。
  • histtype:此参数是可选参数,用于绘制直方图的类型。 {‘bar’,‘barstacked’,‘step’,‘stepfilled’}
  • align:此参数是可选参数,它控制如何绘制直方图。 {‘left’,‘mid’,‘right’}
  • rwidth:此参数是可选参数,它是条形图的相对宽度,是箱宽度的一部分
  • log:此参数是可选参数,用于将直方图轴设置为对数刻度
  • color:此参数是一个可选参数,它是一个颜色规格或一系列颜色规格,每个数据集一个。
  • label:此参数是可选参数,它是一个字符串或匹配多个数据集的字符串序列。
  • normed:此参数是可选参数,包含布尔值,而是使用density关键字参数。

返回值:这将返回以下内容:

  • n:这将返回直方图箱的值。
  • 垃圾桶:这将返回箱子的边。
  • 补丁:这将返回用于创建直方图的单个补丁的列表。
二、matplotlib.pyplot.hist()绘制图像的直方图
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("1-gray.bmp", cv2.IMREAD_UNCHANGED)
cv2.imshow("img", img)

#绘制直方图,这里需要将多维数组转化成一维数组,用ravel()函数
plt.hist(img.ravel(), 256)
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

图片alt

三、OpenCV-Python直方图计算

使用函数

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

参数说明:

  • images:原图
  • channels:指定通道 [0]代表灰度图,如果读入的图像不是灰度图,该值可以是[0],[1],[2]分别代表通道 B,G,R
  • mask:掩码图像,进行整张图的绘制时为 None
  • histSize:子区段数目,如果我们统计0~255每个像素值,histSize=256;如果划分区间,比如0~15,16~31…240~255这样16个区间,histSize=16
  • ranges:像素值范围,要计算的像素值范围,一般为[0,255]
  • accumulate:累计标识,一般可以省略
import cv2
import matplotlib.pyplot as plt

img = cv2.imread("1-gray.bmp", cv2.IMREAD_UNCHANGED)
cv2.imshow("img", img)

# 直方图计算
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
print(type(hist))
print(hist.size)
print(hist.shape)
print(hist)

cv2.waitKey()
cv2.destroyAllWindows()

运行结果:

<class 'numpy.ndarray'>
256
(256, 1)
[[3.000e+00]
 [3.500e+01]
 [4.000e+01]
 [7.300e+01]
 [1.170e+02]
 [1.020e+02]
 [1.180e+02]
 [1.450e+02]
 ...
 [4.000e+00]
 [0.000e+00]]

从返回结果可以看出,hist是一个n行1列的数组,所以可以使用、matplotlib.pyplot.plot()来绘制简单的图像.

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("1-gray.bmp", cv2.IMREAD_UNCHANGED)
cv2.imshow("img", img)

# 直方图计算
hist = cv2.calcHist([img], [0], None, [256], [0, 255])
print(type(hist))
print(hist.size)
print(hist.shape)
print(hist)

# 绘制直方图
plt.plot(hist,color="r")
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

图片alt
上面是绘制的灰度图像的直方图,下面是一张图彩色图片的直方图:

import cv2
import matplotlib.pyplot as plt

img = cv2.imread("1-1.jpg", cv2.IMREAD_UNCHANGED)
cv2.imshow("img", img)

# 直方图计算
histb = cv2.calcHist([img], [0], None, [256], [0, 255])
histg = cv2.calcHist([img], [1], None, [256], [0, 255])
histr = cv2.calcHist([img], [2], None, [256], [0, 255])

# 绘制直方图
plt.plot(histb,color="b")
plt.plot(histg,color="g")
plt.plot(histr,color="r")
plt.show()

cv2.waitKey()
cv2.destroyAllWindows()

图片alt