1.计算二维直方图
OpenCV中的二维直方图
主要使用cv.calcHist()函数来实现。
函数具体介绍见OpenCV直方图-查找、绘制和分析.
对于颜色直方图,我们需要将图像从BGR转换为HSV。对于二维直方图,
其参数将进行如下修改:
- channel = [0,1],因为我们需要同时处理H和S平面。
- bins = [180,256] ,对于H平面为180,对于S平面为256。
- range = [0,180,0,256], 色相值介于0和180之间,饱和度介于0和256之间。
代码示例:
import cv2 as cv
img = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac1.jpg')
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
hist1 = cv.calcHist(hsv, [0, 1], None, [180, 256], [0, 180, 0 , 256])
Numpy中的二维直方图
主要使用np.histogram2d()函数来实现。
numpy.histogram2d(x, y, bins=10, range=None, normed=None, weights=None, density=None)
参数如下:
- x:包含要直方图的点的x坐标的数组
- y:包含要直方图的点的y坐标的数组
- bins:可选参数,每个bin的数量
- range:可选参数。沿每个维度的仓的最左边和最右边(如果未在bins参数中明确指定):[[xmin, xmax], [ymin, ymax]]。所有超出此范围的值都将被视为离群值,并且不会在直方图中列出
- density:可选参数。如果默认值为False,则返回每个bin中的样本数。如果为True,则在bin处返回概率密度函数
- normed:bool, 可选参数。密度参数的别名
- weights:可选参数。如果normed为True,则将权重标准化为1。如果normed为False,则返回的直方图的值等于属于每个bin的样本的权重之和。
- 返回值:
①样本x和y的直方图。 x中的值沿第一维直方图,y中的值沿第二维直方图
②x边缘数组,形状(nx+1,),bin沿第一个维度边缘
③y边缘数组,形状(ny+1,),bin沿第二个维度边缘
代码示例:
import numpy as np
import cv2 as cv
img = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac1.jpg')
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
h,s=hsv[:,:,0],hsv[:,:,1]
hist2, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
2.绘制二维直方图
使用cv.imshow()函数
代码示例:
import numpy as np
import cv2 as cv
img = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac1.jpg')
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
h,s=hsv[:,:,0],hsv[:,:,1]
hist1 = cv.calcHist(hsv, [0, 1], None, [180, 256], [0, 180, 0 , 256])
hist2, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
cv.imshow("prac1", hist1)
cv.imshow("prac2", hist2)
cv.waitKey(0)
cv.destroyAllWindows()
使用Matplotlib
代码示例:
from matplotlib import pyplot as plt
import numpy as np
import cv2 as cv
img = cv.imread('C:\\Users\\dell\\Desktop\\prac files\\prac.jpg')
hsv = cv.cvtColor(img, cv.COLOR_BGR2HSV)
h,s=hsv[:,:,0],hsv[:,:,1]
hist1 = cv.calcHist(hsv, [0, 1], None, [180, 256], [0, 180, 0 , 256])
hist2, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
plt.subplot(1, 2, 1)
plt.imshow(hist1)
plt.subplot(1, 2, 2)
plt.imshow(hist2)
plt.show()