Python去除圖片水印實現(xiàn)方法詳解
最近寫文章遇到圖片有水印,如何去除水印呢?
網(wǎng)上找了各種辦法,也跑到小紅書、抖音等平臺找有沒有不收費就去水印的網(wǎng)站,但是基本上都是需要VIP會員才可以。
話又說回來這種事情怎么能難倒一個程序員呢?Python的庫有這么多肯定有一款適合我吧?
于是找來了OpenCV。
OpenCV介紹
文檔鏈接:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
Opencv(Open Source Computer Vision Library)是一個基于開源發(fā)行的跨平臺計算機視覺庫,它實現(xiàn)了圖像處理和計算機視覺方面的很多通用算法,已成為計算機視覺領(lǐng)域最有力的研究工具。
在這里我們要區(qū)分兩個概念:
- 圖像處理和計算機視覺的區(qū)別:圖像處理側(cè)重于“處理”圖像–如增強,還原,去噪,分割等等;
- 而計算機視覺重點在于使用計算機來模擬人的視覺,因此模擬才是計算機視覺領(lǐng)域的最終目標(biāo)。
OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS, 如今也提供對于C#、Ch、Ruby,GO的支持
OpenCV應(yīng)用領(lǐng)域有:人機互動、物體識別、 圖像分割、人臉識別、動作識別、運動跟蹤、機器人、運動分析、機器視覺、結(jié)構(gòu)分析、汽車安全駕駛等。
安裝:
安裝numpy:pip install numpy
安裝opencv-python:pip install opencv-python
安裝opencv-contrib-python**:pip install opencv-contrib-python
如果安裝過程中有誤,可以去下載安裝whl:http://www.lfd.uci.edu/~gohlke/pythonlibs/,找到對應(yīng)的版本下載。
在命令行安裝成功后,進入開發(fā)環(huán)境導(dǎo)入cv2,如果未報錯,就證明opencv安裝成功。
去水印
圖片展示
記得學(xué)過PS中有蒙版,可以使用蒙版遮罩完成。
代碼:
python # 方式一 import cv2 # 黑底白字 src = cv2.imread("images/a1.png") # 默認(rèn)的彩色圖(IMREAD_COLOR)方式讀入原始圖像 # black.jpg mask = cv2.imread('images/a2.png', cv2.IMREAD_GRAYSCALE) # 灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像 # 參數(shù):目標(biāo)修復(fù)圖像; 蒙版圖(定位修復(fù)區(qū)域); 選取鄰域半徑; 修復(fù)算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果較好) dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_NS) cv2.imwrite('result.jpg', dst)
但是這種方法使用的時候要求兩張圖片的大小必須是一樣的,否則會一直報錯
Traceback (most recent call last): File "/Users/running/PycharmProjects/untitled8/test1.py", line 16, in <module> get_water() File "/Users/running/PycharmProjects/untitled8/test1.py", line 11, in get_water dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_NS) cv2.error: OpenCV(4.1.2) /Users/travis/build/skvark/opencv-python/opencv/modules/photo/src/inpaint.cpp:748: error: (-209:Sizes of input arguments do not match) All the input and output images must have the same size in function 'icvInpaint'
可以分別打印一下尺寸看看,發(fā)現(xiàn)確實不一樣
import cv2 from PIL import Image # 黑底白字 src = cv2.imread("images/a1.png") # 默認(rèn)的彩色圖(IMREAD_COLOR)方式讀入原始圖像 # black.jpg mask = cv2.imread('images/a2.png', cv2.IMREAD_GRAYSCALE) # 灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像 # 參數(shù):目標(biāo)修復(fù)圖像; 蒙版圖(定位修復(fù)區(qū)域); 選取鄰域半徑; 修復(fù)算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果較好) print(src.shape, mask.shape) dst = cv2.inpaint(src, mask, 3, cv2.INPAINT_NS) cv2.imwrite('result1.jpg', dst)
(1454, 2182, 3) (1456, 2184)
于是要設(shè)置成一樣的大小
import cv2 from PIL import Image src = cv2.imread("images/a1.png") # 默認(rèn)的彩色圖(IMREAD_COLOR)方式讀入原始圖像 # black.jpg mask = cv2.imread('images/a2.png', cv2.IMREAD_GRAYSCALE) # 灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像 # 參數(shù):目標(biāo)修復(fù)圖像; 蒙版圖(定位修復(fù)區(qū)域); 選取鄰域半徑; 修復(fù)算法(包括INPAINT_TELEA/INPAINT_NS, 前者算法效果較好) out2 = cv2.resize(mask,(2182,1454)) out1 = cv2.resize(src,(2182,1454)) print(out1.shape, out2.shape) dst = cv2.inpaint(out1, out2, 3, cv2.INPAINT_NS) # cv2.imwrite('result.jpg', dst)
結(jié)果:
這種方式似乎還是可以看到一些水印,我們可以采用下面一種方法。
圖片去水印原理
1、標(biāo)定噪聲的特征,使用cv2.inRange二值化標(biāo)識噪聲對圖片進行二值化處理,具體代碼:cv2.inRange(img, np.array([200, 200, 240]), np.array([255, 255, 255])),把[200, 200, 200]~[255, 255, 255]以外的顏色處理為0;
2、使用OpenCV的dilate方法,擴展特征的區(qū)域,優(yōu)化圖片處理效果;
3、使用inpaint方法,把噪聲的mask作為參數(shù),推理并修復(fù)圖片。
實現(xiàn)思路
1、從原圖片,截取右下角部分,另存為新圖片;
2、識別水印,顏色值為:[200, 200, 200]~[255, 255, 255]
3、去掉水印,還原圖片;
4、把原圖片、去掉水印的新圖片,進行重疊合并;
代碼
import cv2 import numpy as np from PIL import Image import os dir = os.getcwd() path = "a1.jpg" newPath = "new.jpg" img = cv2.imread(path, 1) hight, width, depth = img.shape[0:3] # 截取 cropped = img[int(hight * 0.8):hight, int(width * 0.7):width] # 裁剪坐標(biāo)為[y0:y1, x0:x1] cv2.imwrite(newPath, cropped) imgSY = cv2.imread(newPath, 1) # 圖片二值化處理,把[200,200,200]-[250,250,250]以外的顏色變成0 thresh = cv2.inRange(imgSY, np.array([200, 200, 200]), np.array([250, 250, 250])) # 創(chuàng)建形狀和尺寸的結(jié)構(gòu)元素 kernel = np.ones((3, 3), np.uint8) # 擴展待修復(fù)區(qū)域 hi_mask = cv2.dilate(thresh, kernel, iterations=10) specular = cv2.inpaint(imgSY, hi_mask, 5, flags=cv2.INPAINT_TELEA) cv2.imwrite(newPath, specular) # 覆蓋圖片 imgSY = Image.open(newPath) img = Image.open(path) img.paste(imgSY, (int(width * 0.7), int(hight * 0.8), width, hight)) img.save(newPath)
輸出結(jié)果:
到此這篇關(guān)于Python去除圖片水印實現(xiàn)方法詳解的文章就介紹到這了,更多相關(guān)Python去除圖片水印內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python利用wx實現(xiàn)界面按鈕和按鈕監(jiān)聽和字體改變的方法
今天小編就為大家分享一篇python利用wx實現(xiàn)界面按鈕和按鈕監(jiān)聽和字體改變的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2019-07-07Python數(shù)據(jù)分析之真實IP請求Pandas詳解
這篇文章主要給大家介紹了Python數(shù)據(jù)分析之真實IP請求Pandas,文中通過示例嗲嗎給大家介紹的很詳細(xì),相信對大家的學(xué)習(xí)或者理解具有一定的參考借鑒價值,有需要的朋友們可以參考借鑒,下面來一起學(xué)習(xí)學(xué)習(xí)吧。2016-11-11python+selenium小米商城紅米K40手機自動搶購的示例代碼
這篇文章主要介紹了python+selenium小米商城紅米K40手機自動搶購的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python裝飾器實現(xiàn)方法及應(yīng)用場景詳解
這篇文章主要介紹了Python裝飾器實現(xiàn)方法及應(yīng)用場景詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-03-03對python實現(xiàn)二維函數(shù)高次擬合的示例詳解
今天小編就為大家分享一篇對python實現(xiàn)二維函數(shù)高次擬合的示例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-12-12Python列表list操作相關(guān)知識小結(jié)
今天,本喵帶大家仔細(xì)溫習(xí)一下Python的列表,溫故而知新,不亦說乎,需要的朋友可以參考下2020-01-01