利用Python去除圖片水印,真的一點(diǎn)都不難!
大家好,我是菜鳥(niǎo)哥!
有粉絲問(wèn),既然Python這么牛逼,可不可使用Python去除圖片水印的方法呢?
這個(gè)肯定有啊,不過(guò)由于圖片水印的種類有很多,今天我們先講最簡(jiǎn)單的一種。

即上圖中的①類水印,這種水印存在白色背景上的文檔里,水印是灰色,需要保留的文字是黑色。
這種通常可以進(jìn)行簡(jiǎn)單的亮度/對(duì)比度轉(zhuǎn)換,直到水印消失并降低亮度以進(jìn)行補(bǔ)償[1]。參考別人的方法,我發(fā)現(xiàn)可以用多種方法去除水印。大致原理比較相似,下面先講OpenCV的方法。
OpenCV + Numpy
本方法需要使用的庫(kù):cv2、numpy。cv2是基于OpenCV的圖像處理庫(kù),可以對(duì)圖像進(jìn)行腐蝕,膨脹等操作;Numpy這是一個(gè)強(qiáng)大的處理矩陣和維度運(yùn)算的庫(kù)。
函數(shù)簡(jiǎn)介
介紹一下cv2的三個(gè)基本函數(shù):使用cv2.imread(),cv2.imshow(),cv2.imwrite()分別可以讀取、顯示和保存圖像。
img?=?cv2.imread('test.png')
cv2.imshow('test.png',img)
cv2.waitKey(0)
cv2.imwrite('test_2.png',?img)
對(duì)于Numpy呢,則要用到np.clip(),它是一個(gè)截取函數(shù),用于截取數(shù)組中小于或者大于某值的部分,并使得被截取部分等于固定值。
np.clip(a,?a_min,?a_max,?out=None):
具體用法:

可以看到,數(shù)組x中的所有數(shù)限定到范圍0和5之間。為啥要介紹這些函數(shù)呢,接著往下看。
色彩轉(zhuǎn)換
回到本文一開(kāi)始,我們想去除文檔圖片中的水印。

上圖中我選取了三個(gè)點(diǎn),這三個(gè)像素點(diǎn)分別對(duì)應(yīng)背景白色、黑色字體以及灰色的水印。
我們現(xiàn)在要做的事,就是想辦法把水印轉(zhuǎn)換成白色背景。換言之,就是把圖片中[217,217,217]的像素點(diǎn)轉(zhuǎn)換成[255,255,255]。
當(dāng)然這個(gè)[217,217,217]也不是固定的,只是一個(gè)范圍。為了方便調(diào)整,我選取了一些像素點(diǎn),做了一個(gè)線性回歸。
希望把圖片整體的像素顏色做一個(gè)改變,原有黑色字體盡量跟原來(lái)一致,而水印部分則一定要≥255,然后就可以通過(guò)np.clip()限定區(qū)間,使之都變成[255,255,255]。

說(shuō)干就干
import?cv2
import?numpy?as?np
img?=?cv2.imread('test.png')
new?=?np.clip(1.4057577998008846*img-38.33089999653017,?0,?255).astype(np.uint8)
cv2.imwrite('removed.png',?new)
下面我們看看調(diào)整后的效果(左側(cè)是轉(zhuǎn)換前,右側(cè)是轉(zhuǎn)換后)。

處理效果還是不錯(cuò)的,說(shuō)明對(duì)于這類文檔圖片水印,通過(guò)幾行Python代碼就可以輕松去除水印。
不過(guò)通過(guò)線性回歸改變整體圖片顏色,也會(huì)影響原有的黑色文本,導(dǎo)致其顏色發(fā)生了微微變化。
那我們能不能簡(jiǎn)單粗暴一點(diǎn)!只改變水印的顏色呢?
也可以試試。
PIL ?+ itertools
PIL也是一個(gè)Python 圖像處理庫(kù),其中Image模塊是在Python PIL圖像處理中常見(jiàn)的模塊,對(duì)圖像進(jìn)行基礎(chǔ)操作的功能基本都包含于此模塊內(nèi)。
itertools之前更是被我們稱為一個(gè) 零差評(píng)的 Python 內(nèi)置庫(kù)。其中itertools.product用來(lái)產(chǎn)生多個(gè)列表和迭代器的(積)。
還是跟之前一個(gè)原理,我們希望將圖片中[217,217,217]的像素點(diǎn)轉(zhuǎn)換成[255,255,255]。
那就簡(jiǎn)單粗暴一點(diǎn),也就是像素值相加大概600(217+217+217)以上的像素點(diǎn),都改成[255,255,255]就好了。
from?itertools?import?product
from?PIL?import?Image
img?=?Image.open('test.png')
width,?height?=?img.size
for?pos?in?product(range(width),?range(height)):
????if?sum(img.getpixel(pos)[:3])?>?600:
????????img.putpixel(pos,?(255,255,255))
img.save('removed_1.png')
運(yùn)行結(jié)果,對(duì)比一下。

與第一種方法對(duì)比,肉眼也沒(méi)看出來(lái)太明顯差別。
那大家就喜歡那種方法就用哪個(gè)吧!
參考資料
How to remove watermark background in image Python:https://stackoverflow.com/questions/50792812/how-to-remove-watermark-background-in-image-python?answertab=oldest#tab-top
我們的文章到此就結(jié)束啦,如果你對(duì)去水印有興趣,可以動(dòng)手實(shí)戰(zhàn)一下,代碼敲一下,會(huì)有更深刻的體驗(yàn)。喜歡今天的Python 實(shí)戰(zhàn)教程,請(qǐng)持續(xù)關(guān)注菜鳥(niǎo)學(xué)Python。
推薦閱讀:
入門:?最全的零基礎(chǔ)學(xué)Python的問(wèn)題? |?零基礎(chǔ)學(xué)了8個(gè)月的Python??|?實(shí)戰(zhàn)項(xiàng)目?|學(xué)Python就是這條捷徑
量化:?定投基金到底能賺多少錢?? |?我用Python對(duì)去年800只基金的數(shù)據(jù)分析??
干貨:爬取豆瓣短評(píng),電影《后來(lái)的我們》?|?38年NBA最佳球員分析?|? ?從萬(wàn)眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個(gè)海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!
AI:?會(huì)做詩(shī)的機(jī)器人?|?給圖片上色?|?預(yù)測(cè)收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個(gè)迷你推薦系統(tǒng)電影
小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水??!?|?一鍵把html網(wǎng)頁(yè)保存為pdf!|??再見(jiàn)PDF提取收費(fèi)!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r(jià)機(jī)票提示器!?|60行代碼做了一個(gè)語(yǔ)音壁紙切換器天天看小姐姐!|
年度爆款文案
2).學(xué)Python真香!我用100行代碼做了個(gè)網(wǎng)站,幫人PS旅行圖片,賺個(gè)雞腿吃
3).首播過(guò)億,火爆全網(wǎng),我分析了《乘風(fēng)破浪的姐姐》,發(fā)現(xiàn)了這些秘密?
9).發(fā)現(xiàn)一個(gè)舔狗福利!這個(gè)Python爬蟲(chóng)神器太爽了,自動(dòng)下載妹子圖片
點(diǎn)閱讀原文,看Python全套!


