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

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

如何选择适合孤独症兄妹的学校?

在探索适合孤独症儿童教育的道路上,每一位家长都面临着前所未有的挑战与抉择。当这份责任落在拥有孤独症兄妹的家庭肩上时,选择一所能够同时满足两个孩子特殊需求的学校,更显得尤为关键。本文将探讨如何为这样的家庭做出明智的选择,并介绍星贝育园自闭症儿童寄宿制学校作为一个值得考虑的选项。 理解孤独症儿童的独特性 孤独症,这一复杂的神经发育障碍,影响着儿童的社交互动、沟通能力以及行为模式。对于拥有孤独症兄

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

如何用Docker运行Django项目

本章教程,介绍如何用Docker创建一个Django,并运行能够访问。 一、拉取镜像 这里我们使用python3.11版本的docker镜像 docker pull python:3.11 二、运行容器 这里我们将容器内部的8080端口,映射到宿主机的80端口上。 docker run -itd --name python311 -p

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss