前言
目标
- 如何绘制 2D 直方图。
- 对于彩色图像的直方图通常情况下我们需要考虑每个的颜色 (Hue)和饱和度(Saturation)。根据这两个特征绘制 2D 直方图。
正文
使用cv.calcHist绘制2D直方图
步骤
- 绘制图像的2D直方图,首先要将图像从BGR转为HSV.
- channels=[0,1] 因为我们需要同时处理 H 和 S 两个通道。
- bins=[180,256]H 通道为 180,S 通道为 256。
- range=[0,180,0,256]H 的取值范围在 0 到 180,S 的取值范围 在 0 到 256。
效果图
从上图中,我们同时处理了色调和饱和度两个通道的直方图,所以,从上面我们可以很清晰的看到各种颜色的直方图数据。hsv:色调(H),饱和度(S),明度(V)
code
def calcDrawHist(image):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) # hsv:色调(H),饱和度(S),明度(V)。
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
plt.plot(hist)
plt.show()
Numpy 中2D直方图
相比于2维直方图,一维直方图是那种只考虑了图像的一个特征:灰度值。但接下来,我们要考虑的是两个图像特征,对于彩色图像的2D直方图的话,我们一般是考虑H(色调Hue),S饱和度(Saturation).
首先,我们先了解我们要用的函数:np.histogram2d()
.
但不知道你还记不记得histogram这个东西。这个是一个x轴为0-255的像素值,y轴则是该像素值对应的大小。
效果图
code
def numpyDrawHist(image):
hsv = cv.cvtColor(image, cv.COLOR_BGR2HSV) # hsv:色调(H),饱和度(S),明度(V)。
h,s,v = cv.split(hsv)
hist,xbins,ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
plt.plot(hist)
plt.show()
关于上面用到的函数,这里稍微讲一下:
第一个参数是 H 通道,第二个参数是 S 通道,第三个参数是 bins 的数 目,第四个参数是数值范围。