方法一:使用matplotlib包
from matplotlib import pyplot as plt
def plot_demo(image):
plt.hist(image.ravel(), 255)
# plt.hist(image.ravel(), 255, range=[0, 256])
plt.show("直方图")
.ravel():array类型对象的方法,ravel函数将多维数组降为一维,仍返回array数组,元素以列排列。
plt.hist(x, bins=10, range=None, normed=False,
weights=None, cumulative=False, bottom=None,
histtype=u’bar’, align=u’mid’, orientation=u’vertical’,
rwidth=None, log=False, color=None, label=None, stacked=False,
hold=None, **kwargs)
各参数的意义为:
x:这个参数是指定每个bin(箱子)分布的数据,对应x轴
bins:这个参数指定bin(箱子)的个数,也就是总共有几条条状图
range:指定直方图展示的范围,对应x轴
方法二:使用opencv库中画直方图的方法cv.calcHist()
def image_demo(image):
color = ('blue', 'green', 'red')
for i, color in enumerate(color):
hist = cv.calcHist([image], channels=[i], mask=None, histSize=[256], ranges=[0, 255])
plt.plot(hist, color=color)
plt.xlim([0, 255])
# plt.xticks() 设置x轴刻度的表现方式
# plt.xlim() 设置x轴刻度的取值范围
plt.show("图像直方图")
cv.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]]) # 返回hist
各参数表示的意义为:
images:必须用方括号括起来;
channels:是用于计算直方图的通道;
Mask: 默认None;
histSize:表示这个直方图分成多少份(即多少个直方柱);
ranges:表示直方图中各个像素的值。
print("......hello world ! ......")
src = cv.imread("images/image1.jpg")
cv.namedWindow("input image", cv.WINDOW_AUTOSIZE)
cv.imshow("input image", src)
plot_demo(src)
image_demo(src)
cv.waitKey(0)
cv.destroyAllWindows()