目标:怎么样实现二维直方图
在前面我们学习过一维直方图,也有应用它来解决过很多问题。但是没有使用过二维直方图,那么它是怎么样实现,以及有什么作用呢。本文就来解决这些问题。在一维直方图里只关注了一个特征:灰度值。在二维直方图里,将要考虑两个特征,一般情况就是采用彩色图里的色调(H)和饱和度(S)。二维直方图主要应用在反向投影方面。
使用OpenCV实现二维直方图
跟计算一维直方图是一样,可以使用cv.calcHist()函数来计算,不过要把图像从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。
有了这些参数,就可以调用这个函数:
import numpy as np
import cv2 as cv
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256])
如果想用numpy里实现,可以最后一行代码改为:
hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
因此,可以使用下面例子来演示:
#python 3.7.4,opencv4.1
#蔡军生 https://blog.csdn.net/caimouse/article/details/51749579
#
import numpy as np
import cv2
from matplotlib import pyplot as plt
#读取图片
img = cv2.imread('dft6.png')
h,w = img.shape[:2]
rgb = cv2.cvtColor(img,cv2.COLOR_BGR2RGB) #转换为RGB以便正确显示
hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV) #转换HSV
#求HSV二维直方图
hist = cv2.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )
plt.subplot(121), plt.imshow(rgb) #显示原图
plt.subplot(122), plt.imshow(hist,interpolation = 'nearest')
plt.show()
cv2.waitKey(0)
cv2.destroyAllWindows()
结果输出如下:
右边是二维的直方图,X轴显示S值,Y轴显示H值,从上图可以看到黄色区域。
https://blog.csdn.net/caimouse/article/details/51749579
转载:https://blog.csdn.net/caimouse/article/details/102583100