在绘制直方图时,将灰度级作为x轴,该灰度级出现的次数作为y轴.
在OpenCV的官网上,特别提出了要注意的三个概念:DIMS,BINS,RANGE.DIMS:表示在绘制直方图时参数的数量,通常该值为1,只是灰度级一种. RANGE:表示灰度级的范围,一般是0到255. BINS:参数子集的数量,如果BINS为16,就是将整个灰度级范围分为16组.
Python的matplotlib.pyplot中的hist函数能够很方便的绘制直方图,OpenCV的cv2.calcHist函数能计算统计直方图
matplotlib.pyplot.hist(X,BINS) 能够绘制直方图,X是一维数据源,通常读入图片后需要用ravel函数将二维数组降为一维
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("1.jpg")
plt.hist(img.ravel(),256)
plt.show()
**cv2.calcHist(images,channels,mask,histSize,ranges,accumulate)**会返回一个统计直方图,是一个一位数组.
所有参数都要用[]括起来
images是原始图像.channel是通道,如果是单通道灰度图就是0 彩色图像中012对应bgr.mask是掩模图像,在计算图像的某一部分直方图时需要,计算整幅图时为none.histSize是BINS的值,ranges是像素范围.accumulate默认为false,为true时会累加直方图的结果.
import cv2
import matplotlib.pyplot as plt
img=cv2.imread("1.jpg")
hist=cv2.calcHist([img],[0],None,[256],[0,255])
plt.plot(hist)
plt.show()
print(hist)
如果是要画归一化直方图,就用算出来的统计值除以整个图片的像素点:
hist=hist/(img.shape[0]*img.shape[1])