運(yùn)用python去除圖片水印
由于圖片水印的種類有很多,今天我們先講最簡單的一種。
即上圖中的①類水印,這種水印存在白色背景上的文檔里,水印是灰色,需要保留的文字是黑色。
這種通??梢赃M(jìn)行簡單的亮度/對比度轉(zhuǎn)換,直到水印消失并降低亮度以進(jìn)行補(bǔ)償[1]。參考別人的方法,我發(fā)現(xiàn)可以用多種方法去除水印。大致原理比較相似,下面先講OpenCV的方法。
OpenCV + Numpy
本方法需要使用的庫:cv2、numpy。cv2是基于OpenCV的圖像處理庫,可以對圖像進(jìn)行腐蝕,膨脹等操作;Numpy這是一個強(qiáng)大的處理矩陣和維度運(yùn)算的庫。
函數(shù)簡介
介紹一下cv2的三個基本函數(shù):使用
img = cv2.imread('test.png') cv2.imshow('test.png',img) cv2.waitKey(0) cv2.imwrite('test_2.png', img)
對于Numpy呢,則要用到np.clip()
,它是一個截取函數(shù),用于截取數(shù)組中小于或者大于某值的部分,并使得被截取部分等于固定值。
np.clip(a, a_min, a_max, out=None):
具體用法:
可以看到,數(shù)組x中的所有數(shù)限定到范圍0和5之間。為啥要介紹這些函數(shù)呢,接著往下看。
色彩轉(zhuǎn)換
回到本文一開始,我們想去除文檔圖片中的水印。
上圖中我選取了三個點(diǎn),這三個像素點(diǎn)分別對應(yīng)背景白色、黑色字體以及灰色的水印。
我們現(xiàn)在要做的事,就是想辦法把水印轉(zhuǎn)換成白色背景。換言之,就是把圖片中[217,217,217]的像素點(diǎn)轉(zhuǎn)換成[255,255,255]。
當(dāng)然這個[217,217,217]也不是固定的,只是一個范圍。為了方便調(diào)整,我選取了一些像素點(diǎn),做了一個線性回歸。
希望把圖片整體的像素顏色做一個改變,原有黑色字體盡量跟原來一致,而水印部分則一定要≥255,然后就可以通過np.clip()
限定區(qū)間,使之都變成[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)
下面我們看看調(diào)整后的效果(左側(cè)是轉(zhuǎn)換前,右側(cè)是轉(zhuǎn)換后)。
左:轉(zhuǎn)換前 右:轉(zhuǎn)換后
處理效果還是不錯的,說明對于這類文檔圖片水印,通過幾行Python代碼就可以輕松去除水印。
不過通過線性回歸改變整體圖片顏色,也會影響原有的黑色文本,導(dǎo)致其顏色發(fā)生了微微變化。
那我們能不能簡單粗暴一點(diǎn)!只改變水印的顏色呢?
也可以試試。
PIL + itertools
PIL也是一個Python 圖像處理庫,其中Image模塊是在Python PIL圖像處理中常見的模塊,對圖像進(jìn)行基礎(chǔ)操作的功能基本都包含于此模塊內(nèi)。
itertools
之前更是被我們稱為一個零差評的Python內(nèi)置庫。其中itertools.product
用來產(chǎn)生多個列表和迭代器的(積)。
還是跟之前一個原理,我們希望將圖片中[217,217,217]的像素點(diǎn)轉(zhuǎn)換成[255,255,255]。
那就簡單粗暴一點(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é)果,對比一下。
左:轉(zhuǎn)換前 右:轉(zhuǎn)換后
與第一種方法對比,肉眼也沒看出來太明顯差別。
那大家就喜歡那種方法就用哪個吧!
到此這篇關(guān)于運(yùn)用python去除圖片水印的文章就介紹到這了,更多相關(guān)python去除圖片水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python使用unittest進(jìn)行有效測試的示例詳解
這篇文章主要介紹了如何使用?unittest?來編寫和運(yùn)行單元測試,希望通過閱讀本文,大家能了解?unittest?的基本使用方法,以及如何使用?unittest?中的斷言方法和測試用例組織結(jié)構(gòu)2023-06-06python獲取響應(yīng)某個字段值的3種實現(xiàn)方法
這篇文章主要介紹了python獲取響應(yīng)某個字段值的3種實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹
這篇文章主要介紹了django admin管理工具自定義時間區(qū)間篩選器DateRangeFilter介紹,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05Python使用dis模塊把Python反編譯為字節(jié)碼的用法詳解
通常來說Python的性能或代碼質(zhì)量的評估可以通過dis模塊獲取到對應(yīng)的字節(jié)碼指令來進(jìn)行評估,因而這里我們就來看一下Python使用dis模塊把Python反編譯為字節(jié)碼的用法詳解:2016-06-06利用pycharm調(diào)試ssh遠(yuǎn)程程序并實時同步文件的操作方法
這篇文章主要介紹了利用pycharm調(diào)試ssh遠(yuǎn)程程序并實時同步文件的操作方法,本篇文章提供了利用pycharm遠(yuǎn)程調(diào)試程序的方法,且使用的編譯器可以是服務(wù)器中的虛擬環(huán)境的編譯器,可以實時同步本地與服務(wù)器的文件內(nèi)容,需要的朋友可以參考下2022-11-11使用 Python 創(chuàng)建一個基于規(guī)則的聊天機(jī)器人
這篇文章主要介紹了使用 Python 創(chuàng)建一個基于規(guī)則的聊天機(jī)器人,使用 Python 創(chuàng)建一個簡單的基于規(guī)則的聊天機(jī)器人 聊天機(jī)器人本身是一種機(jī)器或軟件,它通過文本或句子模仿人類交互。 簡而言之,可以使用類似于與人類對話的軟件進(jìn)行聊天。2021-10-10