文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Python去除图片水印实现方法详解

2023-01-06 12:01

关注

最近写文章遇到图片有水印,如何去除水印呢?

网上找了各种办法,也跑到小红书、抖音等平台找有没有不收费就去水印的网站,但是基本上都是需要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)

输出结果:

到此这篇关于Python去除图片水印实现方法详解的文章就介绍到这了,更多相关Python去除图片水印内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯