目標
在本章中,我們將學習查找和繪製2D直方圖。這將在以後的章節中有所幫助。
介紹
在第一篇文章中,我們計算並繪製了一維直方圖。 之所以稱為一維,是因為我們僅考慮一個特徵,即像素的灰度強度值。 但是在二維直方圖中,您要考慮兩個特徵。 通常,它用於查找顏色直方圖,其中兩個特徵是每個像素的色相和飽和度值。
已經有一個python示例(samples / python / color_histogram.py)用於查找顏色直方圖。 我們將嘗試了解如何創建這種顏色直方圖,這對於理解諸如直方圖反向投影之類的更多主題將很有用。
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之間。
現在檢查以下代碼:
import numpy as npimport cv2 as cvimg = 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.histogram2d()。(記住,對於一維直方圖我們使用了np.histogram())。
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = 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()
我們得到的結果是尺寸為80x256的二維數組。因此,可以使用cv.imshow()函數像平常一樣顯示它們。它將是一幅灰度圖像,除非您知道不同顏色的色相值,否則不會對其中的顏色有太多了解。
方法2:使用Matplotlib
我們可以使用matplotlib.pyplot.imshow()函數繪製具有不同顏色圖的2D直方圖。它使我們對不同的像素密度有了更好的了解。但是,除非您知道不同顏色的色相值,否則乍一看並不能使我們知道到底是什麼顏色。我還是更喜歡這種方法。它簡單而更好。
注意
使用此功能時,請記住,插值法應採用最近鄰以獲得更好的結果。
考慮下面的代碼:
import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('home.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()
下面是輸入圖像及其顏色直方圖。X軸顯示S值,Y軸顯示色相。
在直方圖中,您可以在H = 100和S = 200附近看到一些較高的值。它對應於天空的藍色。同樣,在H = 25和S = 100附近可以看到另一個峰值。它對應於宮殿的黃色。您可以使用GIMP等任何圖像編輯工具進行驗證。
方法3:OpenCV示例樣式
OpenCV-Python2示例中有一個顏色直方圖的示例代碼(samples / python / color_histogram.py)。如果運行代碼,則可以看到直方圖也顯示了相應的顏色。或者簡單地,它輸出顏色編碼的直方圖。其結果非常好(儘管您需要添加額外的線束)。
在該代碼中,作者在HSV中創建了一個顏色圖。然後將其轉換為BGR。將所得的直方圖圖像與此顏色圖相乘。他還使用一些預處理步驟來刪除小的孤立像素,從而獲得良好的直方圖。
我將其留給讀者來運行代碼,對其進行分析並擁有自己的解決方法。下面是與上面相同的圖像的代碼輸出:
您可以在直方圖中清楚地看到存在什麼顏色,那裡是藍色,那裡是黃色,並且由於棋盤的存在而有些白色。很好!