灰度直方图概括了图像的灰度级信息,简单的来说就是每个灰度级图像中的像素个数以及占有率,创建直方图无外乎两个步骤,统计直方图数据,再用绘图库绘制直方图。
首先要稍微理解一些与函数相关的术语,方便理解其在 python3 库中的应用和处理。
BINS:如果图像包含有像素值从 0 到 255,则需要 256 个值来显示其直方图。但是,如果不需要知道每个像素值的像素数目,只想知道两个像素值之间的像素点数目怎么办?则可将范围 0 到 255 进行均分,每个分成的范围小组就是一个 BIN 箱。
例如,若只想知道像素值分别在 0 到 15 之间、16 到 31 之间、……、240 到 255 之间的像素点数目,则可以将范围 0 到 255 分成 16 份,每份分别计算总和。
DIMS:数据的参数数目。若对收集到的数据只考虑灰度值,所以该值为 1 。
RANGE:灰度值范围,通常是 [0, 256],也就是灰度所有的取值范围。
函数原型:
cv2.imread(const string & filename, int flag)
参数说明:
使用 matplotlib 统计直方图数据。
函数原型:
plt.hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, color=None, label=None, stacked=False)
参数说明:
# import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('/data/image.jpg', 1)
# img_np = np.array(img)
plt.hist(img.reshape([-1]), 256, [0,256]);
plt.show()
参数说明:matplotlib可视化之直方图plt.hist()与密度图_plot.hist_小文大数据的博客-CSDN博客
使用 opencv 统计直方图数据。
函数原型:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
参数说明:
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('/data/image.jpg', 0)
histr = cv2.calcHist([img], [0], None, [256], [0, 256])
plt.plot(histr, color = 'b')
plt.xlim([0, 256])
plt.show()
enumerate 函数返回当前元素对应的下标,因此 [i] 分别为 [0] [1] [2],从而对应三个通道。
plt.xlim() 函数用于指定 x 轴的作图范围。
import cv2
from matplotlib import pyplot as plt
img = cv2.imread('/data/image.jpg', 1)
color = ('b','g','r')
for i, col in enumerate(color):
histr = cv2.calcHist([img], [i], None, [256], [0, 256])
plt.plot(histr, color = col)
plt.xlim([0, 256])
plt.show()