最近寫文章遇到圖片有水印,如何去除水印呢?
網(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)了圖像處理和計算機視覺方面的很多通用算法,已成為計算機視覺領域最有力的研究工具。
在這里我們要區(qū)分兩個概念:
-
圖像處理和計算機視覺的區(qū)別:圖像處理側重于“處理”圖像–如增強,還原,去噪,分割等等;
-
而計算機視覺重點在于使用計算機來模擬人的視覺,因此模擬才是計算機視覺領域的最終目標。
OpenCV用C++語言編寫,它具有C ++,Python,Java和MATLAB接口,并支持Windows,Linux,Android和Mac OS, 如今也提供對于C#、Ch、Ruby,GO的支持
OpenCV應用領域有:人機互動、物體識別、 圖像分割、人臉識別、動作識別、運動跟蹤、機器人、運動分析、機器視覺、結構分析、汽車安全駕駛等。
安裝:
安裝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/,找到對應的版本下載。
在命令行安裝成功后,進入開發(fā)環(huán)境導入cv2,如果未報錯,就證明opencv安裝成功。
去水印
圖片展示
記得學過PS中有蒙版,可以使用蒙版遮罩完成。
代碼:
python
#?方式一
import?cv2
#?黑底白字
src?=?cv2.imread("images/a1.png")??#?默認的彩色圖(IMREAD_COLOR)方式讀入原始圖像
#?black.jpg
mask?=?cv2.imread('images/a2.png',?cv2.IMREAD_GRAYSCALE)??#?灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像
#?參數(shù):目標修復圖像;?蒙版圖(定位修復區(qū)域);?選取鄰域半徑;?修復算法(包括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")??#?默認的彩色圖(IMREAD_COLOR)方式讀入原始圖像
#?black.jpg
mask?=?cv2.imread('images/a2.png',?cv2.IMREAD_GRAYSCALE)??#?灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像
#?參數(shù):目標修復圖像;?蒙版圖(定位修復區(qū)域);?選取鄰域半徑;?修復算法(包括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)
于是要設置成一樣的大小
import?cv2
from?PIL?import?Image
src?=?cv2.imread("images/a1.png")??#?默認的彩色圖(IMREAD_COLOR)方式讀入原始圖像
#?black.jpg
mask?=?cv2.imread('images/a2.png',?cv2.IMREAD_GRAYSCALE)??#?灰度圖(IMREAD_GRAYSCALE)方式讀入水印蒙版圖像
#?參數(shù):目標修復圖像;?蒙版圖(定位修復區(qū)域);?選取鄰域半徑;?修復算法(包括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)
結果:
這種方式似乎還是可以看到一些水印,我們可以采用下面一種方法。
圖片去水印原理
1、標定噪聲的特征,使用cv2.inRange二值化標識噪聲對圖片進行二值化處理,具體代碼: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ù),推理并修復圖片。
實現(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]??#?裁剪坐標為[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)建形狀和尺寸的結構元素
kernel?=?np.ones((3,?3),?np.uint8)
#?擴展待修復區(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)
輸出結果:
?文章來源:http://www.zghlxwxcb.cn/news/detail-440936.html
文章來源地址http://www.zghlxwxcb.cn/news/detail-440936.html
到了這里,關于利用Python去除圖片水印,太神奇了!的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網(wǎng)!