平面設計工作室網(wǎng)站網(wǎng)站推廣如何引流
如何添加水印?
添加水印其實可以理解為將一張圖片中的某個物體或者圖案提取出來,然后疊加到另一張圖片上。具體的操作思想是通過將原始圖片轉(zhuǎn)換成灰度圖,并進行二值化處理,去除背景部分,得到一個類似掩膜的圖像。然后將這個二值化圖像與另一張圖片中要添加水印的區(qū)域進行“與”運算,使得目標物體的形狀出現(xiàn)在要添加水印的區(qū)域。最后,將得到的目標物體圖像與要添加水印的區(qū)域進行相加,就完成了添加水印的操作。這樣可以實現(xiàn)將一個圖像中的某個物體或圖案疊加到另一個圖像上,從而實現(xiàn)添加水印的效果。
何為掩膜?
掩膜(Mask)是一種在圖像處理中常見的操作,它用于選擇性地遮擋圖像的某些部分,以實現(xiàn)特定任務的目標。掩膜通常是一個二值化圖像,并且與原圖像的大小相同,其中目標區(qū)域被設置為1(或白色),而其他區(qū)域被設置為0(或黑色),并且目標區(qū)域可以根據(jù)HSV的顏色范圍進行修改
沒聽懂沒關(guān)系,下面開始詳細介紹
示例演示
將準備好的logo圖作為水印模板,本篇以下圖作為水印模板與目標模板
注: 本示例以白底的水印模板演示,所以我們需要準備一張黑底的掩膜(目標區(qū)域位為白色)?
????????黑底的水印模板則不需要多準備一張黑底的掩膜,直接從下面第二步開始即可
如果你是在分不清要準備什么底的掩膜,那就都準備吧,兩個掩膜都試一試
第一步
首先我們需要先將顏色空間轉(zhuǎn)換成HSV,再制造一個掩膜(目標區(qū)域為黑色,后面要進行與運算)用來確定logo的范圍。
方法一:水印模板上出現(xiàn)了兩種顏色,所以要制作兩個掩膜,再將兩個掩膜合為一個掩膜(或運算),這樣就可以篩選水印模板中的所有l(wèi)ogo信息,掩膜如下:
?
但直接調(diào)用接口制作的掩膜(如上圖)中,目標區(qū)域是白色的,如果你需要的是目標區(qū)域為黑色的掩膜,建議用下面的第二種方法,直接得到目標區(qū)域為黑色的掩膜
方法二:掩膜本身也就是一個二值化的二維數(shù)組,我們也可以對原圖灰度化后在進行二值化,得到的結(jié)果如下,二值化后的圖(右側(cè))也可以用做掩膜使用。
?第二步
在目標模板上利用ROI切割出自己想要的區(qū)域(你想將水印添加的區(qū)域),ROI切割可以參照我之前的文章??????????????
?06篇--圖片目標區(qū)域的 ROI切割-CSDN博客
第三步
將掩膜與目標模板進行與運算,之后:
- 掩膜(白色部分)會被目標模板(相應的部分)替代
- 掩膜(黑色部分)會將目標模板(相應的部分)替代
得到的結(jié)果與切割部分進行對比:
將切割出來的部分img_roi與掩膜進行與運算,之后:
- 掩膜(白色部分)會被目標模板(相應的部分)替代
- 掩膜(黑色部分)會將目標模板(相應的部分)替代
得到的結(jié)果與切割部分進行對比:
第四步
就是將圖像對應的數(shù)組中的對應元素進行相加(一定要注意這里的兩個數(shù)組是規(guī)格相同的,也就是說要么都是灰度圖,要么都是彩圖),其過程如下圖所示
cv2.add()函數(shù),用于執(zhí)行上面的過程,可得到如下結(jié)果
第五步
將已經(jīng)融合好的部分替換掉目標模板中的相應部分(被切割的那一部分),利用切片進行。
??
?如果還是對上述步驟有疑問,歡迎在評論區(qū)提問。
?代碼演示
import cv2
import numpy as np#讀取圖像
logo = cv2.imread('image/logo_1.png')
img = cv2.imread('image/logo_demo.png')#第一種方法獲取掩膜
#先轉(zhuǎn)換顏色空間
logo_hsv = cv2.cvtColor(logo,cv2.COLOR_BGR2HSV)#制作紅色掩膜
red_min= np.array([0,43,46])
red_max = np.array([10,255,255])
logo_mask_1_1 = cv2.inRange(logo_hsv,red_min,red_max)#制作黑色掩膜
black_min = np.array([0,0,0])
black_max = np.array([180,255,220])
logo_mask_1_2 = cv2.inRange(logo_hsv,black_min,black_max)#將兩個掩膜合并
logo_mask_1 = cv2.bitwise_or(logo_mask_1_1,logo_mask_1_2)#第二種方法獲取掩膜
#灰度化
logo_gray = cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
#二值化結(jié)果充當掩膜
_,logo_mask_2 = cv2.threshold(logo_gray,127,255,cv2.THRESH_BINARY + cv2.THRESH_OTSU)
#獲取掩膜大小
rows,cols = logo.shape[:2]#ROI切割
#要切割的矩形的top_left的坐標點
x1,y1 = 750,425
def ImgRoi(img,x1,y1):# 提取該圖片的寬高h,w = img.shape[0], img.shape[1]#獲取掩膜坐標,x2,y2x2 = x1 + colsy2 = y1 + rowsif x1<0 or x2>w or y1<0 or y2>h:print("要切割的區(qū)域是不合適的")else:# 給要切割的內(nèi)容畫個框# cv2.rectangle(img, (x1-2, y1-2), (x2+2, y2+2), (0, 0, 255), 2)# 保存要切割的內(nèi)容img_roi = img[y1:y2, x1:x2]return img_roiimg_roi = ImgRoi(img,x1,y1)# 進行與運算
logo_mask = cv2.bitwise_and(logo,logo,mask=logo_mask_1)
img_roi_mask = cv2.bitwise_and(img_roi,img_roi,mask=logo_mask_2)#進行相加,得到融合的圖像img_roi_mask,并合并到img中
img_roi_logo = cv2.add(img_roi_mask,logo_mask)
img[y1:(y1+rows), x1:(x1+cols)] = img_roi_logocv2.imshow('logo_mask',img)cv2.waitKey(0)