直方图
1.灰度直方图
直方图是对数据进行统计的一种方法,并且将统计值组织到一系列实现定义好的bin当中。其中,bin为直方图中经常用到的一个概念,可以译为“直条”或“组距”,其数值是从数据中计算出的特征统计量,这些数据可以是诸如梯度、方向、色彩或任何其他特征。
图像直方图(Image Histogram)是用以表示数字图像中亮度分布的直方图,标绘了图像中每个亮度值的像素个数。这种直方图中,横坐标的左侧为较暗的区域,而右侧为较亮的区域。因此一张较暗图片的直方图中的数据多集中于左侧和中间部分,而整体明亮、只有少量阴影的图像则相反。
注意:直方图是根据灰度图进行绘制的,而不是彩色图像。假设有一张图像的信息(灰度值0-255,已知数字的范围包含256个值,于是可以按一定规律将这个范围分割成子区域(也就是bins)。然后再统计每一个bin()的像素数目。
直方图的一些术语和细节:
- dims:需要统计的特征数目。在上例中,dims=1,因为仅仅统计了灰度值。
- bins:每个特征空间子区段的数目,可译为“直条”或“组距”,
- range:要统计特征的取值范围。
直方图的意义:
- 直方图是图像中像素强度分布的图形表达方式。
- 它统计了每一个强度值所具有的像素个数。
- 不同的图像的直方图可能是相同的。
2.直方图的计算和绘制
我们使用OpenCV中的方法统计直方图,并使用matplotlib:将其绘制出来。
API:
cv2.calcHist(images,channels,mask,histSize,ranges[,hist[,accumulate]])
参数:
- images::原图像。当传入函数时应该用中括号0括起来,例如:mgl
- channels:如果输入图像是灰度图,它的值就是[O;如果是彩色图像的话,传入的参数可以是[0],[1],[2]它们分别对应着通道B,G,R。
- mask:掩模图像。要统计整幅图像的直方图就把它设为None。但是如果你想统计图像某一部分的直方图的话,你就需要制作一个掩模图像,并使用它。
- histSize:BlN的数目。也应该用中括号括起来,例如:[256]。
- ranges:像素值范围,通常为[0,256]
示例:
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
# 1直接以灰度图的方式读入
img = cv.imread('./images/a2.jpg',0)
# 2统计灰度图
his = cv.calcHist([img], [0], None, [256], [0, 256])
# 3绘制灰度图
plt.figure(figsize=(10, 6), dpi=100)
plt.plot(his)
plt.grid()
plt.show()
原图:
直方图: