OpenCV-Python系列之2D直方图
在之前的教程中,我们介绍了OpenCV的一维直方图,之所以称为一维,是因为我们仅考虑一个特征,即像素的灰度强度值,我们通常输入灰度图像。 但是在二维直方图中,我们要考虑两个特征。通常,它用于查找颜色直方图,其中两个特征是每个像素的色相和饱和度值。
它非常简单,并且使用相同的函数 cv.calcHist ()进行计算。 对于彩色直方图,我们需要将图像从BGR转换为HSV。(请记住,对于一维直方图,我们从BGR转换为灰度)。对于二维直方图,其参数将进行如下修改:
channel = [0,1] , 因为我们需要同时处理H和S平面。
bins = [180,256] 对于H平面为180,对于S平面为256。
range = [0,180,0,256] 色相值介于0和180之间,饱和度介于0和256之间。
虽然我们在上一个教程中简述了彩色图像的直方图均值化,但是并未进行详述,其本质属于二维直方图,但同样的,它也可以进行均值化。
我们来看代码:
def twohist(img): hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) cv2.imshow("img",img) cv2.imshow("res",hist)
不仅仅是OpenCV可以绘制二维直方图,我么能用Numpy仍然可以完成,Numpy还为此提供了一个特定的函数:np.histogram2d()(记住,对于一维直方图我们使用了np.histogram())。
来看代码:
import numpy as np import cv2 as cv from matplotlib import pyplot as plt img = cv.imread(cat.jpg') hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV) hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
我们刚刚使用了OpenCV进行绘制二维直方图,我们得到的结果是尺寸为 80x256 的二维数组。因此,可以使用 cv.imshow ()函数像平常一样显示它们,它将是一幅灰度图像。
现在我们将使用Matplotlib进行绘图,matplotlib.pyplot.imshow()函数可以绘制具有不同颜色图的2D直方图,它使我们对不同的像素密度有了更好的了解。
我们来看代码:
def plthist(img): hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) hist = cv2.calcHist([hsv], [0, 1], None, [180, 256], [0, 180, 0, 256]) plt.imshow(hist, interpolation='nearest') plt.show()
我们仍然使用刚刚那副猫咪的图像,来看结果:
在直方图中,我们可以在H = 0和S = 40附近看到一些较高的值。它对应于猫咪的黑色。同样,在H = 50和S = 20附近可以看到另一个峰值。它对应于猫咪的黄色。
本次教程我们讨论的就是这些,相比较而言,并不复杂,但是相当有用,至于具体的用途,我们将在后续介绍,现在还为时过早。