一、话说直方图
说到直方图,同学们一定会想到统计学里的直方图(没有想起来的抓紧去翻下中学数学课本)。所谓直方图啊,就是把一大坨东西分成好几部分(横坐标),然后看看每一部分有多少(纵坐标)。比如说康娜酱的班里要做个人爱好的统计,喜欢跳绳的有5人,喜欢唱歌的有8人,喜欢读书的有6人,超喜欢康娜酱的有1人(才川同学了解一下)。那么图像中的直方图又是个啥子呢?喜欢摄影的同学一定见过。图像中常见的直方图是亮度直方图(在CV中还有一种H-S直方图,即在HSV空间中计算,若没有特殊说明,将会默认介绍亮度直方图),横坐标表示像素值的分布(通常0~255),纵坐标为像素个数,那么图像直方图的含义就是数数看每个像素值对应的像素个数,进一步讲,横坐标的左侧为暗的区域,右侧为亮的区域,所以图像的亮度分布情况就可以反应在亮度直方图中。
二、绘制直方图
在OpenCV中,我们使用函数calcHist来计算直方图(仅仅是计算),如果使用python,则可借助matplotlib绘制出直方图(python的话当然也可以用OpenCV中的绘图函数,但有matplotlib这么好的工具为什么不用呢)。
API:
hist=cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate]])
- hist:直方图的数据,是一个二维数组
- image:数组集合,这里就是图像集合,可以是一幅或多幅图像,需要有相同的深度(CV_8U或CV_32F)和尺寸
- channels:要统计哪个通道的像素,彩色图像的话就有3个通道
- mask:掩膜,当我们想要对图像中某一区域做直方图时就要在图像上加一层掩膜
- histSize:步长,要把横轴分成多少份,有些教程中叫做bin的长度
- ranges:统计量的取值范围,注意不是纵轴的取值范围,比如统计量是像素,那么通常就是像素值的取值范围
注意
- 参数images、channels、histSize和ranges参数都要写成列表的形式,因为这个函数允许处理多幅图像或多个通道
- 当要处理多幅图像或多个通道时,histSize和ran