OpenCV系列 詳解掩膜mask

2021-09-12 02:16:19 字數 1976 閱讀 1165

在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;

int main()

原始圖

注意程式中的這兩句關於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了:

原文:簡單理解:可以把mask理解為roi,只對roi的區域進行處理,其他地方不變化

OpenCV學習 掩膜

影象掩膜,用選定的影象 圖形或物體,對處理的影象 全部或區域性 進行遮擋,來控制影象處理的區域或處理過程。掩膜是一種影象濾鏡的模板,實用掩膜經常處理的是遙感影象。當提取道路或者河流,或者房屋時,通過乙個n n的矩陣來對影象進行畫素過濾,然後將我們需要的地物或者標誌突出顯示出來。這個矩陣就是一種掩膜。...

opencv 掩膜操作

saturate cast函式保證運算後全部歸一化在0 255之間,注意上面row,col的移動範圍是很有講究的,的四個邊緣行因為沒有完整的上下左右所以省略,然而在實際應用掩膜操作時候並不用到自己這麼複雜的寫 opencv中提供了乙個filter2d函式。mat kernel mat 3,3 0,1...

opencv矩陣掩膜操作

include include using namespace std using namespace cv intmain imshow 操作前 src double t gettickcount 定義掩膜矩陣 卷積核 掩膜可以自己定義,不同矩陣效果不同 0 1 0 1 5 1 掩膜可以自己定義,...