基于Python实现网页版去复杂图片水印

Python可以用OpenCV去除图片水印,但只针对简单图片,对于复杂图片水印,目前采用最多的是固定位置去除,但是这种方式不能针对所有照片,还有就是采用AI训练的方式,就这种方式而言,效果不错,但是很耗费时间,追求完美的话,至少需要20h,从经济上讲很不划算,所以本文一种特殊的方式,通过图像转化为HSV图,提取水印照片,参考PS的方式,与原图对比稀释掉水印,这种方式有两大缺点:

(1)针对图像色彩丰富,尤其深色系效果明显;

(2)目前大部分水印为灰色较多,这种方式只针对灰色水印。

本文参考了麦拂沙博主的文章,同时转用了该文章的图片,非常感谢。

基于Flask框架实现网页上传图片

打开网页输入以下网址:127.0.0.1:5000,这是来源于后面代码app.run(host='0.0.0.0', port=5000, debug=True)。

水印原图

代码解析:

(1)Flask框架搭建

新建qushuiyin.py文件,在该文件下输入以下代码。

from flask import Flask, render_template, request, redirect, url_for, make_response, jsonify
from werkzeug.utils import secure_filename
import os
import cv2
import time
import numpy as np
from PIL import Imagefrom datetime import timedelta# 设置允许的文件格式
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'bmp'])def allowed_file(filename):return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONSapp = Flask(__name__)
# 设置静态文件缓存过期时间
app.send_file_max_age_default = timedelta(seconds=1)# @app.route('/upload', methods=['POST', 'GET'])
@app.route('/', methods=['POST', 'GET'])  # 添加路由
def upload():if request.method == 'POST':f = request.files['file']if not (f and allowed_file(f.filename)):return jsonify({"error": 1001, "msg": "请检查上传的图片类型,仅限于png、PNG、jpg、JPG、bmp"})user_input = request.form.get("name")basepath = os.path.dirname(__file__)  # 当前文件所在路径upload_path = os.path.join(basepath, './static/photo', secure_filename(f.filename))  # 注意:没有的文件夹一定要先创建,不然会提示没有该路径f.save(upload_path)return render_template('REpicture_ok.html', val1=time.time())return render_template('REpicture.html')if __name__ == '__main__':# app.debug = Trueapp.run(host='0.0.0.0', port=5000, debug=True)

(2)REpicture_ok.html和Repicture.html搭建

在当前目录下新建Repicture_ok.html和Repicture.html空白文件,输入以下代码。

#REpicture.html
<head><meta charset="UTF-8"><title>图片右下角去水印</title>
</head>
<body><h1>请上传图片文件</h1><form action="" enctype='multipart/form-data' method='POST'><input type="file" name="file" style="margin-top:20px;"/><br><input type="submit" value="去水印" class="button-new" style="margin-top:15px;"/></form>
</body>
</html>
#REpicture_ok.html
<head><meta charset="UTF-8"><title>图片右下角去水印</title>
</head>
<body><h1>请上传图片文件</h1><form action="" enctype='multipart/form-data' method='POST'><input type="file" name="file" style="margin-top:20px;"/><br><input type="submit" value="去水印" class="button-new" style="margin-top:15px;"/></form><img src="{{ url_for('static', filename= './photo/result.jpg',_t=val1) }}" width="400" height="400" alt="你的图片被外星人劫持了~~"/>
</body>
</html>

注意:filename= './photo/result.jpg',路径要描述准确,否则会报错。

(3)得到反色水印图

原理是借鉴PS软件去水印方式,通过HSV提取出反色水印图,代码及执行结果如下:

在qushuiyin.py里f.save(upload_path)代码后接着输入以下代码:

        src = cv2.imread(upload_path)rows, cols, channels = src.shapehsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)low_hsv = np.array([0, 0, 46])high_hsv = np.array([20, 70, 200])mask = cv2.inRange(hsv, low_hsv, high_hsv)erode = cv2.erode(mask, None, iterations=1)dilate = cv2.dilate(erode, None, iterations=1)for i in range(rows):for j in range(cols):if dilate[i, j] != 255:  # 像素点255表示白色src[i, j] = (255, 255, 255)  # 此处替换颜色,为BGR通道,不是RGB通道img = cv2.imwrite("new.png", src)

说明:

如何获取 low_hsv, high_hsv两个数组的值:

第一种方式:可以参考一下下表

第二种方式:新建一个PicNum.py的文件,输入以下代码运行(注意修改图片路径),会得到一个HSV图,鼠标左键点击你需要的地方,软件上会显示出HSV值,可以参考。

import numpy as np
import cv2src = cv2.imread("./static/3.jpg")  # 用PIL中的Image.open打开图像
rows,cols,channels = src.shape
hsv = cv2.cvtColor(src, cv2.COLOR_BGR2HSV)
def getpos(event,x,y,flags,param):if event==cv2.EVENT_LBUTTONDOWN: #定义一个鼠标左键按下去的事件print(hsv[y,x])
cv2.imshow('imageHSV',hsv)
cv2.setMouseCallback("imageHSV",getpos)
cv2.waitKey(0)
cv2.destroyAllWindows()

(4)实现复杂图片去水印

在上面代码的后面接着输入:

        src = cv2.imread(upload_path)newImg = cv2.imread("new.png")save = np.zeros(src.shape, np.uint8)  # 创建一张空图像用于保存for row in range(src.shape[0]):for col in range(src.shape[1]):for channel in range(src.shape[2]):if newImg[row, col, channel] == 0:val = 0else:reverse_val = 255 - src[row, col, channel]val = 255 - reverse_val * 256 / newImg[row, col, channel]if val < 0: val = 0save[row, col, channel] = valdst = cv2.inpaint(save, mask, 3, cv2.INPAINT_TELEA)cv2.imwrite(os.path.join(basepath, './static/photo', 'result.jpg'), dst)#os.remove(os.path.join(basepath, './static/photo', 'new.png'))

给大家看看执行效果:

总结:

本文讲述的去复杂图片的水印,我觉得效果还可以,相比于通过PS软件获得反色水印图要简便快捷一些,虽然效果称不上完美,但是相比于AI训练方式也要简便快捷好多,同时还可以应用于服务器上。

最后我想留下一个问题,如果能点击获得原图的HSV值,是否可以实现橡皮擦工具,也就是可以实现点击就能去掉水印,这个问题留待以后有时间研究一下。

基于Python实现网页版之复杂图片去水印相关推荐

  1. 基于Python实现网页版去水印之去除图片右下角水印

    基于Python实现网页版去图片右下角水印 Python可以用OpenCV去除图片水印,但如何结合web框架去实现网页版去水印,带着这样的疑问,我搜索研究了一下,发现是完全可以实现的,而且考虑到部署服 ...

  2. 基于python实现网页版微信API,包含终端版微信及微信机器人

    1.Demo 为了确保能正常运行示例脚本,请安装所需的第三方包. pip install -r requirements.txt 注:下面演示的图片与功能可能不是最新的,具体请看源码.

  3. 照片背景底色更换工具二(python+flask网页版源码及打包)

    照片背景底色更换工具二(python+flask网页版源码及打包) 所有源码 文件结构 static images huaman_src_test.jpg huaman_result_test.png ...

  4. 转让一套基于 Flash 的网页版棋牌平台

    赖勇浩(http://laiyonghao.com) 转让一套基于 Flash 的网页版棋牌平台,它是我在 2009 年初开发完成的,当时是接了一个外包,所以才起意做这个项目的,后来项目流产了.最近看 ...

  5. 基于 Python 的横版 2D 动作类小游戏

    基于 Python 的横版 2D 动作类小游戏 游戏代码 游戏代码 游戏整体代码(基于 pygame 模块开发) // An highlighted block import pygame impor ...

  6. 基于ZYNQ的网页上传BMP图片至HDMI端口输出实例

    目录 Change Log 0 前言 0.1 系统实现 0.2 源码下载 0.3 项目信息 1 ZYNQ开发板HDMI输出BMP图片功能:FPGA相关 1.1 系统框图 1.2 RTL图 1.3 Bl ...

  7. 基于Python pygame简易版斗兽棋小游戏源代码

    基于Python pygame简易版斗兽棋小游戏源代码 游戏规则如下: 胜利条件: 1.吃掉对方全部棋子 2.走入对方兽穴(不可进入自己洞穴) 吃法: 1.象>狮>虎>豹>狼& ...

  8. 照片背景底色更换工具二(python+flask网页版使用演示)

    照片背景底色更换工具二(python+flask网页版) 引言 软件介绍及使用 软件包介绍 部署运行 1,双击启动 2,找到本地计算机的ip地址 3,访问链接 4,在windows server 20 ...

  9. python登录网页版易信_易信网页版下载|易信网页版登陆客户端官方最新版 2.1.1103.0 - 系统天堂...

    易信网页版登陆客户端是一款可以在pc电脑上直接登陆您的易信账号的一个客户端软件,它是一款能够真正免费聊天的即时通讯软件,小编今天就跟大家分享这款易信网页版登陆及其安装方法,本站提供本站提供易信网页版下 ...

  10. 基于JavaWeb的网页版邮箱系统设计与实现

    资源下载地址:https://download.csdn.net/download/sheziqiong/86790177 资源下载地址:https://download.csdn.net/downl ...

最新文章

  1. 我们希望读者能从这个BLOG获得什么?
  2. MYSQL中TIMESTAMP类型的默认值
  3. nexus-3本地下载jar的settipng.xml配置
  4. Loj #6089. 小 Y 的背包计数问题
  5. php怎样下载网上的文件,php怎样实现文件下载
  6. 用jquery动态添加form表单
  7. 3dmax导出fbx ue4_耗子尾汁马保国—CC3快速相片建模到UE4实时面部,动作捕捉
  8. 在linux下编译android下的opencv,使用cmake的方法
  9. 【Flask-RESTPlus系列】Part2:响应编组
  10. android网格布局间距,android – 删除回收站视图网格布局中的默认间距
  11. 人生路上对我影响最大的三位老师浅谈师生关系
  12. ios共享账号公众号_新增iOS游戏账号共享06
  13. inno setup 卸载注册表_Inno Setup Compiler卸载时删除注册表
  14. Python 获取 网易云音乐热门评论
  15. database/sql
  16. 懒人福音,分享4个实用的Python自动化脚本
  17. 聚划算说没钱补贴,用户都笑了
  18. 测试显卡的软件叫游戏什么,显卡测试软件哪个好
  19. springboot酒店宾馆管理系统、、
  20. [学习分享] 第一次 PR 过程记录 - RT-Thread

热门文章

  1. 一种FlashBuilder不能启动的解决方法
  2. 数据库系统概念第七版(Database System concepts 7th)课后答案英文版答案
  3. 学习ectouch之文件结构
  4. Visual C++ 内存泄露检测工具(VLD)
  5. 【开源】一个有趣的文字冒险游戏
  6. SPI读写串行FLASH(W25Q64)
  7. 《完全写作指南》读书笔记
  8. 次坐标从0开始_干货 | 全站仪测量使用方法及坐标计算,一步一步讲解!
  9. PowerPoint 中缺少think-cell 加载项怎么解决?
  10. 如何查看谷歌卫星地图每级分辨率的两种方法