目标
在这一章中,我们将学习寻找和绘制2D直方图。它将在接下来的章节中有所帮助。
介绍
在第一篇文章中,我们计算并绘制了一维的直方图。它被称为一维的,因为我们只考虑了一个特性,即像素的灰度强度值。但在二维直方图中,你考虑两个特征。通常,它用于寻找颜色直方图,其中两个特征是每个像素的色相和饱和度值。
已经有一个python样本(sampl/python/color直方图.py)已经用于寻找颜色直方图。我们将尝试理解如何创建这样的颜色直方图,它将有助于理解像直方图反投影这样的进一步的主题。
二维直方图OpenCV
它非常简单,使用相同的函数cv.calcHist()进行计算。对于颜色直方图,我们需要将图像从BGR转换为HSV。(记住,对于一维的直方图,我们从BGR转换成灰度图)。对于2D直方图,其参数将被修改如下:
通道=0,1因为我们需要同时处理H和S平面。
用于H平面的箱=180,256 180,以及256的S平面。
范围=0,180,0,256色调值介于0到180之间,饱和度在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二维直方图
Numpy还提供了一个特定的功能:np.组织学()。(记住,对于一维的直方图,我们使用了np.直方图())。
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('home.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
第一个参数是H平面,第二个是S平面,第三个是每个箱子的数量,第四个是它们的范围。
现在我们可以检查如何绘制这个颜色直方图
现在我们可以检查如何绘制这个颜色直方图。
绘制二维直方图
方法-1:使用cv.imshow()
我们得到的结果是一个大小为180x256的二维数组。所以我们可以像往常一样,使用cv.imshow()函数来显示它们。它将是一个灰度图像,它不会给出太多的颜色,除非你知道不同颜色的色调值。
方法-2:使用Matplotlib
我们可以使用matplotlib.pyplot.imshow()函数来绘制带有不同颜色映射的2D直方图。它给我们提供了一个更好的关于不同像素密度的概念。但这也不能让我们知道第一眼看到的是什么颜色,除非你知道不同颜色的色调值。我还是喜欢这种方法。这很简单,也很好。
请注意
在使用这个函数时,请记住,插值标记应该是最接近于更好结果的。
考虑一下代码
import numpy as np
import cv2 as cv
from matplotlib import pyplot as plt
img = cv.imread('tiananmen.jpg')
hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
hist = cv.calcHist( [hsv], [0, 1], None, [180, 256], [0, 180, 0, 256] )
plt.imshow(hist,interpolation = 'nearest')
plt.show()
: