天天看點

圖像腌膜Mask的正常操作你真的信手拈來嗎?

我對圖像腌膜的含義一直有些模糊,今天寫了幾行代碼,證明了我這模糊的印象倒是正确的。今天借一個給圖檔添加水印的小例子,給大家總結一些圖像腌膜的正常操作。

首先先了解一下圖像腌膜的定義:。。。

額,找了一圈好像并沒有啥特别正式的官方定義/我記得曾在書上看到過來着~

其實腌膜可以抽象為一個黑白相間的圖,或者膜,黑色的像素值為0,白色為1。将這個膜和你原本的圖像重合到一起,黑色區域被忽略,僅剩下白色區域,就是這樣。

就像把白色區域的圖像摳出來一樣,”摳圖“就是腌膜Mask最常幹的事。

廢話少說,咱們開始咱們的小實踐吧。

一:普通加水印:圖像加和

先看一下今天要處理的水印圖,一張白底紅字的logo圖:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

然後再看一下我們的底圖:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

我們要吧logo,也就是水印加到左上角去,首先我們想到的就是在左上角掏個和logo圖檔一樣大小的ROI區域出來,然後直接将logo添加到ROI區域裡,來看代碼:

運作效果如下:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

可以看到白色的底并不是我們想要的,是以就需要用到腌膜的相關摳圖,将五個紅色的字”摳“出來。

二:摳圖操作加水印

首先我們要完成的操作就是将這五個字識别出來,也就是摳出來,對于我們這個logo自然很簡單啦,隻需要轉灰階,然後門檻值化操作一下就可以了:

1,我們先定義一個腌膜Mask,然後将logo圖像轉為灰階圖像存入到Mask中:

處理後得到如下灰階圖:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

2,對腌膜Mask這個圖像矩陣進行取反操作:

對于上面操作我們需要多加解釋一下。

圖像的基本運算有很多種,比如兩幅圖像可以相加相減、相乘、相除、位運算、平方根、對數、絕對值等;

圖像也可以放大、縮小、旋轉,還可以截取其中的一部分作為ROI(感興趣區域)進行操作,各個顔色通道還可以分别提取及對各個顔色通道進行各種運算操作。

是以我們自然可以對圖像進行與,或,非,異或等操作啦。

bitwise_and:對二進制資料進行“與”操作,即對圖像(灰階圖像或彩色圖像均可)每個像素值進行二進制“與”操作,1&1=1,1&0=0,0&1=0,0&0=0

bitwise_or:對圖像(灰階圖像或彩色圖像均可)每個像素值進行二進制“或”操作,1|1=1,1|0=1,0|1=1,0|0=0

bitwise_xor:對圖像(灰階圖像或彩色圖像均可)每個像素值進行二進制“異或”操作,1^1=0,1^0=1,0^1=1,0^0=0

bitwise_not:對圖像(灰階圖像或彩色圖像均可)每個像素值進行二進制“非”操作,~1=0,~0=1

為什麼要對我們處理後得灰階圖進行取反操作呢?因為我們開頭說過,在腌膜中黑色無效,白色有效,而我們得灰階圖的底色确實白色的,字确實黑色的,是以進行取反操作,結果如下:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

3,對取反後的圖進行門檻值化操作,摳出五個字:

得到如下圖所示:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

4,進行圖像融合

通過上面步驟,我們得到了如上圖所示的黑底白字的腌膜了,下面就把腌膜加入到圖像融合中去。

可以看到copyTo方法中,有第二個參數mask,我們隻需要傳給他就可以了,很多現成的函數接口都有圖像腌膜這個參數,現在你知道怎麼用了吧。

來看看效果圖:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

是不是變成水印了呢?

三:添加非矩形的Mask區域

我們選取ROI區域一般都是用矩形,是以圈出來的區域都是矩形的,如何添加非矩形的呢?

首先我們讀取我們的logo圖檔,為了觀察友善我們換了如下一個logo:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

需要強調的是,接下來我們的操作都是基于這張logo的大小來進行的:

1,在原圖開出logo大小的ROI區域:

2,建立一個同logo一樣大的純黑的腌膜mask:

3,在黑色腌膜上畫出一個白色内填充的圓:

4,最後就還是一樣的操作,将logo複制到原圖ROI區域中去,并申明腌膜:

運作效果如下圖:

圖像腌膜Mask的正常操作你真的信手拈來嗎?

雖然有些醜,但好看又不能拿來找對象,是以就這樣叭。

到此,會添加圓形了,其他非規則的形狀就要通過關鍵點來進行确定了,我們隻需要将上述步驟中的第三步:在黑色腌膜上畫圓變成畫不規則多邊形就行了,如下:

建立多個點,然後進行輪廓繪制就好了,drawContours這個函數最後傳的參數-1為線寬,當為正時為寬度,為負則為向内填充,和畫圓函數類似。

圖像腌膜Mask的正常操作你真的信手拈來嗎?
圖像腌膜Mask的正常操作你真的信手拈來嗎?