python+opencv实现图片/短视频一键去水印

目录

  • 0 前言
  • 1 准备工作
  • 2 读取图片或视频
  • 3 添加回调获取鼠标绘制水印区域
  • 4 调用opencv函数
  • 5 绘制蒙版主循环
  • 6 去水印主循环
  • 总结

0 前言

在制作ppt个人文章或者分享图片过程中,经常会遇到一些带有水印的情况,不少人都希望能够去除这些水印,提高图片和视频的观看体验。本文将介绍如何使用Python+opencv实现图片的去水印功能。
在这里插入图片描述
👉 点击链接体验在线demo

1 准备工作

首先,我们需要导入OpenCV和NumPy库。OpenCV是一个开源的计算机视觉库,可以用于图像和视频处理,NumPy是Python的一个科学计算库,提供了高性能的多维数组对象。

import cv2
import numpy as np

2 读取图片或视频

在代码中,我们定义了一个变量pmode来指定处理模式,可以是"image"或"video"。当pmode为"image"时,我们从指定路径读取一张图片;当pmode为"video"时,我们通过cv2.VideoCapture()函数从指定路径读取一个视频。

pmode="image"
path = "316.jpg"   #记得不要有中文路径
vieodpath="350.mp4"
cap=cv2.VideoCapture(vieodpath)if pmode=="video":ret,img = cap.read()
else:img = cv2.imread(path)
height,width = img.shape[0:2]

3 添加回调获取鼠标绘制水印区域

接下来,我们获取图片的高度和宽度,并定义了一些全局变量,用于记录鼠标事件的状态和坐标。同时,我们创建了一个与窗口绑定的回调函数,用于实现鼠标事件的交互操作。

# 鼠标回调函数
def draw_circle(event, x, y, flags, param):global ix, iy, drawing, mode, imgif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if drawing == True:if mode == True:cv2.rectangle(mask, (ix, iy), (x, y), (0, 255, 0), -1)cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)else:cv2.circle(mask, (x, y), 5, (0, 255, 0), -1)cv2.circle(img, (x, y), 5, (0, 255, 0), -1)

在这里插入图片描述

在鼠标回调函数中,我们根据不同的鼠标事件进行相应的操作。当按下鼠标左键时,开始画矩形或圆形,记录起始坐标;当鼠标移动时,如果继续按下鼠标左键,根据当前模式画矩形或圆形;当释放鼠标左键时,停止画矩形或圆形,根据当前模式完成最后一个矩形或圆形的绘制。

			elif event == cv2.EVENT_LBUTTONUP:drawing = Falseif mode == True:cv2.rectangle(mask, (ix, iy), (x, y), (0, 255, 0), -1)cv2.rectangle(img, (ix, iy), (x, y), (0, 255, 0), -1)else:cv2.circle(mask, (x, y), 5, (0, 255, 0), -1)cv2.circle(img, (x, y), 5, (0, 255, 0), -1)

4 调用opencv函数

接下来,我们定义了一个waterprint()函数,用于去除图片中的水印。在该函数中,我们首先定义了要查找的颜色范围,然后将图片转换为HSV颜色空间,并使用cv2.inRange()函数根据颜色范围得到一个二值图像。接着,我们使用cv2.dilate()函数对二值图像进行膨胀操作,得到一张掩膜图像。最后,我们使用cv2.inpaint()函数根据掩膜图像进行修复操作,得到最终的去水印结果。

def waterprint(img):global mask#开始操作# 设定要查找的颜色范围lower_green = np.array([50, 100, 100])upper_green = np.array([70, 255, 255])hsv = cv2.cvtColor(mask, cv2.COLOR_BGR2HSV)thresh = cv2.inRange( hsv,lower_green,upper_green) scan = np.ones((5,5),np.uint8)cor = cv2.dilate(thresh,scan,iterations=1)dst = cv2.inpaint(img, cor, 3, cv2.INPAINT_TELEA)

5 绘制蒙版主循环

在主程序中,我们创建了一个窗口,并将回调函数与窗口绑定。然后,我们进入一个循环,不断显示原始图片,并根据按键的操作切换绘制模式、生成掩膜图像,以及退出程序。

while(1):cv2.imshow('image', img)k = cv2.waitKey(1) & 0xFFif k == ord('m'):mode = not modeelif k == ord('s'):mask = np.zeros(img.shape[:2], dtype=np.uint8)contours, hierarchy = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for contour in contours:x, y, w, h = cv2.boundingRect(contour)cv2.rectangle(mask, (x, y), (x+w, y+h), (0, 0, 0), -1)cv2.imshow('mask', mask)elif k == 27:breakcv2.destroyAllWindows()

6 去水印主循环

在处理视频时,我们首先创建了一个视频编写器,并使用cv2.VideoWriter()函数指定输出视频的格式、帧率和大小。然后,我们使用cv2.VideoCapture()函数读取视频的每一帧,并对每一帧进行去水印操作。最后,我们将处理后的帧写入输出视频,并显示处理后的帧。如果按下键盘上的"s"键,则停止处理并保存输出视频。最后,我们释放资源,关闭窗口。

# 创建视频编写器
fourcc = cv2.VideoWriter_fourcc(*'mp4v')
out = cv2.VideoWriter('output'+datetime.now().strftime("%H-%M-%S")+'.mp4', fourcc, 20.0, (width, height))if pmode=="video":if cap.isOpened():cap.release()cap=cv2.VideoCapture(vieodpath)while(cap.isOpened()):        ret, frame = cap.read()if ret:# 写入输出视频nowaterprint_frame=waterprint(frame)out.write(nowaterprint_frame)# 显示帧cv2.imshow('frame', nowaterprint_frame)if cv2.waitKey(27) & 0xFF == ord('s'):            # 释放资源breakcap.release()out.release()cv2.destroyAllWindows()    
else:nowaterprint_frame=waterprint(img)cv2.imshow('frame', nowaterprint_frame)cv2.waitKey(0)cv2.destroyAllWindows()  

如果处理的是一张图片,则直接调用waterprint()函数进行去水印,并显示处理后的图片。

通过以上代码,我们实现了图片和视频的去水印功能。当我们运行代码并选择相应的处理模式后,可以通过鼠标交互操作选择要去除的水印区域,并得到去水印后的结果。这样,我们就可以更好地欣赏图片和观看视频,提高视觉体验。

总结

总结起来,本文介绍了如何使用Python编程语言实现图片和视频的去水印功能。通过OpenCV和NumPy库的支持,我们可以轻松处理图像和视频,并实现自定义的图像处理效果。希望本文对大家了解Python图像处理有所帮助。
源码链接

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/588869.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024如何成为一名合格的全栈开发者

我的新书《Android App开发入门与实战》已于2020年8月由人民邮电出版社出版,欢迎购买。点击进入详情 在当今快速发展的技术环境中,对多才多艺和技能熟练的专业人员的需求正在不断增加。 全栈开发人员是一个非常受欢迎的角色。 本文将深入了解什么是全栈…

【Linux】Linux

Linux 文章目录 Linux1. 简介2. 目录结构3. vi/vim 的使用4. 网络配置4.1 配置网络ip地址4.2 配置主机名或ip映射4.3 远程登陆及上传下载 5. 系统管理5.1 service 服务管理(CentOS 6 版本)5.2 systemctl 服务管理(CentOS 7 版本)5…

thinkphp6.0升级到8.0

目录 一:升级过程 二:报错处理 最近写的项目需要使用thinkphp8.0,之前的老项目需要从php6.0升级到8.0,特此记录下升级过程。 一:升级过程 查看版本: php think version,我目前的版本是6.1.4 生成thin…

Java项目:103SSM酒店管理系统

博主主页:Java旅途 简介:分享计算机知识、学习路线、系统源码及教程 文末获取源码 一、项目介绍 酒店管理系统基于SpringSpringMVCMybatis开发,功能简单,可用于毕设或者课程设计。 管理员功能如下: 房间管理住客入住…

图像去雾/图像去雨(matlab/python)

图像去雾和图像去雨是计算机视觉领域的两个重要问题,旨在改善被大气条件或降雨影响而模糊或噪声化的图像质量。这两个技术在很多实际应用中具有广泛的价值,包括无人驾驶、安防监控、航空航天等领域。下面将分点介绍图像去雾和图像去雨的相关内容。 1. 图…

Debezium发布历史40

原文地址: https://debezium.io/blog/2018/09/20/materializing-aggregate-views-with-hibernate-and-debezium/ 欢迎关注留言,我是收集整理小能手,工具翻译,仅供参考,笔芯笔芯. 使用 Hibernate 和 Debezium 实现聚合…

2021-06-25 51蛋骗鸡按键切合LED

缘由ISIS 7 Professional_有问必答-CSDN问答 #include "REG52.h" sbit K1 P3^0; sbit K2 P3^1; sbit K3 P3^2; sbit K4 P3^3; void main() {unsigned char Xd0,xz0,cs0;unsigned int wei0;P1255;while(1){if(K10&&Xd0){P10;while(K10);}if(K20&&…

【Redis-05】Redis如何实现保存键值对的保存及过期键的管理策略

在之前的文章我们介绍过,Redis服务器在启动之初,会初始化RedisServer的实例,在这个实例中存在很多重要的属性结构,同理本篇博客中介绍的数据库实现原理也会和其中的某些属性相关,我们继续看一下吧。 1.服务器和客户端…

【后端】Docker学习笔记

文章目录 Docker一、Docker安装(Linux)二、Docker概念三、Docker常用命令四、数据卷五、自定义镜像六、网络七、DockerCompose Docker Docker是一个开源平台,主要基于Go语言构建,它使开发者能够将应用程序及其依赖项打包到一个轻…

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测

多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测 目录 多维时序 | MATLAB实现SSA-CNN-GRU-SAM-Attention麻雀算法优化卷积网络结合门控循环单元网络融合空间注意力机制多变量时间序列预测预测效…

uni-app模版(扩展插件)

锋哥原创的uni-app视频教程: 2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中..._哔哩哔哩_bilibili2023版uniapp从入门到上天视频教程(Java后端无废话版),火爆更新中...共计23条视频,包括:第1讲 uni…

使用css实现 Typora markdown 标题自动编号

第一,找到主题文件夹 第二,复制下面代码放入 AutoNumber.css文件中 body {counter-reset: h1; }#write h1, .markdown-section h1 {counter-reset: h2; }#write h2, .markdown-section h2 {counter-reset: h3; }#write h3, .markdown-section h3 {counte…

分割数组的最大差值 - 华为OD统一考试

分割数组的最大差值 - 华为OD统一考试 OD统一考试 分值: 100分 题解: Java / Python / C 题目描述 给定一个由若干整数组成的数组nums ,可以在数组内的任意位置进行分割,将该数组分割成两个非空子数组(即左数组和右数组)&#xf…

第三部分 连续型需要的积分

目录 温馨提示: 求积分 求分段函数在确定区间的定积分 方法: 例1 例2 例3 例4 例5 例6 例7 求分段函数在到未知数的定积分 方法: 例8 求简单的二重积分 方法: 例9 例10 例11 求f(x,y)的二重积分 方法: 例12 例13 …

Langchain-Chatchat开源库使用的随笔记(一)

笔者最近在研究Langchain-Chatchat,所以本篇作为随笔记进行记录。 最近核心探索的是知识库的使用,其中关于文档如何进行分块的详细,可以参考笔者的另几篇文章: 大模型RAG 场景、数据、应用难点与解决(四)R…

怎么解决 Nginx反向代理加载速度慢?

Nginx反向代理加载速度慢可能由多种原因引起,以下是一些可能的解决方法: 1,网络延迟: 检查目标服务器的网络状况,确保其网络连接正常。如果目标服务器位于不同的地理位置,可能会有较大的网络延迟。考虑使用…

Good Bye 2023

Good Bye 2023 Good Bye 2023 A. 2023 题意:序列a中所有数的乘积应为2023,现在给出序列中的n个数,找到剩下的k个数并输出,报告不可能。 思路:把所有已知的数字乘起来,判断是否整除2023,不够…

Android Studio如何创建尺寸大小及API通用的模拟器

目录 前言 一、操作步骤 二、总结 三、更多资源 前言 在开发移动应用程序的过程中,使用模拟器进行测试是一种常见和方便的方式。Android Studio是一款功能强大的集成开发环境,它提供了创建和管理模拟器的功能。在本文中,我们将介绍如何创…

qs.stringify 使用arrayFormat属性 + allowDots的数据处理 - 附示例

qs:将url中的参数转为对象;将对象转为url参数形式 一、介绍 1、官方文档: https://github.com/ljharb/qs https://github.com/ljharb/qshttps://github.com/ljharb/qs 二、准备工作 1、安装依赖包 npm install qs --save 2、示例版本 &…

Autodesk Maya各版本安装指南

链接地址如下: https://pan.baidu.com/s/1Fg7MvUJS0tl5t2XAwMK9xg?pwd0531 1.鼠标右击【Maya2024(64bit)】压缩包(win11及以上系统需先点击“显示更多选项”)【解压到 Maya2024(64bit)】。 2.打开解压后的文件夹,双击打开【Setu…