OpenCV入門——Mat操作

OpenCV入門——Mat操作

來自專欄計算機視覺、圖像處理、機器視覺、人工智慧

時間總是被打斷,又過了一段忙碌的日子。感覺好久沒有更新了。一直想寫關於opencv操作的內容,讓想學計算機視覺的入門者找到感覺,這段時間給別人做了關於計算機視覺基於人工智慧方面的講座。今天終於騰出來點時間。

Mat數據類型是Opencv2.0以後的圖像數據,比之前的IplImage要方便很多。學習opencv,第一步就是熟悉Mat數據並掌握怎麼操作該圖像數據。可能很多書都有這方面的內容,但是介紹了操作都不是很全,因此,我想一步步做一個比較全的操作函數介紹,讓大家慢慢熟悉opencv。Mat的操作可以說是以後圖像處理的基礎,因為我們除了調用opencv自帶的函數外,很多時候需要我們開發自己的圖像處理函數,這些都涉及到Mat的操作。今天先介紹下最基礎的加減乘除運算。

Add和scaleAdd屬於加運算。可以理解為兩個矩陣進行了加運算,Add加法可以包括一個掩膜圖像進行計算,函數原型如下:

Add(IInputArray src1, IInputArray src2, IOutputArray dst, IInputArray mask = null, DepthType dtype = DepthType.Default)

其中第一和第二個參數是要相加的兩個Mat矩陣,當然也可以是圖像,因為圖像數據也是用矩陣來存儲的。第三個參數為輸出Mat,第四個參數為掩膜矩陣,也可以是圖像,如果不需要可以為null,最後用一個參數為圖像的深度。需要說明的是IInputArray和IOutputArray類型是一個代理數據類型,可以直接傳Mat數據。此外,掩膜圖像可能剛開始有些人不太懂,這裡多說幾句。如下所示:

圖1 掩膜圖像

如果以圖1作為掩膜圖像,圖1中白色部分值為255,黑色部分為0,當一個圖像與圖1進行與運算時,由於白色部分255的二進位為11111111,黑色為00000000,因此,白色區域以外的與運算都是0,只有白色部分保持不變,即只保留了白色區域,這對於只進行感興趣區域的運算時非常有效的。

圖2 add界面

圖3 圖像深度類型

圖4 相加後的結果

圖2和圖3是我做了一個圖像相加的界面。圖4是相加後的結果,這是沒有帶掩膜的加,相加之後圖像變亮了,這是可以理解的,因為值變大了。

圖5 帶權重的圖像加法

圖5是帶權重的兩圖相加,也就是scaleAdd函數,可以讓輸入圖像1和輸入圖像2乘上一定的權重後相加。

圖6 這是帶權重相加的結果

理解了圖像Mat加法,對於其他的也就很好理解了。操作也很方便。

Subtract(IInputArray src1, IInputArray src2, IOutputArray dst, IInputArray

mask = null, DepthType dtype = DepthType.Default);——相減

AbsDiff(IInputArray src1, IInputArray src2, IOutputArray dst);——相減後取絕對值

Multiply(IInputArray src1, IInputArray src2, IOutputArray dst, double

scale = 1, DepthType dtype = DepthType.Default);——相乘

Divide(IInputArray src1, IInputArray src2, IOutputArray dst, double

scale = 1, DepthType dtype = DepthType.Default);——相除

以上就是減法運算和乘法除法運算的函數,可以看出,與加法函數是類似的,都是傳入兩個矩陣數據進行運算。


推薦閱讀:

教你如何製作自己的人臉識別系統
SLAM 學習視頻合集
機器是如何獲得人臉識別能力的
skimage例子學習(七)filters模塊介紹之邊緣檢測的實現
論文筆記:《DeblurGAN: Blind Motion Deblurring Using Conditional Adversarial Networks》

TAG:計算機視覺 | 圖像處理 | 圖像識別 |