「python opencv視覺零基礎」十四、直方圖反向投影

2021-01-18 1bit愛學習

前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~

目錄

「python opencv 計算機視覺零基礎實戰」 第一節

「python opencv視覺入門到實戰」二、格式與攝像頭

「python opencv 視覺入門到實戰」 三、圖像編輯

「python opencv視覺入門到實戰」 第四節色彩空間

「python opencv視覺入門到實戰」 五、對象追蹤

「python opencv視覺零基礎到實戰」 六、圖像運算

「python opencv視覺零基礎實戰」 七邏輯運算應用

「python opencv視覺零到實戰」 八、圖片選區操作

「python opencv計算機視覺零基礎到實戰」 九模糊

「python opencv視覺零基礎」 十、圖片效果毛玻璃

「python opencv視覺零基礎」 十一、指定內容查找

「python opencv 視覺零基礎」 十二、 直方圖

「python opencv視覺零基礎」十三、圖片顏色提鮮

一、學習目標

了解了直方圖反向投影的一般流程了解2D直方圖的使用如有錯誤歡迎指出~

二、了解直方圖反向投影

2.1 了解2D直方圖

需要對直方圖進行反向投影,需要使用2D直方圖。2D直方圖需要使用calcHist方法。calcHist方法在前兩節中已經有了解,現在再來複習一下。首先我們查看calcHist方法的原型。

calcHist(images; channels; mask; histSize; ranges[; hist[; accumulate]])calcHist方法中images參數為所需要傳入的圖像,接受類型為uint8以及float32,參入參數時可以使用[]對參數進行標記;channels為傳入的通道數;mask為一個遮罩,如果為None則表示對全圖進行操作,若選擇其中一個部分就需要製作一個遮罩對局部進行操作;histSize為一個範圍,或者說是BIN的數目;ranges表示像素值範圍。

我們要繪製一個顏色直方圖的話,需要對BGR色彩空間進行轉換,轉換為HSV:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)隨後我們使用calcHist方法傳入數值,這個時候channels應該為[0,1],mask我們依舊為None,因為我們需要處理全圖;而histSize則表示了兩個通道,H以及S,所以應該寫成[180,256],即H通道為180,S通道為256,最後一個range則為[0,180,0,256],表示H取值範圍在和S的取值範圍。那麼整體的代碼如下:

import cv2import numpy as npfrom matplotlib import pyplot as pltimg = cv2.imread(r'C:\Users\mx\Desktop\1.jpg')hsv = cv2.cvtColor(img,cv2.COLOR_BGR2HSV)hist = cv2.calcHist([hsv], [0,1], None, [180,256], [0,180,0,256])plt.imshow(hist, interpolation='nearest')plt.show()結果如下:

2.2 了解直方圖反向投影

直方圖反向投影可以在圖像中找到我們感應區的部分,直方圖反向投影將會輸出模板圖像中類似的部分,越亮的的部分則表示得越白。我們需要完成這個操作首先得有一張需要查找的對象,隨後需要一張圖為查找區域。我們可以先對需要查找目標的圖像創建一個直方圖,隨後進行歸一化處理。歸一化處理使用normalize方法。首先我們進行讀取圖片與轉換HSV色彩空間圖,也順帶一起讀取目標掃描的圖片,原圖和目標圖、代碼如下:原圖:

目標圖:

roi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)隨後對hsv_roi 感興趣的部分進行2D直方圖處理:

roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )接下來使用normalize方法進行歸一化;歸一化是將數據達到一種可進行對比的標準,但是保持了原有數據間的關係。代碼為:

cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)其中roihist為輸入數據,roihist為與src大小相同的輸出數據,0為一個範圍低邊界,255為範圍的上限,cv2.NORM_MINMAX是一個歸一化的方法,表示對數組的所有值進行轉化,使值的映射在最小值和最大值之間。這樣歸一化後他們的值就在0到255之間了。接著我們使用calcBackProject方法,calcBackProject方法與calcHist的參數類似。 cvCalcBackProject 用於計算直方圖的反向投影,得到的結果是數組在某個分布下的概率。

dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1) 隨後使用getStructuringElement方法進行卷積,把分散點連接:

gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))dst=cv2.filter2D(dst,-1,gSEE)接著使用閥值方法:

ret,thresh = cv2.threshold(dst,50,255,0)最後進行合併:

trh = cv2.merge((trh,trh,trh))完整代碼如下:

import cv2import numpy as npfrom matplotlib import pyplot as pltroi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1)gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))dst=cv2.filter2D(dst,-1,gSEE)ret,trh = cv2.threshold(dst,50,255,0)trh = cv2.merge((trh,trh,trh))cv2.imshow('trh',trh)cv2.waitKey(0)cv2.destroyAllWindows()結果如下:

當然我們也可以進行位運算,這樣我們就可以取出顏色部分了,所有完整代碼如下:

import cv2import numpy as npfrom matplotlib import pyplot as pltroi = cv2.imread(r'C:\Users\mx\Desktop\gz\roi.png')hsv_roi = cv2.cvtColor(roi,cv2.COLOR_BGR2HSV)target = cv2.imread(r'C:\Users\mx\Desktop\gz\4.png')hsv_target = cv2.cvtColor(target,cv2.COLOR_BGR2HSV)roihist = cv2.calcHist([hsv_roi],[0, 1], None, [180, 256], [0, 180, 0, 256] )cv2.normalize(roihist,roihist,0,255,cv2.NORM_MINMAX)dst = cv2.calcBackProject([hsv_target],[0,1],roihist,[0,180,0,256],1)gSEE = cv2.getStructuringElement(cv2.MORPH_ELLIPSE,(5,5))dst=cv2.filter2D(dst,-1,gSEE)ret,trh = cv2.threshold(dst,50,255,0)trh = cv2.merge((trh,trh,trh))cv2.imshow('trh',trh)res = cv2.bitwise_and(target,trh)cv2.imwrite('res.jpg',res)cv2.imshow('res',res)cv2.waitKey(0)cv2.destroyAllWindows()結果如下:

我們也可以換一下圖:roi:

目標:

結果:

前文提醒:博主正在參加博客之星評比,成功入選Top200,現在暫居第九歡迎各位點擊了解更多幫我投票,非常感謝~

相關焦點

  • 「python opencv視覺零基礎」十、圖片效果毛玻璃
    一、學習目標了解高斯模糊的使用方法了解毛玻璃的圖片效果添加了解如何自己做一個噪聲圖片目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • 「python opencv計算機視覺零基礎到實戰」九模糊
    一、學習目標了解什麼是卷積了解模糊的使用方法與應用目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰」 第四節色彩空間
  • 「python opencv視覺零基礎實戰」七邏輯運算應用
    一、學習目標了解opencv中圖像的邏輯運算了解opencv中邏輯運算的應用如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python
  • 「python opencv視覺零到實戰」八、圖片選區操作
    一、學習目標了解什麼是ROI了解floodFill的使用方法如有錯誤歡迎指出~目錄「python opencv 計算機視覺零基礎實戰」 第一節「python opencv視覺入門到實戰」二、格式與攝像頭「python opencv 視覺入門到實戰」 三、圖像編輯「python opencv視覺入門到實戰
  • OpenCV-Python 直方圖-3:二維直方圖|二十八
    目標在本章中,我們將學習查找和繪製2D直方圖。這將在以後的章節中有所幫助。介紹在第一篇文章中,我們計算並繪製了一維直方圖。 之所以稱為一維,是因為我們僅考慮一個特徵,即像素的灰度強度值。 但是在二維直方圖中,您要考慮兩個特徵。
  • OpenCV-Python 直方圖-4:直方圖反投影|二十九
    目標在本章中,我們將學習直方圖反投影。理論這是由Michael J. Swain和Dana H. Ballard在他們的論文《通過顏色直方圖索引》中提出的。直方圖反投影與camshift算法等配合使用。我們該怎麼做呢?我們創建一個圖像的直方圖,其中包含我們感興趣的對象(在我們的示例中是背景,離開播放器等)。對象應儘可能填充圖像以獲得更好的效果。而且顏色直方圖比灰度直方圖更可取,因為對象的顏色對比灰度強度是定義對象的好方法。
  • OpenCV-Python 直方圖-2:直方圖均衡|二十七
    例如,在人臉識別中,在對人臉數據進行訓練之前,對人臉圖像進行直方圖均衡化處理,使其具有相同的光照條件。OpenCV中的直方圖均衡OpenCV具有執行此操作的功能cv.equalizeHist()。它的輸入只是灰度圖像,輸出是我們的直方圖均衡圖像。
  • opencv教程-目標跟蹤
    1:MeanShift算法retval, window=cv.meanShift(probImage, window, criteria)參數probImage:當前圖像反向投影圖參數window:前一圖像目標框參數criteria:迭代停止條件
  • 世界上最好的語言PHP:OpenCV與計算機視覺已在我掌控之下
    現今,「機器學習」發展迅速,並有大量相關的文章,包括那些 Medium 上的博客,同時幾乎每位開發人員都開始在工作任務和本地項目中使用機器學習,但是從何處開始以及使用什麼方法總是令人困惑的。大多針對初學者的文章提供了一堆文獻,在閱讀中發現這些文章脫離生活,或提供一些「價」的課程等。
  • 如何快速簡單的安裝opencv-python
    這樣就會從清華鏡像安裝opencv-contrib-python庫。目前opencv最新版本為4.1.1 ----2019-8-28在opencv-contrib-python 版本中含有額外模塊( Extra modules ),而 opencv-python 版本中只含有基礎模塊。
  • 深入理解OpenCV+Python直方圖均衡化
    直方圖均衡化是圖像處理領域中利用圖像直方圖對對比度進行調整的方法。
  • 基於OpenCv 和 Python 的手指識別及追蹤
    翻譯 | 餘杭 Lamaric 校對 | 吳曉曼 審核 | 餘杭詳細代碼參考:https://github.com/amarlearning/opencv手指追蹤是許多計算機視覺應用的重要特徵。在該應用中,使用基於直方圖的方法將手與背景幀分離。
  • 使用OpenCV和Python構建自己的車輛檢測模型
    以下是兩門熱門課程,可開啟你的深度學習之旅:深度學習基礎(https://courses.analyticsvidhya.com/courses/fundamentals-of-deep-learning?
  • OpenCV-Python 直方圖-1:查找、繪製和分析|二十六
    當今幾乎所有圖像處理工具都提供直方圖功能。以下是劍橋彩色網站的圖片,我建議您訪問該網站以獲取更多詳細信息。您可以看到圖像及其直方圖。(請記住,此直方圖是針對灰度圖像而非彩色圖像繪製的)。直方圖的左側區域顯示圖像中較暗像素的數量,而右側區域則顯示明亮像素的數量。從直方圖中,您可以看到暗區域多於亮區域,而中間調的數量(中間值的像素值,例如127附近)則非常少。
  • 「深度學習之opencv」Mat數據的矩陣輸出
    C++中使用opencv的時候,我們有事想看一下我們的圖像的數據,那麼怎麼將一個圖像數據輸出呢?sizeMat的默認輸出風格:默認風格Mat的Python輸出風格,就是python實際上,這不僅限於深度學習和計算機視覺,還包括模型算法原理,模型訓練,模型轉換優化,模型部署和深度學習框架。此外,還有C ++,數據結構和編譯底層等。歡迎大家的關注,我們將共同探討進步。
  • Python中如何利用Opencv打開視頻或圖像並用PyQt控制項顯示
    OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS作業系統上,使用起來十分方便,把它與PyQt結合起來,就可以順利的操作視頻、圖像了。具體安裝請自行百度,這裡介紹使用方法。
  • 資料| Practical Python and OpenCV 一周時間帶你入門CV
  • opencv-python獲取圖像:面向對象與面向過程
    這裡需要注意以下,opencv讀取圖片默認通道為BGR的格式,當在其他UI用戶界面顯示圖像時注意轉換一下通道順序,例如BGR轉換成RGB:Image1=cv2.cvtColor(image, cv2.COLOR_BGR2RGB)下面讀取一張圖片並顯示
  • opencv-python圖像預處理-濾波
    圖像濾波(模糊)濾波也叫模糊,下面是opencv中常見的五種濾波方法,先看一下濾波前後的效果。# -*- coding: utf-8 -*-"""運行環境 python==3.6 opencv-contrib-python== 4.1 win10系統第一行 「 # -*- coding: utf-8 -*- 」 告訴Python解釋器,按照UTF-8編碼讀取原始碼"""dir1="lena.jpg"
  • 基於python+OpenCV模塊的人臉識別定位技術
    什麼是OpenCV模塊OpenCV是一款跨平臺的視覺庫,可以支持的作業系統有Linux、Windows和Mac OS作業系統,並且還提供了多種語言的接口,比如Python,java,MATLAB等常用語言。