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

news2025/2/28 15:40:03

目录

  • 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, img

    if event == cv2.EVENT_LBUTTONDOWN:
        drawing = True
        ix, iy = x, y

    elif 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 = False
			        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)

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) & 0xFF
    if k == ord('m'):
        mode = not mode
    elif 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:
        break

cv2.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'):            
            
            # 释放资源
            
            break
        
    cap.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.coloradmin.cn/o/1346850.html

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

相关文章

java企业网站系统Myeclipse开发mysql数据库web结构java编程计算机网页项目

一、源码特点 java Web企业网站系统是一套完善的java web信息管理系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql5.0&…

蓝桥杯C/C++程序设计——成绩统计

题目描述 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 如果得分至少是 60 分,则称为及格。如果得分至少为 85 分,则称为优秀。 请计算及格率和优秀率,用百分数表示&am…

Zookeeper实现分布式锁和注册中心

目录 分布式锁 实现方式 分布式锁场景如何选择Redis和zookeeper 用InterProcessMutex实现分布式锁 zookeeper实现注册中心 分布式锁 实现方式 数据库唯一索引Redis的setnxZookeeper创建临时节点及监听机制Zookeeper创建临时有序节点 分布式锁场景如何选择Redis和zookeepe…

Apple Unity Plugins 接入GameCenter 崩溃解决方案

目录 问题问题原因解决方案可直接使用的UnityPlugins 问题 调用 GKLocalPlayer.Local.FetchItems() 程序崩溃,报错:Thread 1: EXC_BAD_ACCESS (code257, address0x8000000000000002) 启动崩溃,报错:Library not loaded: rpath/Ap…

Ubuntu 22.04 安装ftp实现与windows文件互传

Ubuntu 22.04 安装ftp实现与windows文件互传 1、配置安装 安装: sudo apt install vsftpd -y使能开机自启: sudo systemctl enable vsftpd 启动: sudo systemctl start vsftpd创建ftp工作目录: sudo mkdir -p /home/ftp/uftp…

FPGA实现 NIC 10G 网卡,纯verilog代码编写,提供工程源码和技术支持

目录 1、前言免责声明 2、我这里已有的UDP方案3、10G网卡基本性能简介4、详细设计方案接口概述PCIe HIPDMA IFAXI总线接口时钟同步处理TXQ和RXQ队列TXCQ和RXCQ队列完成EQ MAC PHY流水线队列管理发送调度程序端口和接口数据路径以及发送和接收引擎分段内存接口 5、vivado工程详…

SpringBoot 日志打印

一. 自定义打印日志 开发者自定义打印日志实现步骤: • 在程序中得到日志对象 • 使用日志对象的相关语法输出要打印的内容. 得到日志对象: //日志工厂需要将需要打印的类的类型传递进去,这样我们才知道日志的归属类,才能更方便的定位到文体类 private static Logger logger …

软件测试/测试开发丨Python 内置库 sys 学习笔记分享

sys 概述 是 Python 自带的内置模块是与 Python 解释器交互的桥梁 sys 使用 常用属性常用方法导入 sys 模块 # 导入sys模块 import sys# 查看sys模块帮助文档 help(sys)# 查看sys模块的属性和方法 print(dir(sys))sys 常用属性 sys.version:返回 Python 解释器…

Chapter 7 - 8. Congestion Management in Ethernet Storage Networks以太网存储网络的拥塞管理

Stomped CRC Counters Stomped CRC counters help in finding the location of bit errors in a network that uses cut-through switches. More precisely, these counters help in finding where bit errors do not exist. Stomped CRC 计数器有助于在使用直通式交换机的网络…

keil5修改默认配色方案

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1. 找到Keil_5\UV4路径下的两个文件2. 修改global.prop文件中的内容第一种 配色方案第二种 配色方案第三种 配色方案第四种 配色方案 最后 前言 提示&#xff…

使用递归实现深拷贝

文章目录 为什么要使用递归什么深拷贝具体实现基础实现处理 函数处理 Symbol处理 Set处理 Map处理 循环引用 结语-源码 为什么要使用递归什么深拷贝 我们知道在 JavaScript 中可以通过使用JSON序列化来完成深拷贝,但是这种方法存在一些缺陷,比如对于函数…

【远程开发】穿越跳板机和CLion远程开发——全面配置流程

文章目录 穿越跳板机配置 ProxyJump 方案Cygwin上的配置 建立 SSH Tunneling 方案 代码映射目录映射方案配置Rsync加速 远程服务器方案(todo) 远程Debug tips:本文讲了两种穿越跳板机的方案(推荐ProxyJump方案),和两种代码映射的方案。实际任选一对搭配即…

VC2019更改文件名称代码

VC2019更改文件名称代码 效果代码 效果 华为手机拍摄的视频默认名称是“VID_20231213_111723”,图片名称是“IMG_20231213_111723”,需要批量将“VID”改为“IMG” 代码 代码(C#): csharpStringBuilder sbnew StringBuilder()…

Vue-Vben-Admin:打造高效中大型项目后台解决方案

Vue-Vben-Admin:打造高效中大型项目后台解决方案 摘要: Vue-Vben-Admin是一个基于Vue3.0、Vite、Ant-Design-Vue和TypeScript的开源项目,旨在为开发中大型项目提供一站式的解决方案。它涵盖了组件封装、实用工具、钩子函数、动态菜单、权限验…

Vue2Element-ui编写可复用增删改查列表思路及实现方式

前提:堂弟在学校学计算机,有一个期末作业,需要做一个简单的UI界面 先看下基本效果 登录页面包含基本信息校验及登录和保存用户信息 登录之后的列表页面显示 由于是多个tab中午没有太多时间就直接复用数据模式 整体代码在270多行左右 列表 新增弹窗 修改弹窗 删除 其实这里…

爬虫详细教程第1天

爬虫详细教程第一天 1.爬虫概述1.1什么是爬虫?1.2爬虫工具——Python1.3爬虫合法吗?1.4爬虫的矛与盾1.4.1反爬机制1.4.2反爬策略1.4.3robots.txt协议 2.爬虫使用的软件2.1使用的开发工具: 3.第一个爬虫4.web请求4.1讲解一下web请求的全部过程4.2页面渲染…

HCIP:rip综合实验

实验要求: 【R1-R2-R3-R4-R5运行RIPV2】 【R6-R7运行RIPV1】 1.使用合理IP地址规划网络,各自创建环回接口 2.R1创建环回 172.16.1.1/24 172.16.2.1/24 172.16.3.1/24 3.要求R3使用R2访问R1环回 4.加快网络收敛,减少路由条目数量,增…

Maven下载和安装的详细教程

文章目录 一、Maven下载和安装1.1 下载 Maven1.2 配置环境变量 参考资料 一、Maven下载和安装 1.1 下载 Maven 打开 Maven 的官方网站Maven – Download Apache Maven,下载最新版本的 Maven 在可选择的版本中,不同版本的区别在于: binary是已经编译过的…

【深入浅出JVM原理及调优】「搭建理论知识框架」全方位带你深度剖析Java线程转储分析的开发指南

这里写目录标题 专栏介绍前提准备面向人群知识脉络分析线程转储线程转储分析的介绍JVM和线程运行机制JVM和中间件之间的软件交互 JVM线程转储Java快照的基本信息内存回收日志线程转储分解概述全线程转储标识符Java EE中间件,第三方和自定义应用程序线程HotSpot VM T…

2024任务驱动Java程序设计讲课提纲

文章目录 为何采用任务驱动?任务驱动Java程序设计课程概述项目一:踏上Java开发之旅任务1:安装配置JDK并开发第一个Java程序1、安装JDK2、配置JDK环境变量3、开发第一个Java程序 任务2:搭建Java集成开发环境IntelliJ IDEA1、安装In…