【python opencv】二維直方圖


我們計算並繪制了一維直方圖。 之所以稱為一維,是因為我們僅考慮一個特征,即像素的灰度強度值。 但是在二維直方圖中,您要考慮兩個特征。 通常,它用於查找顏色直方圖,其中兩個特征是每個像素的色相和飽和度值。我們將嘗試了解如何創建這種顏色直方圖,這對於理解諸如直方圖反向投影之類的更多主題將很有用。

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 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.histogram2d()。(記住,對於一維直方圖我們使用了np.histogram())。

hsv = cv.cvtColor(img,cv.COLOR_BGR2HSV)
h,s=hsv[:,:,0],hsv[:,:,1]
hist, xbins, ybins = np.histogram2d(h.ravel(),s.ravel(),[180,256],[[0,180],[0,256]])
cv2_imshow(hist)

第一個參數是H平面,第二個是S平面,第三個是每個箱子的數量,第四個是它們的范圍。

繪制二維直方圖

方法1:使用 cv.imshow()

我們得到的結果是尺寸為80x256的二維數組。因此,可以使用cv.imshow()函數像平常一樣顯示它們。它將是一幅灰度圖像,除非您知道不同顏色的色相值,否則不會對其中的顏色有太多了解。

方法2:使用Matplotlib

我們可以使用matplotlib.pyplot.imshow()函數繪制具有不同顏色圖的2D直方圖。它使我們對不同的像素密度有了更好的了解。但是,除非您知道不同顏色的色相值,否則乍一看並不能使我們知道到底是什么顏色。我還是更喜歡這種方法。它簡單而更好。

注意 使用此功能時,請記住,插值法應采用最近鄰以獲得更好的結果。

考慮下面的代碼:

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()

在直方圖中,您可以在H = 100和S = 200附近看到一些較高的值。它對應於天空的藍色。同樣,在H = 25和S = 100附近可以看到另一個峰值。它對應於宮殿的黃色。您可以使用GIMP等任何圖像編輯工具進行驗證。

 

參考:

http://woshicver.com/FifthSection/4_10_3_%E7%9B%B4%E6%96%B9%E5%9B%BE3%EF%BC%9A%E4%BA%8C%E7%BB%B4%E7%9B%B4%E6%96%B9%E5%9B%BE/ 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM