OpenCV-Python:绘制直方图和统计直方图
简介直方图(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()
三、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()
上面是绘制的灰度图像的直方图,下面是一张图彩色图片的直方图:
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()