OpenCV(Open Source Computer Vision Library)是一個跨平台計算機視覺庫,實現了圖像處理和計算機視覺方面的很多通用算法
在python中可以利用opencv來去除水印
opencv安裝
window10
OpenCV 3:http://www.lfd.uci.edu/~gohlke/pythonlibs/#opencv
Numpy:http://www.lfd.uci.edu/~gohlke/pythonlibs/#numpy
將下載好的whl文件放置到一個方便的目錄,打開cmd,安裝
pip install xxx
測試
import cv2
沒有報錯則說明成功
參考自https://www.ywlib.com/archives/39.html
下面開始去除水印, 使用58圖片做測試
基於OpenCV的兩種去水印方案
1. 基於 inpaint 方法(網上的方法,處理質量較低)
- 算法理論:基於Telea在2004年提出的基於快速行進的修復算法(FMM算法),先處理待修復區域邊緣上的像素點,然后層層向內推進,直到修復完所有的像素點
- 處理方式:由ui人員制作出黑底白色水印且相同位置的水印蒙版圖(必須單通道灰度圖),然后使用inpaint方法處理原始圖像,具體使用時可把水印區放粗,這樣處理效果會好點
需要帶水印的圖,和該圖一樣大小的的黑底白色水印且位置相同的水印圖
test_dir = 'xxx' mask_dir = 'xxx' save_dir ='xxx' src = cv2.imread(rental_dir) mask = cv2.imread(wm_dir, cv2.IMREAD_GRAYSCALE) dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_TELEA) cv2.imwrite(save_dir, dst)
2. 基於像素的反色中和(處理質量較高)
參考自ps去水印原理,通過一張白底的反色水印圖來中和原圖水印
需要到水印的圖,和該圖一樣大小的白底棕色(128,128,128)的水印且位置相同的水印圖,128的效果比較好
test_dir = 'xxx' mask_dir = 'xxx' save_dir ='xxx' src = cv2.imread(test_dir) mask = cv2.imread(mask_dir) save = numpy.zeros(src.shape, numpy.uint8) for row in range(src.shape[0]): for col in range(src.shape[1]): for channel in range(src.shape[2]): if mask[row, col, channel] == 0: val = 0 else: reverse_val = 255 - src[row, col, channel] val = 255 - reverse_val * 256 / mask[row, col, channel] if val < 0: val = 0 save[row, col, channel] = val cv2.imwrite(save_dir, save)
第二種方面明顯比第一種要好,但是水印的邊角處理不好,可以先用二在用一,效果會更好
參考自https://my.oschina.net/u/2400083/blog/732321