效果圖
未加水印前:
水印掩碼:
透明度為 0.3 的水印圖片:
透明度為 1.0 的水印圖片:
我自己編寫的這段代碼,其效果似乎比opencv官網上的示例更好,因為水印中沒有夾帶黑色噪點。
代碼語言:JavaScript 代碼運行次數:0
# coding=utf-8 import cv2 import numpy as np <p>bottom = cv2.imread('elegent.jpg') mark = cv2.imread('mask.jpg')</p><h1>加水印</h1><p>def waterMark(src, mask, transparency):</p><h1>對掩碼:轉為float型 --> 乘上透明度 --> 地板整數 --> 回到uint8型</h1><pre class="brush:php;toolbar:false">mask = np.floor(mask.astype(np.float32) * transparency).astype(np.uint8) dst = cv2.add(src, mask) # 防止溢出像素值域 dst = dst * (dst <= 255) + 255 * (dst > 255) # 回到uint8型 dst = dst.astype(np.uint8) return dst
b_rows, b_cols, b_channels = bottom.shape m_rows, m_cols, m_channels = mark.shape
將圖片右下角矩形塊 替換為 加過水印的矩形塊
bottom[b_rows-m_rows:b_rows, b_cols-m_cols:b_cols, ] = waterMark(bottom[b_rows-m_rows:b_rows, b_cols-m_cols:b_cols, ], mark, 0.3)
保存水印圖片
cv2.imwrite(‘waterMark.jpg’, bottom) cv2.imshow(‘waterMark’, bottom) cv2.waitKey(3000) cv2.destroyAllWindows()
對比OpenCV官網上的類似例程:
具體代碼:
代碼語言:JavaScript 代碼運行次數:0
# coding=utf-8 import cv2</p><p>img1 = cv2.imread('elegent.jpg') img2 = cv2.imread('mask.jpg')</p><p>b_rows, b_cols, b_channels = img1.shape m_rows, m_cols, m_channels = img2.shape</p><h1>I want to put logo on top-left corner, So I create a ROI</h1><p>rows,cols,channels = img2.shape roi = img1[b_rows-m_rows:b_rows, b_cols-m_cols:b_cols, ]</p><h1>Now create a mask of logo and create its inverse mask also</h1><p>img2gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY) ret, mask = cv2.threshold(img2gray, 10, 255, cv2.THRESH_BINARY) mask_inv = cv2.bitwise_not(mask)</p><h1>Now black-out the area of logo in ROI</h1><p>img1_bg = cv2.bitwise_and(roi,roi,mask = mask_inv)</p><h1>Take only region of logo from logo image.</h1><p>img2_fg = cv2.bitwise_and(img2,img2,mask = mask)</p><h1>Put logo in ROI and modify the main image</h1><p>dst = cv2.add(img1_bg,img2_fg)</p><h1>img1[0:rows, 0:cols ] = dst</h1><h1>將圖片右下角矩形塊 替換為 加過水印的矩形塊</h1><p>img1[b_rows-m_rows:b_rows, b_cols-m_cols:b_cols, ] = dst</p><p>cv2.imwrite('res.jpg', img1) cv2.imshow('res',img1) cv2.waitKey(0) cv2.destroyAllWindows()
該例程的實現效果:
劣勢:通過細節放大圖可以看出,OpenCV官網例程的效果較差,不僅無法自定義水印透明度,而且水印中還會夾帶黑色噪點,影響美觀: