關於去除圖片上的水印

王君敕發表於2024-06-05

現在有很多去除水印的工具,但基本上都需要你花錢。作為資深白嫖黨,想讓我花錢,那是不可能的。

於是我做了下research(search, search, research…),我發現現在的“去水印”基本上都是一個思路:利用影像修復演算法。把有水印的地方看作是影像損壞的地方,用相鄰畫素替換那些損壞的地方。

現在看看有什麼開源工具可以用來去除圖片上的水印。

1. openCV 影像修復

openCV中就有影像修復的方法,提供了兩種演算法分別基於_2004 年由 Alexandru Telea 撰寫的“基於快速行進方法的影像修復技術”_ 和 Bertalmio,Marcelo,Andrea L. Bertozzi 和 Guillermo Sapiro 在 2001 年的論文“Navier-Stokes,流體動力學和影像和影片修補” 實現。呼叫cv.inpaint方法時,前者用cv.INPAINT_TELEA標記後者用cv.INPAINT_NS,openCV修復影像的方法使用起來很簡單,只需要幾行程式碼:

import numpy as np
import cv2 as cv

img = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png',0)
dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)
# dst = cv.inpaint(img,mask,3,cv.INPAINT_NS)
cv.imshow('dst',dst)
cv.waitKey(0)
cv.destroyAllWindows()

上面messi_2.jpg是需要修復的圖片,而mask2.png是掩模圖片,這張圖片的作用是指定圖片損壞的位置,該圖片只有黑白兩色,白色就是損壞的地方。掩模圖片和原圖的大小(即寬高)必須完全一致,否則會報錯。

第一張影像是原圖。第二個影像是mask(掩模)。第三個影像是第一個演算法的結果,最後一個影像是第二個演算法的結果。

對於輕微損壞,或者說只有很少一兩個水印的圖片,這種方法還是可以的。可是,對於滿屏水印的圖片怎麼辦呢?

像這樣的:

2. mask影像怎麼建立

用openCV去除上面這樣圖片的水印,首先要面臨的問題是mask圖片怎麼辦?

new Bing是這樣回答的:

建立掩模影像是影像修復過程中的一個重要步驟。掩模影像用於指示原始影像中需要修復的區域。以下是建立掩模影像的基本步驟:

_1. 開啟影像編輯軟體:你可以使用任何影像編輯軟體,如Photoshop、GIMP或者Paint.NET。

2. 匯入原始影像:將需要修復的原始影像匯入到影像編輯軟體中。

3. 建立新圖層:在原始影像上建立一個新的圖層,用於繪製掩模。

4. 選擇畫筆工具:使用畫筆工具,在新圖層上繪製需要修復的區域。通常,我們使用白色來標記這些區域。

5. 填充損壞區域:確保所有需要修復的區域都被白色完全覆蓋。如果區域很小,可以使用放大工具來幫助精確>繪製。

6. 儲存掩模影像:完成繪製後,只儲存包含掩模的圖層(通常為白色損壞區域和黑色背景)為一個新的影像文>件,格式可以是PNG或BMP,以保留二值資訊。在OpenCV中使用掩模影像時,掩模應該是一個二值影像,其中白色代表需要修復的區域,黑色代表不需要修復的區域。如果你有任何疑問或需要進一步的幫助,請告訴我!

學會了吧?然後,讓我展示一下真正的技術:

吶,這就是我根據上面的圖片建立的掩模影像。

import cv2

def remove_watermark(image_path, watermark_path, output_path):
    # 讀取原始影像和水印影像
    original_image = cv2.imread(image_path)
    watermark = cv2.imread(watermark_path, cv2.IMREAD_GRAYSCALE)
    # 去除水印
    watermark_removed = cv2.inpaint(original_image, watermark, 3, cv2.INPAINT_NS)
    # 儲存去除水印後的影像
    cv2.imwrite(output_path, watermark_removed)
# 使用示例
remove_watermark("original_image.jpg", "mask.png", "output_image.jpg")

看一下效果吧:

這效果,真是一言難盡,你說它沒去吧,它的確沒有水印了;你說它去了吧,這還不如不去…

什麼原因呢?難道是因為我塗鴉塗得不好?需要更精確?我想過一個雞賊的辦法:往這網站上傳一個純黑的圖片,它加了水印我直接下載下來當mask,但這有點冒險…

於是,讓我再展示一下真正的技術:

我把水印提取出來做mask這下夠精確了吧。

再看效果:

這玩意,不能說跟原圖一模一樣,那也的確是沒啥差別。我覺得這不是mask檔案的問題,mask檔案太精確不是好事,應該還是修復演算法的問題。

3.機器學習修復演算法

既然是演算法不行,那,有沒有更好的修復演算法呢?有,就是使用卷積神經網路(CNN)來提取影像的特徵,如邊緣、紋理、顏色等資訊然後修復。現成的也有:

https://github.com/braindotai/Watermark-Removal-Pytorch 這個是使用Pytorch來訓練;

https://github.com/zuruoke/watermark-removal 這個用的是tensorflow。

遺憾的是:這兩個,無論用哪一個,你都逃不掉建立mask。為什麼不能透過機器學習自己識別水印建立mask呢?Watermark-Removal-Pytorch專案的README中也給出瞭解釋:

總的來說: 做水印識別代價太大,而且效果不好。

當我想試試這兩個專案的時候,又發現了另外一個專案:iopaint!這個有web介面可以直接在本地跑起來,而且可以下載訓練好的模型直接用!於是我裝起來試了一下:

直接塗在水印上就可以去除水印,可以塗一個去一個,也可以全部塗好一起去,一起去除要花得時間長一些。

去除的結果是這樣的:

這個效果在我看來已經是非常不錯了。還有一個讓人驚喜的地方是,它還可以下載mask檔案!

有了mask檔案你就可以批次去除水印了,當然了,你所有圖片水印的位置要都一樣。我試了一下,某房產網站的圖片水印的位置也都是一樣的。如果它不升級更新,你可以用一個mask檔案去除水印

iopaint run --model=lama --device=cpu \
--image=/path/to/image_folder \
--mask=/path/to/mask_folder \
--output=output_dir

這個命令的解釋:

–image is the folder containing input images,–mask is the folder containing corresponding mask images. When –mask is a path to a mask file, all images will be processed using this mask.

iopaint真的是個不錯的專案,可是要用起來,你多少要有點程式設計知識。不過,iopaint有個機智的地方是:它有windows的一鍵安裝包,但是,你得花錢買。哈哈哈。

宣告:文中的水印圖片來自網際網路,我僅拿來做學習交流的。如果侵權了,可以聯絡我,我先給您磕一個,然後馬上刪掉。

參考:

https://apachecn.github.io/opencv-doc-zh/#/docs/4.0.0/9.2-tutorial_py_inpainting

https://github.com/zuruoke/watermark-removal

https://github.com/braindotai/Watermark-Removal-Pytorch

https://github.com/Sanster/IOPaint

https://www.iopaint.com/

-------------------------------

著作權歸作者所有。商業轉載請聯絡作者獲得授權,非商業轉載請註明出處。

原文: https://wangxuan.me/tech/2024/06/04/watermark-removal.html

相關文章