溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印

發(fā)布時間:2021-09-26 15:48:55 來源:億速云 閱讀:205 作者:小新 欄目:開發(fā)技術(shù)

這篇文章主要介紹了Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

OpenCV + Numpy

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

函數(shù)簡介

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

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

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

具體用法:

Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印

可以看到,數(shù)組x中的所有數(shù)限定到范圍0和5之間。為啥要介紹這些函數(shù)呢,接著往下看。

色彩轉(zhuǎn)換

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

Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印

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

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

當然這個[217,217,217]也不是固定的,只是一個范圍。為了方便調(diào)整,我選取了一些像素點,做了一個線性回歸。

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

Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印

說干就干

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)換后)。

Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印

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

不過通過線性回歸改變整體圖片顏色,也會影響原有的黑色文本,導(dǎo)致其顏色發(fā)生了微微變化。

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

也可以試試。

PIL + itertools

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

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

還是跟之前一個原理,我們希望將圖片中[217,217,217]的像素點轉(zhuǎn)換成[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')

運行結(jié)果,對比一下。

Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印

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

感謝你能夠認真閱讀完這篇文章,希望小編分享的“Python編程OpenCV和Numpy圖像處理庫如何實現(xiàn)圖片去水印”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關(guān)注億速云行業(yè)資訊頻道,更多相關(guān)知識等著你來學習!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI