Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果

目录

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单实战案例 之十三 简单去除图片水印效果

一、简单介绍

二、简单去除图片水印效果实现原理

三、简单去除图片水印效果案例实现简单步骤

四、注意事项


一、简单介绍

Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。Python是一种解释型脚本语言,可以应用于以下领域: Web 和 Internet开发、科学计算和统计、人工智能、教育、桌面界面开发、软件开发、后端开发、网络爬虫。

这里使用 Python  基于 OpenCV 进行视觉图像处理,......

二、简单去除图片水印效果实现原理

去除图片水印是指从一张带有水印的图像中,通过算法或图像处理技术,将水印部分去除,以得到不带水印的图像。通常情况下,水印是以文字、图标或者图案的形式嵌入到图像中的,去除水印的目的是为了提高图像的美观度和可用性,以便更好地应用于各种场景,如展示、打印或者分析等。

当选择图片水印去除时,上述案例实现分为以下步骤:

  1. 选择水印的ROI(感兴趣区域)

    • 用户使用鼠标在图片上框选出水印区域。
    • 通过调用 OpenCV 的 cv2.selectROI() 函数实现框选操作,并在框选完成后返回框选区域的坐标和尺寸。
    • 如果未成功选择ROI(即框选的宽度或高度为0),则输出相应提示信息,终止水印去除操作。
  2. 自适应检测水印并生成遮罩

    • 在选择的ROI区域内,将图像转换为灰度图像,并利用 Otsu 自适应阈值处理方法进行二值化,以获取水印的二值图像。
    • 根据二值化图像生成水印的遮罩,将水印区域设为白色(255),其他区域设为黑色(0)。
  3. 生成水印的遮罩

    • 对检测到的水印遮罩进行膨胀操作,以确保水印区域完全覆盖。
    • 使用 OpenCV 的 cv2.dilate() 函数对水印遮罩进行膨胀操作,以扩展水印区域。
  4. 应用遮罩去除水印

    • 利用水印遮罩对原始图像进行修复,将水印区域的像素值恢复为相邻像素的估计值。
    • 使用 OpenCV 的 cv2.inpaint() 函数对图像进行修复,将水印区域填充为相邻像素的估计值。
  5. 保存处理后的图片

    • 将去除水印后的图像保存到指定的输出路径。

案例中的关键函数说明:

  1. select_roi_for_mask(image)

    • 功能:从图像中选择水印的感兴趣区域(ROI)。
    • 参数:
      • image:输入的图像数据,应为 BGR 格式的图像。
    • 返回值:
      • 如果成功选择了ROI,则返回水印的ROI坐标和尺寸 (x, y, w, h),其中 (x, y) 是左上角的坐标,w 是宽度,h 是高度。
      • 如果未选择ROI,则返回 None。
    • 注意事项:
      • 输入图像应为 BGR 格式的图像数据。
      • 用户需要在弹出的窗口中手动选择水印的ROI,按下空格键或回车键确认选择。
  2. detect_watermark_adaptive(image, roi)

    • 功能:自适应检测图像中的水印并生成对应的遮罩。
    • 参数:
      • image:输入的图像数据,应为 BGR 格式的图像。
      • roi:水印的ROI坐标和尺寸 (x, y, w, h)。
    • 返回值:
      • 如果成功检测到水印,则返回水印的遮罩图像数据,与原始图像尺寸相同。
      • 如果ROI未选择或出现其他错误,则返回 None。
    • 注意事项:
      • 输入图像应为 BGR 格式的图像数据。
      • ROI参数应为有效的坐标和尺寸,即 (x, y, w, h) 均不应小于等于零。
  3. generate_watermark_mask(image, roi)

    • 功能:生成水印的遮罩。
    • 参数:
      • image:输入的图像数据,应为 BGR 格式的图像。
      • roi:水印的ROI坐标和尺寸 (x, y, w, h)。
    • 返回值:
      • 如果成功生成水印的遮罩,则返回水印的遮罩图像数据,与原始图像尺寸相同。
      • 如果ROI未选择或出现其他错误,则返回 None。
    • 注意事项:
      • 输入图像应为 BGR 格式的图像数据。
      • ROI参数应为有效的坐标和尺寸,即 (x, y, w, h) 均不应小于等于零。
  4. remove_watermark(image_path, output_path)

    • 功能:去除输入图像中的水印。
    • 参数:
      • image_path:输入图像的文件路径。
      • output_path:输出图像的文件路径。
    • 返回值:
      • 如果成功去除水印,则返回处理后的图像数据。
      • 如果未成功去除水印,则返回 None。
    • 注意事项:
      • 输入图像应为存在的图像文件路径。
      • 输出图像的文件路径应为有效的保存路径,且文件夹需提前存在。

三、简单去除图片水印效果案例实现简单步骤

1、编写代码

2、运行效果

1)选择图片水印位置;2、Space 或者 Enter 确认选择区域,后台会自动去除水印,并保存图片

3、具体函数

"""
简单去除图片水印效果1、选择水印的ROI(感兴趣区域)2、自适应检测水印并生成遮罩3、生成水印的遮罩4、应用遮罩去除水印5、保存处理后的图片
"""import cv2
import numpy as npdef select_roi_for_mask(image):"""从图像中选择水印的ROI:param image: 图像数据:return: 水印ROI的坐标和尺寸 (x, y, w, h),如果未选择ROI则返回 None"""if image is None or len(image.shape) != 3:raise ValueError("Input image is invalid or not in BGR format.")instructions = "Select ROI and press SPACE or ENTER"font = cv2.FONT_HERSHEY_SIMPLEXcv2.putText(image, instructions, (10, 30), font, 1, (255, 255, 255), 2, cv2.LINE_AA)r = cv2.selectROI("Select ROI", image)cv2.destroyAllWindows()if r[2] == 0 or r[3] == 0:print("ROI not selected. Watermark removal aborted.")return Nonereturn rdef detect_watermark_adaptive(image, roi):"""自适应检测水印并生成遮罩。:param image: 图像数据:param roi: 水印的ROI坐标和尺寸 (x, y, w, h)。:return: 水印的遮罩图像数据,如果ROI未选择则返回 None"""if roi is None:print("ROI not selected. Watermark removal aborted.")return Noneroi_image = image[roi[1]:roi[1] + roi[3], roi[0]:roi[0] + roi[2]]gray_image = cv2.cvtColor(roi_image, cv2.COLOR_BGR2GRAY)_, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)mask = np.zeros_like(image[:, :, 0], dtype=np.uint8)mask[roi[1]:roi[1] + roi[3], roi[0]:roi[0] + roi[2]] = binary_imagereturn maskdef generate_watermark_mask(image, roi):"""生成水印的遮罩:param image: 图像数据:param roi: 水印的ROI坐标和尺寸 (x, y, w, h):return: 水印的遮罩图像数据,如果ROI未选择则返回 None"""if roi is None:print("ROI not selected. Watermark removal aborted.")return Nonemask = detect_watermark_adaptive(image, roi)kernel = np.ones((5, 5), np.uint8)return cv2.dilate(mask, kernel)def remove_watermark(image_path, output_path):"""去除图片中的水印:param image_path: 输入图像路径:param output_path: 输出图像路径:return: 处理后的图片"""# 读取图像image = cv2.imread(image_path)# 拷贝一份用来框选位置image_toSelect = image.copy()# 选择水印的ROIroi = select_roi_for_mask(image_toSelect)# 生成水印遮罩watermark_mask = generate_watermark_mask(image, roi)# 如果没有选择ROI,则不进行处理if roi is None or watermark_mask is None:return# 应用遮罩去除水印result_image = cv2.inpaint(image, watermark_mask, 3, cv2.INPAINT_NS)# 保存结果cv2.imwrite(output_path, result_image)print("Successfully removed watermark and saved result.")return result_imageif __name__ == "__main__":input_image_path = "Images/DogFace_Watermark.jpg"output_image_path = "Images/DogFace_Watermark_ToRemove.jpg"remove_watermark(input_image_path, output_image_path)

四、注意事项

  1. 选择合适的ROI

    • 用户应尽量选择完整覆盖水印的区域,以确保水印去除效果。
    • 选择的ROI区域应该尽量准确、完整,以保证水印检测和去除的准确性。
  2. 水印去除效果

    • 选择合适的水印检测方法和参数,以确保水印区域的准确检测和去除。
    • 对于复杂的水印或者背景,可能需要尝试不同的参数和方法来获取更好的去除效果。
  3. 处理过程中的异常情况

    • 对于未成功选择ROI的情况,应输出相应的提示信息并终止水印去除操作。
    • 在处理过程中,应对可能出现的异常情况进行捕获和处理,确保程序的稳定性和可靠性。

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

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

相关文章

神经网络压缩图像

简介 典型的压缩管道由四个组件组成: 编码:输入图像 x x x通过编码器函数 ε \varepsilon ε,将其转换为潜在表示 z z z。 量化:截断 z z z以丢弃一些不重要的信息 熵编码:使用某种形式的熵编码(例如&…

盲人安全导航技巧:科技赋能让出行更自如

作为一名资深记者,长期关注并报道无障碍领域的发展动态。今日,我将聚焦盲人安全导航技巧,探讨这一主题下科技如何赋能视障人士实现更为安全、独立的出行。一款融合了实时避障、拍照识别物体及场景功能的盲人出行辅助应用叫做蝙蝠避障&#xf…

Java中Session的实现

在Java中,Session是一种用于在Web应用程序中跟踪用户状态的机制。它允许服务器在不同的HTTP请求之间存储和检索特定于用户的信息。Session是建立在HTTP协议之上的,它通过在服务器和客户端之间传递一个唯一的标识符来跟踪用户。 下面是对Java中的Session的…

4G/5G布控球/移动执法仪/智能单兵电力巡检远程视频智能监控方案

一、背景与需求 随着科技的不断进步,视频监控技术已成为电力行业不可或缺的一环。电力行业的巡检及建设工作,因施工现场在人迹罕见的野外或山区,地形复杂多变,安全更是重中之重,现场工作的视频图像需实时传回监管中心…

全量知识系统 程序详细设计之 “组织”与“分析”(QA SmartChat)

Q1. 今天我们聊聊全量知识系统(“全知系统”)中的“组织”与“分析” 全知系统是指一个包含所有可能知识和信息的系统,它具有对所有领域的知识的理解和洞察力。在这样一个系统中,组织和分析是非常重要的环节,可以帮助…

【读论文】【泛读】三篇生成式自动驾驶场景生成: Bevstreet, DisCoScene, BerfScene

文章目录 1. Street-View Image Generation from a Bird’s-Eye View Layout1.1 Problem introduction1.2 Why1.3 How1.4 My takeaway 2. DisCoScene: Spatially Disentangled Generative Radiance Fields for Controllable 3D-aware Scene Synthesis2.1 What2.2 Why2.3 How2.4…

LabVIEW变速箱自动测试系统

LabVIEW变速箱自动测试系统 在农业生产中,采棉机作为重要的农用机械,其高效稳定的运行对提高采棉效率具有重要意义。然而,传统的采棉机变速箱测试方法存在测试效率低、成本高、对设备可能产生损害等问题。为了解决这些问题,开发了…

HTTP协议安全传输教程

HTTP协议有多个版本,包括但不限于HTTP/0.9、HTTP/1.0、HTTP/1.1、HTTP/2和HTTP/3。这些版本各自具有不同的特点和改进,以适应网络技术的发展和满足不同的需求。例如,HTTP/1.0使用文本格式传输数据,简单易用且兼容性好,…

C++11 Thead线程和线程池

参考资料&#xff1a; 2、5.lock_guard 与 std::unique_lock-陈子青的编程学习课堂 (seestudy.cn) 3、C11 多线程编程-小白零基础到手撕线程池_哔哩哔哩_bilibili 一、 C11 Thead线程库的基本使用 # include <thread> std::thread t(function_name, args...); // 线…

十大排序——11.十大排序的比较汇总及Java中自带的排序算法

这篇文章对排序算法进行一个汇总比较&#xff01; 目录 0.十大排序汇总 0.1概述 0.2比较和非比较的区别 0.3基本术语 0.4排序算法的复杂度及稳定性 1.冒泡排序 算法简介 动图演示 代码演示 应用场景 算法分析 2.快速排序 算法简介 动图演示 代码演示 应用场景…

java 溯本求源之基础(十五)之Monitoring--jps

目录 1.jps命令概述 2.基本用法 2.1常用选项 3.应用场景 4.注意事项 5.结语 Java开发与运维过程中&#xff0c;对于Java虚拟机&#xff08;JVM&#xff09;的监控与管理至关重要。在众多JVM工具中&#xff0c;jps命令作为一种监控工具&#xff0c;为开发者提供了一种快捷…

Linux LVM与磁盘配额

目录 一.LVM概述 LVM LVM机制的基本概念 PV&#xff08;Physical Volume&#xff0c;物理卷&#xff09; VG&#xff08;Volume Group&#xff0c;卷组&#xff09; LV&#xff08;Logical Volume&#xff0c;逻辑卷&#xff09; 二.LVM 的管理命令 三.创建并使用LVM …

04-12 周五基于VS code + Python实现CSDN发布文章的自动生成

简介 之前曾经说过&#xff0c;在撰写文章之后&#xff0c;需要&#xff0c;同样需要将外链的图像转换为的形式&#xff0c;因此&#xff0c;可以参考 04-12 周五 基于VS Code Python 实现单词的自动提取 配置步骤 配置task 在vscode的命令面板configure task。配置如下的任…

Qt-控件篇

QPushbutton 1、设置按钮文本 pushButton->setText("按钮"); 2、获取按钮文本 pushButton->text(); 3、设置按钮的大小为特定值&#xff08;宽度和高度&#xff09; pushButton->setFixedSize(width,height); 4、设置按钮悬停时的工具提示文本。 pushButto…

数据结构-图

图的定义:图&#xff08;Graph&#xff09;是由顶点&#xff08;Vertex&#xff09;和边&#xff08;Edge&#xff09;组成的数学结构具体概念见图的论述.图的存储 邻接矩阵:图的邻接矩阵是一种用于表示图的存储结构&#xff0c;其中矩阵的行数和列数都对应于图的顶点&#xff…

UbuntuServer22.04安装docker

通过ubuntuserver安装docker是搭建开发环境最便捷的方式之一。下面介绍一下再ubuntu22.04上如何安装docker。相关内容参考官网链接&#xff1a;Install Docker Engine on Ubuntu 根据官网推荐&#xff0c;利用apt命令的方式安装&#xff0c;首先需要设置docker仓库&#xff0c…

【Android AMS】startActivity流程分析

文章目录 AMSActivityStackstartActivity流程startActivityMayWaitstartActivityUncheckedLocked startActivityLocked(ActivityRecord r, boolean newTask, boolean doResume, boolean keepCurTransition)resumeTopActivityLocked 参考 AMS是个用于管理Activity和其它组件运行…

贴片滚珠振动开关 / 振动传感器的用法

就是这种小东西&#xff1a; 上面的截图来自&#xff1a;https://item.szlcsc.com/3600130.html 以前写过一篇介绍这种东西内部的结构原理&#xff1a;贴片微型滚珠振动开关的结构原理。就是有个小滚珠会接通开关两边的电极&#xff0c;振动时滚珠会在内部蹦跳&#xff0c;开关…

手把手教你设计报表,轻松做出一份美观又实用的报表

你是不是在看着自己的呆板、没有特色的报表而深感苦恼&#xff0c;但同事却可以使用同样的数据制作并且展现出多样化的丰富美观的报表。要知道&#xff0c;除了要达成数据的准确度&#xff0c;基本的数据分析维度需求之外&#xff0c;报表的美观程度也有众多的隐藏“福利”与好…

JAVA基础相关知识点(一)

文章目录 static关键字代码块静态代码块实例代码块 单例模式设计继承权限修饰符方法重写子类构造器的特点this调用兄弟构造器多态final抽象类&#xff08;特殊的父类&#xff09;接口内部类成员内部类静态内部类局部内部类匿名内部类(重点,用处较多) 枚举类包装类泛型泛型类泛型…