OpenCV-Python 直方圖-1:查找、繪製和分析|二十六

2020-12-03 人工智慧遇見磐創

目標

學會

使用OpenCV和Numpy函數查找直方圖使用OpenCV和Matplotlib函數繪製直方圖你將看到以下函數:cv.calcHist(),np.histogram()等。理論

那麼直方圖是什麼?您可以將直方圖視為圖形或繪圖,從而可以總體了解圖像的強度分布。它是在X軸上具有像素值(不總是從0到255的範圍),在Y軸上具有圖像中相應像素數的圖。

這只是理解圖像的另一種方式。通過查看圖像的直方圖,您可以直觀地了解該圖像的對比度,亮度,強度分布等。當今幾乎所有圖像處理工具都提供直方圖功能。以下是劍橋彩色網站的圖片,我建議您訪問該網站以獲取更多詳細信息。

您可以看到圖像及其直方圖。(請記住,此直方圖是針對灰度圖像而非彩色圖像繪製的)。直方圖的左側區域顯示圖像中較暗像素的數量,而右側區域則顯示明亮像素的數量。從直方圖中,您可以看到暗區域多於亮區域,而中間調的數量(中間值的像素值,例如127附近)則非常少。

尋找直方圖

現在我們有了一個關於直方圖的想法,我們可以研究如何找到它。OpenCV和Numpy都為此內置了功能。在使用這些功能之前,我們需要了解一些與直方圖有關的術語。

BINS:上面的直方圖顯示每個像素值的像素數,即從0到255。即,您需要256個值來顯示上面的直方圖。但是考慮一下,如果您不需要分別找到所有像素值的像素數,而是找到像素值間隔中的像素數怎麼辦?例如,您需要找到介於0到15之間的像素數,然後找到16到31之間,...,240到255之間的像素數。只需要16個值即可表示直方圖。這就是在OpenCV教程中有關直方圖的示例中顯示的內容。

因此,您要做的就是將整個直方圖分成16個子部分,每個子部分的值就是其中所有像素數的總和。每個子部分都稱為「 BIN」。在第一種情況下,bin的數量為256個(每個像素一個),而在第二種情況下,bin的數量僅為16個。BINS由OpenCV文檔中的histSize術語表示。

DIMS:這是我們為其收集數據的參數的數量。在這種情況下,我們僅收集關於強度值的一件事的數據。所以這裡是1。

RANGE:這是您要測量的強度值的範圍。通常,它是[0,256],即所有強度值。

1. OpenCV中的直方圖計算

因此,現在我們使用cv.calcHist()函數查找直方圖。讓我們熟悉一下該函數及其參數:

cv.calcHist(images,channels,mask,histSize,ranges [,hist [,accumulate]])

images:它是uint8或float32類型的源圖像。它應該放在方括號中,即「 [img]」。channels:也以方括號給出。它是我們計算直方圖的通道的索引。例如,如果輸入為灰度圖像,則其值為[0]。對於彩色圖像,您可以傳遞[0],[1]或[2]分別計算藍色,綠色或紅色通道的直方圖。mask:圖像掩碼。為了找到完整圖像的直方圖,將其指定為「無」。但是,如果要查找圖像特定區域的直方圖,則必須為此創建一個掩碼圖像並將其作為掩碼。(我將在後面顯示一個示例。)histSize:這表示我們的BIN計數。需要放在方括號中。對於全尺寸,我們通過[256]。ranges:這是我們的RANGE。通常為[0,256]。因此,讓我們從示例圖像開始。只需以灰度模式加載圖像並找到其完整直方圖即可。

img = cv.imread('home.jpg',0)hist = cv.calcHist([img],[0],None,[256],[0,256])hist是256x1的數組,每個值對應於該圖像中具有相應像素值的像素數。

2. numpy的直方圖計算

Numpy還為您提供了一個函數np.histogram()。因此,除了calcHist()函數外,您可以嘗試下面的代碼:

hist,bins = np.histogram(img.ravel(),256,[0,256])hist與我們之前計算的相同。但是bin將具有257個元素,因為Numpy計算出bin的範圍為0-0.99、1-1.99、2-2.99等。因此最終範圍為255-255.99。為了表示這一點,他們還在最後添加了256。但是我們不需要256。最多255就足夠了。

另外Numpy還有另一個函數np.bincount(),它比np.histogram()快10倍左右。因此,對於一維直方圖,您可以更好地嘗試一下。不要忘記在np.bincount中設置minlength = 256。例如,hist = np.bincount(img.ravel(),minlength = 256)注意OpenCV函數比np.histogram()快大約40倍。因此,儘可能使用OpenCV函數。

現在我們應該繪製直方圖,但是怎麼繪製?

繪製直方圖

有兩種方法,

簡短的方法:使用Matplotlib繪圖功能稍長的方法:使用OpenCV繪圖功能1. 使用Matplotlib

Matplotlib帶有直方圖繪圖功能:matplotlib.pyplot.hist()它直接找到直方圖並將其繪製。您無需使用calcHist()或np.histogram()函數來查找直方圖。請參見下面的代碼:

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('home.jpg',0)plt.hist(img.ravel(),256,[0,256]); plt.show()你將得到如下的結果:

或者,您可以使用matplotlib的法線圖,這對於BGR圖是很好的。為此,您需要首先找到直方圖數據。試試下面的代碼:

import numpy as npimport cv2 as cvfrom matplotlib import pyplot as pltimg = cv.imread('home.jpg')color = ('b','g','r')for i,col in enumerate(color): histr = cv.calcHist([img],[i],None,[256],[0,256]) plt.plot(histr,color = col) plt.xlim([0,256])plt.show()結果:

您可以從上圖中得出,藍色在圖像中具有一些高值域(顯然這應該是由於天空)

2. 使用 OpenCV

好吧,在這裡您可以調整直方圖的值及其bin值,使其看起來像x,y坐標,以便您可以使用cv.line()或cv.polyline()函數繪製它以生成與上述相同的圖像。OpenCV-Python2官方示例已經提供了此功能。檢查示例/python/hist.py中的代碼。

掩碼的應用

我們使用了cv.calcHist()來查找整個圖像的直方圖。如果你想找到圖像某些區域的直方圖呢?只需創建一個掩碼圖像,在你要找到直方圖為白色,否則黑色。然後把這個作為掩碼傳遞。

img = cv.imread('home.jpg',0)# create a maskmask = np.zeros(img.shape[:2], np.uint8)mask[100:300, 100:400] = 255masked_img = cv.bitwise_and(img,img,mask = mask)# 計算掩碼區域和非掩碼區域的直方圖# 檢查作為掩碼的第三個參數hist_full = cv.calcHist([img],[0],None,[256],[0,256])hist_mask = cv.calcHist([img],[0],mask,[256],[0,256])plt.subplot(221), plt.imshow(img, 'gray')plt.subplot(222), plt.imshow(mask,'gray')plt.subplot(223), plt.imshow(masked_img, 'gray')plt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)plt.xlim([0,256])plt.show()查看結果。在直方圖中,藍線表示完整圖像的直方圖,綠線表示掩碼區域的直方圖。

附加資源

Cambridge in Color website:http://www.cambridgeincolour.com/tutorials/histograms1.htm

相關焦點

  • 「python opencv視覺零基礎」十四、直方圖反向投影
    前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • OpenCV-Python 直方圖-3:二維直方圖|二十八
    目標在本章中,我們將學習查找和繪製2D直方圖。這將在以後的章節中有所幫助。介紹在第一篇文章中,我們計算並繪製了一維直方圖。 之所以稱為一維,是因為我們僅考慮一個特徵,即像素的灰度強度值。 但是在二維直方圖中,您要考慮兩個特徵。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    cdf_m = np.ma.masked_equal(cdf,0)cdf_m = (cdf_m - cdf_m.min())*255/(cdf_m.max()-cdf_m.min())cdf = np.ma.filled(cdf_m,0).astype('uint8')現在我們有了查找表,該表為我們提供了有關每個輸入像素值的輸出像素值是什麼的信息。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • Python學習第89課-數據可視化之直方圖繪製
    【每天幾分鐘,從零入門python編程的世界!】假設你想投資某一個城市的房地產,你肯定需要對這個城市的人口分布、增長潛力做一個調查,這時我們就需要做一個直方圖(histogram plot)。bin的說明:bin在英式英語中意思是「垃圾桶」,當我們的數據非常多的時候,每一個數據都對應一個id,比如這個例子中,每一個年齡數據都對應一個人,如果每一個數據id都畫一個柱狀圖,那顯然畫出來非常多,不利於展示和分析。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    下面的GIF圖演示了這個想法:在目標檢測中,我們可以執行許多子任務,例如計算目標數量、查找目標的相對大小或查找目標之間的相對距離。這些子任務都很重要,因為它們有助於解決一些最棘手的現實問題。utm_source=blog&utm_medium=vehicle-detection-opencv-python)其他目標檢測物品和資源(https://www.analyticsvidhya.com/blog/tag/object-detection/?
  • 深入理解OpenCV+Python直方圖均衡化
    直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。
  • OpenCV-Python 直方圖-4:直方圖反投影|二十九
    目標在本章中,我們將學習直方圖反投影。理論這是由Michael J. Swain和Dana H. Ballard在他們的論文《通過顏色直方圖索引》中提出的。它用於圖像分割或在圖像中查找感興趣的對象。簡而言之,它創建的圖像大小與輸入圖像相同(但只有一個通道),其中每個像素對應於該像素屬於我們物體的概率。用更簡單的話來說,與其餘部分相比,輸出圖像將在可能有對象的區域具有更多的白色值。好吧,這是一個直觀的解釋。(我無法使其更簡單)。直方圖反投影與camshift算法等配合使用。
  • 如何快速簡單的安裝opencv-python
    目前opencv最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • OpenCV中的快速直線檢測
    本文範例運行環境FastLineDetectors運行必要條件FastLineDetectors屬於opencv-contrib中的模塊,需要安裝opencv-contrib-python。在python的opencv相關的安裝包中,opencv-python 包含主要模塊,opencv-contrib-python 包含主要模塊以及一些擴展模塊。但這兩個模塊並不兼容,如果已經安裝過opencv-python,需要先卸載,再安裝opencv-contrib-python。
  • Python第三方庫安裝
    Python第三方庫安裝方法包含:-pip安裝-集成環境自帶-文件安裝三種方法1. pip安裝1.1 如何查找第三方庫Python社區可以查找第三方庫的,其頁面如圖所示:pypi.org其中PyPI: Python Package Index是由PSF維護的展示全球Python計算生態的主站如要安裝圖像處理opencv-python庫可以搜索 opencv,但結果如下:
  • opencv-python圖像預處理-濾波
    為了消除外界環境對圖像採集的幹擾,增強圖像的邊緣及灰度跳變的部分,使圖像變得清晰以及提高圖像處理速度需要對圖像進行預處理操作,主要是對圖像進行濾波和增強操作。使用的方法可以分為空間域處理和頻率域處理兩類。空間域指圖像平面本身,這類圖像處理方法用各種模板直接與圖像進行卷積運算,實現對圖像的處理。
  • Python可視化很簡單,一文學會繪製柱狀圖、條形圖和直方圖
    、條形圖和直方圖相關的東東吧!>matplotlib.barh(x, y)參數x和參數y的含義和上面咱們所說的bar()函數參數的意思相同哦!執行以上命令,輸出如下條形圖哦:好啦,咱們了解了柱狀圖和條形圖之後,再一起了解一下直方圖哦!
  • python可視化:matplotlib繪製直方圖進階篇!
    在上篇文章中介紹了直方圖的前五個參數,實際上直方圖一共有十幾個參數,剩下的參數利用這篇文章解釋清楚,讓大家能夠將如何繪製直方圖理解的透透的。bottom參數這個參數的含義也很直觀,底部的意思,指的是條形的底從哪裡開始。
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • Python學習第90課-數據可視化之散點圖繪製
    【每天幾分鐘,從零入門python編程的世界!】今天我們學習散點圖,在統計學或者機器學習方面,或者在金融風險控制方面,金融風險控制經常要看異常交易、信貸風險,做這樣的分析就要用到一個圖--散點圖(scatter plot)。
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • 使用R語言繪製直方圖
    在本號前面的文章中介紹了R語言中繪製散點圖,折線圖,條形圖,餅圖和箱線圖的方法,有興趣的讀者關注本號後,可以往前看本號的所有文章,本文將介紹在R中繪製直方圖的方法。直方圖概述直方圖(Histogram)又稱柱狀圖,是由一系列高度不等的縱條紋或線段表示的數據分布情況。