在opencv中我們經常會遇到乙個名字:mask(掩膜)。很多函式都使用到它,那麼這個mask到底什麼呢?
一開始我接觸到mask這個東西時,我還真是一頭霧水啊,也對無法理解mask到底有什麼用。經過查閱大量資料後,也對mask有一點自己的理解了,下面就說說我的理解。
比如我要對一幅圖進行摳圖操作,這就要用到mask了,那我就以摳圖為例,解釋mask在裡面的作用。
先上程式,再一句一句剖析。
該程式的功能就是摳出指定區域。
#include
"opencv2/highgui/highgui.hpp"
#include
"opencv2/imgproc/imgproc.hpp"
#include
#include
using
namespace
std;
using
namespace cv;
intmain
()
原始圖
注意程式中的這兩句關於mask的操作。
mask = mat::zeros(image.size(), cv_8uc1);
mask(r1).setto(255); //r1是設定好的感興趣區域
解釋一下上面兩句的操作。
這樣就能得到mask影象了。
注意這句,哪個影象拷貝到哪個影象?
image
.copyto(img2, mask);
當然是原始圖image拷貝到目的圖img2上啦。
其實拷貝的動作完整版本是這樣的:
原圖(image)與掩膜(mask)進行與運算後得到了結果圖(img2)。
何為圖與掩膜的與運算?
其實就是原圖中的每個畫素和掩膜中的每個對應畫素進行與運算。比如1 & 1 = 1;1 & 0 = 0;
比如乙個3 * 3的影象與3 * 3的掩膜進行運算,得到的結果影象就是:
說白了,mask就是點陣圖啊,來選擇哪個畫素允許拷貝,哪個畫素不允許拷貝。如果mask畫素的值是非0的,我就拷貝它,否則不拷貝。
因為我們上面得到的mask中,感興趣的區域是白色的,表明感興趣區域的畫素都是非0,而非感興趣區域都是黑色,表明那些區域的畫素都是0。一旦原圖與mask圖進行與運算後,得到的結果圖只留下原始圖感興趣區域的影象了。也正如下圖所示。
下面兩句**所做的事情跟上面的差不多,首先將原始圖image拷貝乙份給img3,然後img3將mask白色區域設定為0(黑色),好比如果mask中畫素非0的,我就把我影象對應的那個點的畫素值設定為0,否則啥也不做。偽**是if mask(i,j)>0 then img3(i,j)=0。
如果想要直接摳出目標區域,直接這樣寫就ok了:
理解萬用字元掩碼
一 什麼是 萬用字元 掩碼 萬用字元 掩碼是乙個32位位元數,以點分十進位制表示,告訴路由器資料報ip位址的哪些位元需要和access list命令中給定的ip位址相匹配。二 萬用字元 掩碼的作用 一條典型的acl僅能指定乙個要允許或拒絕ip的規則,如果要阻止多個位址或一 一 什麼是萬用字元掩碼 萬...
子網掩碼怎麼理解
地主老了,需要把256間房子分給4個兒子,平均分配,每個兒子可以分64間。請來一位先生主持公道,先生這麼來操作 192.168.1.0 192.168.1.63 分給大兒子 192.168.1.64 192.168.1.127 分給二兒子 192.168.1.128 192.168.1.191 分給...
如何理解子網掩碼中的「子網」?
子網 ip位址由網路號 主機號組成 網路號標識的是internet上的乙個子網,而主機號標識的是子網中的某台主機。網際位址分解成兩個域後,帶來了乙個重要的優點 ip資料報從網際上的乙個網路到達另乙個網路時,選擇路徑可以基於網路而不是主機。在大型的網際中,這一點優勢特別明顯,因為路由表中只儲存網路資訊...