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生成随机唯一id的几种实现方法

《python生成随机唯一id的几种实现方法》在Python中生成随机唯一ID有多种方法,根据不同的需求场景可以选择最适合的方案,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起学习学习... 目录方法 1:使用 UUID 模块(推荐)方法 2:使用 Secrets 模块(安全敏感场景)方法

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

IntelliJ IDEA2025创建SpringBoot项目的实现步骤

《IntelliJIDEA2025创建SpringBoot项目的实现步骤》本文主要介绍了IntelliJIDEA2025创建SpringBoot项目的实现步骤,文中通过示例代码介绍的非常详细,对大家... 目录一、创建 Spring Boot 项目1. 新建项目2. 基础配置3. 选择依赖4. 生成项目5.

使用Python删除Excel中的行列和单元格示例详解

《使用Python删除Excel中的行列和单元格示例详解》在处理Excel数据时,删除不需要的行、列或单元格是一项常见且必要的操作,本文将使用Python脚本实现对Excel表格的高效自动化处理,感兴... 目录开发环境准备使用 python 删除 Excphpel 表格中的行删除特定行删除空白行删除含指定

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

Python通用唯一标识符模块uuid使用案例详解

《Python通用唯一标识符模块uuid使用案例详解》Pythonuuid模块用于生成128位全局唯一标识符,支持UUID1-5版本,适用于分布式系统、数据库主键等场景,需注意隐私、碰撞概率及存储优... 目录简介核心功能1. UUID版本2. UUID属性3. 命名空间使用场景1. 生成唯一标识符2. 数

Python办公自动化实战之打造智能邮件发送工具

《Python办公自动化实战之打造智能邮件发送工具》在数字化办公场景中,邮件自动化是提升工作效率的关键技能,本文将演示如何使用Python的smtplib和email库构建一个支持图文混排,多附件,多... 目录前言一、基础配置:搭建邮件发送框架1.1 邮箱服务准备1.2 核心库导入1.3 基础发送函数二、

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Python包管理工具pip的升级指南

《Python包管理工具pip的升级指南》本文全面探讨Python包管理工具pip的升级策略,从基础升级方法到高级技巧,涵盖不同操作系统环境下的最佳实践,我们将深入分析pip的工作原理,介绍多种升级方... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核

PowerShell中15个提升运维效率关键命令实战指南

《PowerShell中15个提升运维效率关键命令实战指南》作为网络安全专业人员的必备技能,PowerShell在系统管理、日志分析、威胁检测和自动化响应方面展现出强大能力,下面我们就来看看15个提升... 目录一、PowerShell在网络安全中的战略价值二、网络安全关键场景命令实战1. 系统安全基线核查