什麼是掩膜(mask)
數字圖像處理中的掩膜的概念是借鑑於PCB製版的過程,在半導體制造中,許多芯片工藝步驟採用光刻技術,用於這些步驟的圖形「底片」稱爲掩膜(也稱做「掩模」),其做用是:在硅片上選定的區域中對一個不透明的圖形模板遮蓋,繼而下面的腐蝕或擴散將隻影響選定的區域之外的區域。
圖像掩膜與其相似,用選定的圖像、圖形或物體,對處理的圖像(所有或局部)進行遮擋,來控制圖像處理的區域或處理過程。
光學圖像處理中,掩模能夠是膠片、濾光片等。數字圖像處理中,掩模爲二維矩陣數組,有時也用多值圖像。數字圖像處理中,圖像掩模主要用於:css
①提取感興趣區,用預先製做的感興趣區掩模與待處理圖像相乘,獲得感興趣區圖像,感興趣區內圖像值保持不變,而區外圖像值都爲0。
②屏蔽做用,用掩模對圖像上某些區域做屏蔽,使其不參加處理或不參加處理參數的計算,或僅對屏蔽區做處理或統計。
③結構特徵提取,用類似性變量或圖像匹配方法檢測和提取圖像中與掩模類似的結構特徵。
④特殊形狀圖像的製做。html
掩膜是一種圖像濾鏡的模板,實用掩膜常常處理的是遙感圖像。當提取道路或者河流,或者房屋時,經過一個n*n的矩陣來對圖像進行像素過濾,而後將咱們須要的地物或者標誌突出顯示出來。這個矩陣就是一種掩膜。ios
用選定的圖像、圖形或物體,對待處理的圖像(所有或局部)進行遮擋,來控制圖像處理的區域或處理過程。用於覆蓋的特定圖像或物體稱爲掩模或模板。光學圖像處理中,掩模能夠足膠片、濾光片等。數字圖像處理中,掩模爲二維矩陣數組,有時也用多值圖像。數字圖像處理中,圖像掩模主要用於:①提取感興趣區,用預先製做的感興趣區掩模與待處理圖像相乘,獲得感興趣區圖像,感興趣區內圖像值保持不變,而區外圖像值都爲0。②屏蔽做用,用掩模對圖像上某些區域做屏蔽,使其不參加處理或不參加處理參數的計算,或僅對屏蔽區做處理或統計。③結構特徵提取,用類似性變量或圖像匹配方法檢測和提取圖像中與掩模類似的結構特徵。④特殊形狀圖像的製做。
'掩膜
數組
在OpenCV中咱們常常會遇到一個名字:Mask(掩膜)。不少函數都使用到它,那麼這個Mask到底什麼呢?markdown
一開始我接觸到Mask這個東西時,我還真是一頭霧水啊,也對沒法理解Mask到底有什麼用。通過查閱大量資料後,也對Mask有一點本身的理解了,下面就說說個人理解。函數
好比我要對一幅圖進行摳圖操做,這就要用到Mask了,那我就以摳圖爲例,解釋Mask在裏面的做用。post
先上程序,再一句一句剖析。ui
該程序的功能就是摳出指定區域。spa
#include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include <stdio.h> using namespace std; using namespace cv; int main() { Mat image, mask; Rect r1(100, 100, 250, 300); Mat img1, img2, img3, img4; image = imread("lol17.jpg"); mask = Mat::zeros(image.size(), CV_8UC1); mask(r1).setTo(255); img1 = image(r1); image.copyTo(img2, mask); image.copyTo(img3); img3.setTo(0, mask); imshow("Image sequence", image); imshow("img1", img1); imshow("img2", img2); imshow("img3", img3); imshow("mask", mask); waitKey(); return 0; }
原始圖
3d
注意程序中的這兩句關於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.copyTo(img2, mask);
下面兩句代碼所作的事情跟上面的差很少,首先將原始圖image拷貝一份給img3,而後img3將mask白色區域設置爲0(黑色),比如若是mask中像素非0的,我就把我圖像對應的那個點的像素值設置爲0,不然啥也不作。僞代碼是if mask(i,j)>0 then img3(i,j)=0。
image.copyTo(img3); img3.setTo(0, mask);
若是想要直接摳出目標區域,直接這樣寫就OK了:
img1 = image(r1);
轉自:https://www.cnblogs.com/bithuaning/p/6925037.html