[python opencv 計算機視覺零基礎到實戰] 十五 直方圖反向投影

一、學習目標

  1. 了解了直方圖反向投影的一般流程
  2. 了解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 cv2
import numpy as np
from 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 cv2
import numpy as np
from 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 cv2
import numpy as np
from 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 cv2
import numpy as np
from 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:

目標:

結果:

該系列首發于ebaina

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/287494.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/287494.shtml
英文地址,請注明出處:http://en.pswp.cn/news/287494.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

關聯規則java代碼_重量挖掘關聯規則挖掘方法,哪個大神可以將以下偽代碼轉換為Java代碼?...

重量挖掘關聯規則挖掘方法,哪個大神可以將以下偽代碼轉換為Java代碼? 10改進的加權關聯規則算法的基本步驟與Apriori算法相似: 首先找到加權支持度不小于用戶指定的最小加權支持度的所有頻繁項集加權關聯規則,然后使用頻繁項集生成所有滿足最…

Boostrap ZURB Foundation —— Web開發前端框架

webflow:Webflow 允許設計師通過自由的拖拉拽與 CSS 類互動,而定義它們的過程無需寫任何一行代碼。用戶在完成從設計到 CSS 構架之后,甚至可以在線直接將建好的網頁發布,而不需要導出代碼到其他發布工具上。類似的這些 B2D 市場&a…

Git之HEAD和origin

1 問題 我們經常看見git相關操作里面看到HEAD和origin這些專業名稱,它娘的到底什么意思。 2 解釋 1)HEAD git 中的分支,本質上僅僅是個指向 commit 對象的可變指針, HEAD 是一個特別指針,它是一個指向你正在工作中的…

如何離線安裝chrome插件

如何離線安裝chrome插件 本文轉自Work Hard Work Smart博客園博客,原文鏈接:http://www.cnblogs.com/linlf03/p/6838852.html,如需轉載請自行聯系原作者

多種語言《九九乘法表》薈萃:C、C++、C#、JavaScript、SQL、VB、VBA、Python

九九乘法表對于我們學習循環結構,尤其是雙重循環特別有幫助,本文演示用C、C++、C#、HTML、SQL、VB、VBA、Python等多種語九九乘法表。 一、C語言 #include<stdio.h> main() {int i,j;for(i=1;i<=9;i++){for(j=1;j<=i;j++){printf("%d*%d=%d\t",j,i,i*j…

Git之刪除遠程分支

1 問題 在工作區間刪除遠程分支 2 刪除命令 git push origin --delete name

iptables (2) 基本配置

iptables 基本命令使用舉例 一、鏈的基本操作 1、清除所有的規則。1&#xff09;清除預設表filter中所有規則鏈中的規則。# iptables -F -F, --flush [chain]Flush the selected chain (all the chains in the table if none is given). This is equivalent to deleting all …

[python opencv 計算機視覺零基礎到實戰] 十六、用opencv畫畫

一、學習目標 了解如何使用line方法了解如何使用rectangle方法了解如何使用ellipse方法 如有錯誤歡迎指出~ 二、了解OpenCV的繪圖方法 2.1 了解直線繪圖方法 我們在前兩節中有了解使用OpenCV中的矩形繪制&#xff0c;接下來我們了解一下更多的圖形繪制方法。我們在OpenCV中…

基于.NetCore開發博客項目 StarBlog - (5) 開始搭建Web項目

系列文章基于.NetCore開發博客項目 StarBlog - (1) 為什么需要自己寫一個博客&#xff1f;基于.NetCore開發博客項目 StarBlog - (2) 環境準備和創建項目基于.NetCore開發博客項目 StarBlog - (3) 模型設計基于.NetCore開發博客項目 StarBlog - (4) markdown博客批量導入基于.N…

java計算每個元素出現的百分比_Java程序計算百分比

百分數表示百分數(百)&#xff0c;即百分數與100之比。百分數的符號為&#xff05;。我們通常會計算獲得的商標&#xff0c;投資回報率等百分比。該百分比也可以超過100&#xff05;。例如&#xff0c;假設我們有總數和一部分。所以我們說那一部分占總數的百分之幾&#xff0c;…

ECShop 前臺用戶中心調整左側欄目及中心部分呈現頁面

1、首先調整用戶中心左側欄目&#xff0c;在 .dwt 里面我修改了半天&#xff0c;頁面沒改動。。后來某大神說這個是在另一個文件里&#xff1a;/themes/你用的模板目錄/library/user_menu.lbi 文件改一個試試吧~ 不出意外的成功了吧2、中心部分呈現內容的調整。&#xff08;今天…

【測繪程序設計】高斯克呂格投影:帶號及中央經度計算神器V1.0(附源程序)

【問題描述】:很多情況下,我們知道某一地點的坐標(經緯度),需要計算其在高斯克呂格投影中的帶號及中央經度。關于該問題,有具體的公式可言,只是計算過程稍微繁瑣一些,當然啦,我們可以寫程序來解決,誰叫我們是名副其實的GISer呢?另外,這些復雜的計算過程還是交給計算…

外部中斷0(含知識點)

1 #include "stm32f10x.h" // 相當于51單片機中的 #include <reg51.h>2 #include "stm32f10x_gpio.h"3 #include "stm32f10x_exti.h"4 #include "misc.h"5 6 /*外部中斷配置*/7 8 9 int main(void)10 {11 /*************…

Git之tag

1 tag相關命令 1) 打上tag git tag v1.0.0 git tag -a v1.0.0 -m info 2) 查看tag git tag 3) 切換tag git checkout tagname 4) 刪除tag git tag -d v1.0.0 5) 推送遠程 推送單個tag git push origin v1.0.0 推送所有tag git push origin --tags

[python opencv 計算機視覺零基礎到實戰] 十七、用鼠標畫畫

一、學習目標 了解長軸和短軸參數了解旋轉角度參數了解起始角度參數了解終止角度參數 二、深入了解OpenCV的ellipse方法 2.1 縱橫 橢圓的繪制方法在上一節中我們已經知道了是使用ellipse&#xff0c;ellipse的函數原型如下&#xff0c;為了清晰認識ellipse方法&#xff0c;…

Microsoft Build 2022 到來,開發者們做好準備了嗎?

Microsoft Build 2022 將會在5月24日 - 5月26日正式舉行&#xff0c;作為開發者的你是否和我一樣期待本次的 Build&#xff0c;它會帶來什么的技術革新以及黑科技呢&#xff1f;下面我就針對今年 Build 的幾個主題結合相關技術來談談我對 Build 的期待。開發技術和相關工具今年…

【測繪程序設計】視距測量神器V1.0(附源程序)

神器預覽: 一、視距測量概念 視距測量是利用水準儀的望遠鏡內十字絲分劃板上的視距絲在視距尺(水準尺)上讀數,根據光學和幾何學原理,同時測定儀器到地面點的水平距離和高差的一種方法。 視距測量具有操作簡便、速度快、不受地面起伏變化的影響的優點,被廣泛應用于碎部測…

補作業:隨機生成二元四則運算

四則運算代碼如下&#xff0c;基礎不好&#xff0c;剛完成作業&#xff0c;希望老師多給點平時成績&#xff0c;謝謝老師&#xff01;#include<stdio.h>#include<stdlib.h>#include<time.h>int right0,wrong0;int a,b,c,d;/*加法運算*/void add(){int i,j;fo…

java 從數據庫取值_java 連接數據庫取值問題

publicvoiddoGet(HttpServletRequestrequest,HttpServletResponseresponse)throwsIOException,ServletException{//TODOAuto-generatedmethodstubXzdatasqlToolnewXzdata();//初始化并...public void doGet(HttpServletRequest request,HttpServletResponse response) throws I…

條件表達式

1.python中&#xff1a; a 1b 2 if a>1 else 3 2.C語言中&#xff1a;max (a>b)?a:b; 說明&#xff1a;條件運算符優先于賦值運算符 也可以這樣寫&#xff1a;a>b? a:c>d? c:d / a>b? (a100):(b100)轉載于:https://www.cnblogs.com/yjw9520/p/4841301.ht