opencv-python实战项目十二:去除鼠标选择区域的水印

2024-08-21 10:28

本文主要是介绍opencv-python实战项目十二:去除鼠标选择区域的水印,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一,简介
  • 二,算法实现:
    • 2.1 鼠标事件定位水印区域
    • 2.2 水印区域修复:
  • 三,整体代码:
  • 四,效果:

一,简介

在日常生活中,我们常常会遇到带有水印的图片,这些水印虽然保护了版权,但有时也会影响图像的美观和使用。本次博客将向您介绍如何运用OpenCV这一强大的计算机视觉库,轻松实现图像去水印,让您的照片恢复纯净之美。在这篇文章中,我们将深入探讨OpenCV在图像处理领域的应用,特别是如何通过简单的代码操作,定位并去除图像中的水印。

二,算法实现:

2.1 鼠标事件定位水印区域

在本次项目中,我们使用OpenCV库来读取用户的鼠标状态,以便选择需要去除水印的区域。首先,通过初始化全局变量来监控鼠标事件和矩形绘制状态。当用户按下鼠标左键时,算法会开始绘制矩形,并记录下起始点坐标(ix, iy)。在鼠标移动过程中,如果绘制状态为真,则会在原始图像的副本上动态绘制一个绿色矩形框,其边界由起始点和当前鼠标位置共同确定。用户释放鼠标左键后,绘制状态会被关闭,并记录矩形的终点坐标(fx, fy)。同时,在掩码图像上绘制一个与之坐标相同的白色填充矩形。这个掩码图像将在后续的水印去除操作中使用。
代码:

def draw_rectangle(event, x, y, flags, param):global ix, iy, fx, fy, drawing, maskif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if drawing:img_draw = img.copy()cv2.rectangle(img_draw, (ix, iy), (x, y), (0, 255, 0), 2)cv2.imshow('image', img_draw)elif event == cv2.EVENT_LBUTTONUP:drawing = Falsefx, fy = x, ycv2.rectangle(mask, (ix, iy), (fx, fy), (255,255,255), -1)

2.2 水印区域修复:

本次水印区域修复运用的是opencv自带函数cv2.inpaint()
cv2.inpaint()是OpenCV库中的一个函数,用于修复图像中的损坏区域。它通过分析图像中未损坏的像素,来推断并填充损坏区域的像素值,从而使得修复后的区域与周围图像内容尽可能融合,减少视觉上的不连续性。
函数介绍:

输入:
● src:输入的原始图像,通常是8位单通道或3通道(彩色)图像。
● mask:一个8位单通道图像,与src具有相同的尺寸。掩码图像中的非零像素表示需要修复的损坏区域。
● inpaintRadius:一个正数,表示修复过程中考虑的邻域半径(以像素为单位)。这个半径定义了在修复一个像素时,函数将考虑多少周围的像素。
● flags:修复方法标志,有两个选项:
○ cv2.INPAINT_TELEA:使用基于快速行进方法的算法,由Alexandru Telea提出。
○ cv2.INPAINT_NS:使用基于Navier-Stokes方程和流体动力学的方法。
返回值:
返回一个图像,它与src具有相同的尺寸和类型,其中损坏的区域已经被修复。
cv2.inpaint()函数常用于去除图像中的小缺陷,如噪点、划痕或小面积的水印等。不过,其修复效果取决于损坏区域的大小和图像的纹理复杂度,有时可能需要调整inpaintRadius和flags参数来获得最佳效果。

代码:

inpainted_img = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)

三,整体代码:

import cv2
import numpy as np# 初始化全局变量
drawing = False
ix, iy = -1, -1
fx, fy = -1, -1# 鼠标回调函数
def draw_rectangle(event, x, y, flags, param):global ix, iy, fx, fy, drawing, maskif event == cv2.EVENT_LBUTTONDOWN:drawing = Trueix, iy = x, yelif event == cv2.EVENT_MOUSEMOVE:if drawing:img_draw = img.copy()cv2.rectangle(img_draw, (ix, iy), (x, y), (0, 255, 0), 2)cv2.imshow('image', img_draw)elif event == cv2.EVENT_LBUTTONUP:drawing = Falsefx, fy = x, ycv2.rectangle(mask, (ix, iy), (fx, fy), (255,255,255), -1)# 加载图像
img = cv2.imread(r'F:\traditional_vison\1a0c30580ad44357a4d625845ec32db5.png')
img = cv2.resize(img,(0,0),fx=0.5,fy=0.5)
mask = np.zeros(img.shape[:2], dtype=np.uint8)
cv2.namedWindow('image')
cv2.setMouseCallback('image', draw_rectangle)while True:cv2.imshow('image', img)k = cv2.waitKey(1) & 0xFFif k == ord('q'):break# 检查是否已经框选了一个区域
if ix >= 0 and iy >= 0 and fx >= 0 and fy >= 0:# 使用 inpaint 函数修复图像inpainted_img = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)cv2.imshow('Inpainted Image', inpainted_img)cv2.waitKey(0)
cv2.destroyAllWindows()

四,效果:

去除水印前:
在这里插入图片描述
去除水印后:
在这里插入图片描述

这篇关于opencv-python实战项目十二:去除鼠标选择区域的水印的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1092896

相关文章

Python的Darts库实现时间序列预测

《Python的Darts库实现时间序列预测》Darts一个集统计、机器学习与深度学习模型于一体的Python时间序列预测库,本文主要介绍了Python的Darts库实现时间序列预测,感兴趣的可以了解... 目录目录一、什么是 Darts?二、安装与基本配置安装 Darts导入基础模块三、时间序列数据结构与

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

基于 Cursor 开发 Spring Boot 项目详细攻略

《基于Cursor开发SpringBoot项目详细攻略》Cursor是集成GPT4、Claude3.5等LLM的VSCode类AI编程工具,支持SpringBoot项目开发全流程,涵盖环境配... 目录cursor是什么?基于 Cursor 开发 Spring Boot 项目完整指南1. 环境准备2. 创建

Python使用FastAPI实现大文件分片上传与断点续传功能

《Python使用FastAPI实现大文件分片上传与断点续传功能》大文件直传常遇到超时、网络抖动失败、失败后只能重传的问题,分片上传+断点续传可以把大文件拆成若干小块逐个上传,并在中断后从已完成分片继... 目录一、接口设计二、服务端实现(FastAPI)2.1 运行环境2.2 目录结构建议2.3 serv

通过Docker容器部署Python环境的全流程

《通过Docker容器部署Python环境的全流程》在现代化开发流程中,Docker因其轻量化、环境隔离和跨平台一致性的特性,已成为部署Python应用的标准工具,本文将详细演示如何通过Docker容... 目录引言一、docker与python的协同优势二、核心步骤详解三、进阶配置技巧四、生产环境最佳实践

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

MyBatis分页查询实战案例完整流程

《MyBatis分页查询实战案例完整流程》MyBatis是一个强大的Java持久层框架,支持自定义SQL和高级映射,本案例以员工工资信息管理为例,详细讲解如何在IDEA中使用MyBatis结合Page... 目录1. MyBATis框架简介2. 分页查询原理与应用场景2.1 分页查询的基本原理2.1.1 分

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

python获取指定名字的程序的文件路径的两种方法

《python获取指定名字的程序的文件路径的两种方法》本文主要介绍了python获取指定名字的程序的文件路径的两种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要... 最近在做项目,需要用到给定一个程序名字就可以自动获取到这个程序在Windows系统下的绝对路径,以下

使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解

《使用Python批量将.ncm格式的音频文件转换为.mp3格式的实战详解》本文详细介绍了如何使用Python通过ncmdump工具批量将.ncm音频转换为.mp3的步骤,包括安装、配置ffmpeg环... 目录1. 前言2. 安装 ncmdump3. 实现 .ncm 转 .mp34. 执行过程5. 执行结