OpenCV-Python 直方圖-3:二維直方圖 | 二十八

2020-01-15   人工智慧遇見磐創

目標

在本章中,我們將學習查找和繪製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。將所得的直方圖圖像與此顏色圖相乘。他還使用一些預處理步驟來刪除小的孤立像素,從而獲得良好的直方圖。

我將其留給讀者來運行代碼,對其進行分析並擁有自己的解決方法。下面是與上面相同的圖像的代碼輸出:

您可以在直方圖中清楚地看到存在什麼顏色,那裡是藍色,那裡是黃色,並且由於棋盤的存在而有些白色。很好!