python 去除水印“人工”智能去除水印
這兩天公司來了一個新的需求——去除水印,對於我一個從未接觸過的這種事情的人來說,當時我是蒙的。不過首先我就去搜索了一下是否有該種合適的功能模塊,經過我的篩選,發現opencv應該是最有滿足我這個需求可能的模塊了。
我先把我的測試例子放上來。
測試圖片(你可能在別處看到過,沒錯就是你看到過的那個例子圖)
第一種方法:
該方法看着是不是很簡單?沒錯就這么幾行代碼,但是這種方式需要一個美工,讓他配合你做一張di.png
di.png
# 方式一 import cv2 def get_water(): # 黑底白字 src = cv2.imread('yuan.png') # 默認的彩色圖(IMREAD_COLOR)方式讀入原始圖像 # black.jpg mask = cv2.imread('di.png', cv2.IMREAD_GRAYSCALE) # 灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像 # 參數:目標修復圖像; 蒙版圖(定位修復區域); 選取鄰域半徑; 修復算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果較好) dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_NS) cv2.imwrite('result1.jpg', dst) get_water()
看完上面這么多廢話,其實你就想看看效果如何,那么來看一下該方式效果圖
是不是想說效果很差,其實在我所測試使用的方法中,這種方法已經算是效果不錯的了。別着急走,下面還有一種比這效果更好的方式
第二種方式:
還是以上一張圖片為例,這種方式還是需要美工配合,只是圖片變了,同時換了一種算法模式,但是注意該方法效率不高,使用該圖片時
跑一次代碼就行了,但是若是別的圖片,你可能需要跑幾遍代碼之后,才能出現最終效果(若你發現采用該方式去除水印,發現去除后的效果,
只是水印顏色變淡了,那么請你在對處理過的圖,再次執行該代碼,如此多次之后,請用肉眼識別最好的效果)
di2.png
# 方式二 import cv2 import numpy def get_water2(): src = cv2.imread('yuan.png') mask = cv2.imread('di2.png') 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('result2.jpg', save) get_water2()
不多說直接,上效果圖
這兩種方式,是相對來說效果很好的去除水印方式,也就是”人工”去除水印,但是該兩種方式並不能滿足我的要求,我需要大批量,高效率的去除水印,等我下一篇文章再來分享吧(容我在研究研究,哈哈)