Python去除图片水印实现方法详解
作者:宋宋讲编程 发布时间:2022-09-19 22:15:37
最近写文章遇到图片有水印,如何去除水印呢?
网上找了各种办法,也跑到小红书、抖音等平台找有没有不收费就去水印的网站,但是基本上都是需要VIP会员才可以。
话又说回来这种事情怎么能难倒一个程序员呢?Python的库有这么多肯定有一款适合我吧?
于是找来了OpenCV。
OpenCV介绍
文档链接:https://docs.opencv.org/3.0-beta/doc/py_tutorials/py_tutorials.html
Opencv(Open Source Computer Vision Library)是一个基于开源发行的跨平台计算机视觉库,它实现了图像处理和计算机视觉方面的很多通用算法,已成为计算机视觉领域最有力的研究工具。
在这里我们要区分两个概念:
图像处理和计算机视觉的区别:图像处理侧重于“处理”图像–如增强,还原,去噪,分割等等;
而计算机视觉重点在于使用计算机来模拟人的视觉,因此模拟才是计算机视觉领域的最终目标。
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/,找到对应的版本下载。
在命令行安装成功后,进入开发环境导入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)方式读入水印蒙版图像
# 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括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'
可以分别打印一下尺寸看看,发现确实不一样
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)方式读入水印蒙版图像
# 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括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)方式读入水印蒙版图像
# 参数:目标修复图像; 蒙版图(定位修复区域); 选取邻域半径; 修复算法(包括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方法,扩展特征的区域,优化图片处理效果;
3、使用inpaint方法,把噪声的mask作为参数,推理并修复图片。
实现思路
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]))
# 创建形状和尺寸的结构元素
kernel = np.ones((3, 3), np.uint8)
# 扩展待修复区域
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)
输出结果:
来源:https://blog.csdn.net/qiqi1220/article/details/128530021
猜你喜欢
- Python中多线程使用到Threading模块。Threading模块中用到的主要的类是Thread,我们先来写一个简单的多线程代码:#
- 一、先让飞机在屏幕上飞起来吧。(一)实现飞机类class Plane: def __init__(self,fil
- 本文实例讲述了Python简单定义与使用字典的方法。分享给大家供大家参考,具体如下:#coding=utf8print ''
- 本文帮你六步改善SQL Server安全规划全攻略。一、什么是SQL注入式攻击所谓SQL注入式攻击,就是攻击者把SQL命令插入到Web表单的
- Jira提供了完善的RESTful API,如果不想直接请求API接口可以使用Python的Jira库来操作JiraJira Python文
- (1)方法一、直接用a标签的href+数据库中文件地址,即可下载。缺点:word excel是直接弹框下载,对于image txt 等文件的
- 前言最近有人在Twisted邮件列表中提出诸如"为任务紧急的人提供一份Twisted介绍"的需求。值得提前透露的是,这个
- 实现效果实现代码import matplotlib.pyplot as pltfrom skimage import iofile_name
- 具体代码如下所示:#coding=utf8from urllib import requestimport reimport urllib,
- 我就废话不多说了,大家还是直接看代码吧~</pre><pre code_snippet_id="1947416&
- 目前,SQL Server数据库有几个版本都在使用中,比如 7.0, 2000和2005,那么,在现实的工作和学习中,你很有可能会需要从以前
- 将表数据生成SQL脚本的存储过程示例:CREATE PROCEDURE dbo.UspOutputData @tablename sysna
- 本文实例讲述了python实现获取序列中最小的几个元素。分享给大家供大家参考。具体方法如下:import heapq import rand
- 1.安装pm2 : npm install pm2 -gd这时在命令行下执行pm2命令可能找不到,需要执行如下命令1.创建软链接:ln -s
- 目录Pyppeteer 是什么Pyppeteer能做什么截图导出PDF公众号链接导出PDF示例Pyppeteer 是什么介绍 Pyppete
- 代码如下import osimport cv2for i in range(1,201): if i==169 or i==18
- 一个字典就是一个键对应一个单值的映射。如果你想要一个键映射多个值,那么你就需要将这多个值放到另外的容器中, 比如列表或者集合里面。比如,你可
- 我和朋友对此的看法有分歧,我明明记得有不需要返回的时候的?你的看法是对的,例如在表中删除记录。我们来看看下面的例子——在Employee表中
- 概述线性回归 (Linear Regression) 是利用回归分析来确定两种或两种以上变量间相互依赖的定量关系.对线性回归还不是很了解的同
- CSS网页布局开发中,会有很多小技巧,这里再扩展一下您所想要得到的知识,相信您会有很多收获!一、ul标签在Mozilla中默认是有paddi