關(guān)于去除圖片上的水印
現(xiàn)在有很多去除水印的工具,但基本上都需要你花錢。作為資深白嫖黨,想讓我花錢,那是不可能的。
于是我做了下research(search, search, research…),我發(fā)現(xiàn)現(xiàn)在的“去水印”基本上都是一個(gè)思路:利用圖像修復(fù)算法。把有水印的地方看作是圖像損壞的地方,用相鄰像素替換那些損壞的地方。
現(xiàn)在看看有什么開源工具可以用來去除圖片上的水印。
1. openCV 圖像修復(fù)
openCV中就有圖像修復(fù)的方法,提供了兩種算法分別基于_2004 年由 Alexandru Telea 撰寫的“基于快速行進(jìn)方法的圖像修復(fù)技術(shù)”_ 和 Bertalmio,Marcelo,Andrea L. Bertozzi 和 Guillermo Sapiro 在 2001 年的論文“Navier-Stokes,流體動(dòng)力學(xué)和圖像和視頻修補(bǔ)” 實(shí)現(xiàn)。調(diào)用cv.inpaint方法時(shí),前者用cv.INPAINT_TELEA標(biāo)記后者用cv.INPAINT_NS,openCV修復(fù)圖像的方法使用起來很簡單,只需要幾行代碼:
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是需要修復(fù)的圖片,而mask2.png是掩模圖片,這張圖片的作用是指定圖片損壞的位置,該圖片只有黑白兩色,白色就是損壞的地方。掩模圖片和原圖的大小(即寬高)必須完全一致,否則會(huì)報(bào)錯(cuò)。

第一張圖像是原圖。第二個(gè)圖像是mask(掩模)。第三個(gè)圖像是第一個(gè)算法的結(jié)果,最后一個(gè)圖像是第二個(gè)算法的結(jié)果。
對于輕微損壞,或者說只有很少一兩個(gè)水印的圖片,這種方法還是可以的。可是,對于滿屏水印的圖片怎么辦呢?
像這樣的:

2. mask圖像怎么創(chuàng)建
用openCV去除上面這樣圖片的水印,首先要面臨的問題是mask圖片怎么辦?
new Bing是這樣回答的:
創(chuàng)建掩模圖像是圖像修復(fù)過程中的一個(gè)重要步驟。掩模圖像用于指示原始圖像中需要修復(fù)的區(qū)域。以下是創(chuàng)建掩模圖像的基本步驟:
_1. 打開圖像編輯軟件:你可以使用任何圖像編輯軟件,如Photoshop、GIMP或者Paint.NET。
2. 導(dǎo)入原始圖像:將需要修復(fù)的原始圖像導(dǎo)入到圖像編輯軟件中。
3. 創(chuàng)建新圖層:在原始圖像上創(chuàng)建一個(gè)新的圖層,用于繪制掩模。
4. 選擇畫筆工具:使用畫筆工具,在新圖層上繪制需要修復(fù)的區(qū)域。通常,我們使用白色來標(biāo)記這些區(qū)域。
5. 填充損壞區(qū)域:確保所有需要修復(fù)的區(qū)域都被白色完全覆蓋。如果區(qū)域很小,可以使用放大工具來幫助精確>繪制。
6. 保存掩模圖像:完成繪制后,只保存包含掩模的圖層(通常為白色損壞區(qū)域和黑色背景)為一個(gè)新的圖像文>件,格式可以是PNG或BMP,以保留二值信息。在OpenCV中使用掩模圖像時(shí),掩模應(yīng)該是一個(gè)二值圖像,其中白色代表需要修復(fù)的區(qū)域,黑色代表不需要修復(fù)的區(qū)域。如果你有任何疑問或需要進(jìn)一步的幫助,請告訴我!
學(xué)會(huì)了吧?然后,讓我展示一下真正的技術(shù):

吶,這就是我根據(jù)上面的圖片創(chuàng)建的掩模圖像。
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")
看一下效果吧:

這效果,真是一言難盡,你說它沒去吧,它的確沒有水印了;你說它去了吧,這還不如不去…
什么原因呢?難道是因?yàn)槲彝盔f涂得不好?需要更精確?我想過一個(gè)雞賊的辦法:往這網(wǎng)站上傳一個(gè)純黑的圖片,它加了水印我直接下載下來當(dāng)mask,但這有點(diǎn)冒險(xiǎn)…
于是,讓我再展示一下真正的技術(shù):

我把水印提取出來做mask這下夠精確了吧。
再看效果:

這玩意,不能說跟原圖一模一樣,那也的確是沒啥差別。我覺得這不是mask文件的問題,mask文件太精確不是好事,應(yīng)該還是修復(fù)算法的問題。
3.機(jī)器學(xué)習(xí)修復(fù)算法
既然是算法不行,那,有沒有更好的修復(fù)算法呢?有,就是使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來提取圖像的特征,如邊緣、紋理、顏色等信息然后修復(fù)。現(xiàn)成的也有:
https://github.com/braindotai/Watermark-Removal-Pytorch 這個(gè)是使用Pytorch來訓(xùn)練;
https://github.com/zuruoke/watermark-removal 這個(gè)用的是tensorflow。
遺憾的是:這兩個(gè),無論用哪一個(gè),你都逃不掉創(chuàng)建mask。為什么不能通過機(jī)器學(xué)習(xí)自己識別水印創(chuàng)建mask呢?Watermark-Removal-Pytorch項(xiàng)目的README中也給出了解釋:

總的來說: 做水印識別代價(jià)太大,而且效果不好。
當(dāng)我想試試這兩個(gè)項(xiàng)目的時(shí)候,又發(fā)現(xiàn)了另外一個(gè)項(xiàng)目:iopaint!這個(gè)有web界面可以直接在本地跑起來,而且可以下載訓(xùn)練好的模型直接用!于是我裝起來試了一下:

直接涂在水印上就可以去除水印,可以涂一個(gè)去一個(gè),也可以全部涂好一起去,一起去除要花得時(shí)間長一些。
去除的結(jié)果是這樣的:

這個(gè)效果在我看來已經(jīng)是非常不錯(cuò)了。還有一個(gè)讓人驚喜的地方是,它還可以下載mask文件!

有了mask文件你就可以批量去除水印了,當(dāng)然了,你所有圖片水印的位置要都一樣。我試了一下,某房產(chǎn)網(wǎng)站的圖片水印的位置也都是一樣的。如果它不升級更新,你可以用一個(gè)mask文件去除水印
iopaint run --model=lama --device=cpu \
--image=/path/to/image_folder \
--mask=/path/to/mask_folder \
--output=output_dir
這個(gè)命令的解釋:
–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真的是個(gè)不錯(cuò)的項(xiàng)目,可是要用起來,你多少要有點(diǎn)編程知識。不過,iopaint有個(gè)機(jī)智的地方是:它有windows的一鍵安裝包,但是,你得花錢買。哈哈哈。
聲明:文中的水印圖片來自互聯(lián)網(wǎng),我僅拿來做學(xué)習(xí)交流的。如果侵權(quán)了,可以聯(lián)系我,我先給您磕一個(gè),然后馬上刪掉。
參考:
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
-------------------------------
著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系作者獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處。
原文: https://wangxuan.me/tech/2024/06/04/watermark-removal.html
浙公網(wǎng)安備 33010602011771號