利用 Python 去除圖片水印

大家好,我是小五🧐

前一陣給大家分享了,如何給圖片加水印。評論區就有小夥伴問,可不可使用 Python 去除圖片水印的方法呢?

這個肯定有啊,不過由於圖片水印的種類有很多,今天我們先講最簡單的一種。

即上圖中的①類水印,這種水印存在白色背景上的文檔裏,水印是灰色,需要保留的文字是黑色。

這種通常可以進行簡單的亮度 / 對比度轉換,直到水印消失並降低亮度以進行補償 [1]。參考別人的方法,我發現可以用多種方法去除水印。大致原理比較相似,下面先講 OpenCV 的方法。

OpenCV + Numpy

本方法需要使用的庫:cv2、numpy。cv2 是基於 OpenCV 的圖像處理庫,可以對圖像進行腐蝕,膨脹等操作;Numpy 這是一個強大的處理矩陣和維度運算的庫。

函數簡介

介紹一下 cv2 的三個基本函數:使用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)

對於 Numpy 呢,則要用到np.clip(),它是一個截取函數,用於截取數組中小於或者大於某值的部分,並使得被截取部分等於固定值。

np.clip(a, a_min, a_max, out=None):

具體用法:

可以看到,數組 x 中的所有數限定到範圍 0 和 5 之間。爲啥要介紹這些函數呢,接着往下看。

色彩轉換

回到本文一開始,我們想去除文檔圖片中的水印。

上圖中我選取了三個點,這三個像素點分別對應背景白色、黑色字體以及灰色的水印。

我們現在要做的事,就是想辦法把水印轉換成白色背景。換言之,就是把圖片中 [217,217,217] 的像素點轉換成[255,255,255]。

當然這個 [217,217,217] 也不是固定的,只是一個範圍。爲了方便調整,我選取了一些像素點,做了一個線性迴歸。

希望把圖片整體的像素顏色做一個改變,原有黑色字體儘量跟原來一致,而水印部分則一定要≥255,然後就可以通過np.clip()限定區間,使之都變成 [255,255,255]。

說幹就幹

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)

下面我們看看調整後的效果(左側是轉換前,右側是轉換後)。

左:轉換前 右:轉換後

處理效果還是不錯的,說明對於這類文檔圖片水印,通過幾行 Python 代碼就可以輕鬆去除水印。

不過通過線性迴歸改變整體圖片顏色,也會影響原有的黑色文本,導致其顏色發生了微微變化。

那我們能不能簡單粗暴一點!只改變水印的顏色呢?

也可以試試。

PIL  + itertools

PIL 也是一個 Python 圖像處理庫,其中 Image 模塊是在 Python PIL 圖像處理中常見的模塊,對圖像進行基礎操作的功能基本都包含於此模塊內。

itertools 之前更是被我們稱爲一個 零差評的 Python 內置庫。其中itertools.product用來產生多個列表和迭代器的 (積)。

還是跟之前一個原理,我們希望將圖片中 [217,217,217] 的像素點轉換成[255,255,255]。

那就簡單粗暴一點,也就是像素值相加大概 600(217+217+217)以上的像素點,都改成 [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')

運行結果,對比一下。

左:轉換前 右:轉換後

與第一種方法對比,肉眼也沒看出來太明顯差別。

那大家就喜歡那種方法就用哪個吧!

參考資料

[1]

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

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/TXvfdQmiX4Lh08aZlDVbTg