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.rhkb.cn/news/311769.html

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

相关文章

IP协议如何进行地址管理?

如今,IP协议有两个版本,分别是IPv4和IPv6,IPv4是目前主要应用的版本。IPv4的IP地址是以4个字节的数字来表示的,比如 127.0.0.1。因此,IPv4所能表示IP地址的个数是2^32次方,也就是42亿多个,看起来…

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别

Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 目录 Python 基于 OpenCV 视觉图像处理实战 之 OpenCV 简单人脸检测/识别实战案例 之十二 简单人脸识别 一、简单介绍 二、简单人脸识别实现原理 三、简单人脸识别案例实现简…

Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView,Kotlin(a)

Android GridLayoutManager Glide批量加载Bitmap绘制Canvas画在RecyclerView&#xff0c;Kotlin&#xff08;a&#xff09; <uses-permission android:name"android.permission.READ_EXTERNAL_STORAGE" /><uses-permission android:name"android.permi…

IDEA: Unable to resolve table ‘xxx‘

描述&#xff1a; 在 IDEA 连接到数据库后&#xff0c;SQL 语句提示 Unable to resolve table 表名&#xff0c;且其它字段也飘红报错。 解决&#xff1a; 右键点击数据库&#xff0c;选择 Tools -> Manage Shown Schemas... 勾选你所使用的数据库即可&#xff1a; 1、2、3…

FreeRTOS时间管理

FreeRTOS时间管理 主要要了解延时函数&#xff1a; 相对延时&#xff1a;指每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束。 绝对延时&#xff1a;指将整个任务的运行周期看成一个整体&#xff0c;适用于需要按照一定频率运行的任务。 函数 vTa…

软件杯 深度学习图像修复算法 - opencv python 机器视觉

文章目录 0 前言2 什么是图像内容填充修复3 原理分析3.1 第一步&#xff1a;将图像理解为一个概率分布的样本3.2 补全图像 3.3 快速生成假图像3.4 生成对抗网络(Generative Adversarial Net, GAN) 的架构3.5 使用G(z)生成伪图像 4 在Tensorflow上构建DCGANs最后 0 前言 &#…

vagrant 安装虚拟机,docker, k8s

第一步&#xff1a;安装虚拟机 1、安装 vagrant 本机是 mac, 但是这一步不影响&#xff0c;找对应操作系统的安装方式就行了。 vagrant 下载地址 brew install vagrant 2、下载 VirtualBox 虚拟机 VirtualBox 下载地址 找到对应系统下载&#xff0c;安装就可以。 尽量把…

Web3D智慧医院平台(HTML5+Threejs)

智慧医院的建设将借助物联网、云计算、大数据、数字孪生等技术&#xff0c;以轻量化渲染、极简架构、三维可视化“一张屏”的形式&#xff0c;让医院各大子系统管理既独立又链接&#xff0c;数据相互融合及联动。 建设医院物联网应用的目标对象&#xff08;人、物&#xff09;都…

移动硬盘盒支持PD充电:优势解析与实际应用探讨

随着科技的飞速发展&#xff0c;数据存储和传输的需求日益增长&#xff0c;移动硬盘盒作为便携式存储设备的重要载体&#xff0c;其功能和性能也在不断提升。近年来&#xff0c;越来越多的移动硬盘盒开始支持PD&#xff08;Power Delivery&#xff09;充电技术&#xff0c;这一…

QT串口助手

QT应用程序打包教程&#xff08;超简单&#xff09;&#xff1a;QT如何打包生成独立可执行.exe文件 .cpp文件&#xff1a; // 这里包含所需要的头文件mainwindow.h和ui_mainwindow.h以及Qt提供的QMessageBox和QTextStream类 #include "mainwindow.h" #include &qu…

【Image captioning】论文阅读九—Self-Distillation for Few-Shot Image Captioning_2022

摘要 大规模图像字幕数据集的开发成本高昂,而大量未配对的图像和文本语料库可能有助于减少手动注释的工作。在本文中,我们研究了只需要少量带注释的图像标题对的少样本图像标题问题。我们提出了一种基于集成的自蒸馏方法,允许使用不成对的图像和字幕来训练图像字幕模型。该…

【HCIP】OSPF的高级特性

OSPF的高级特性1 --- 不规则区域 一、OSPF不规则区域类型 产生原因&#xff1a;区域划分不合理&#xff0c;导致的问题 1、非骨干区域无法和骨干区域保持连通 2、骨干区域被分割 造成后果&#xff1a;非骨干区域没和骨干区域相连&#xff0c;导致ABR将不会帮忙转发区域间的路由…

使用 code-server 搭建在线的 VS Code 编辑器

文章目录 前言安装体验后记 前言 VS Code 是一个非常流行的代码编辑器&#xff0c;安装各种拓展下也可以当作全功能的IDE使用。VS Code本身是基于Web方案构建的&#xff0c;完全可以搭建服务器&#xff0c;然后通过浏览器访问。事实上官方就是这么设计的。现在打开任何一个Git…

mp3转m4a怎么转?4种方法无损转换音频~

M4A文件格式&#xff0c;或称MPEG-4 Audio&#xff0c;崭露头角于音频时代。其诞生旨在提供更高保真度和更高效的音频压缩&#xff0c;为多媒体应用和苹果设备赋能。 M4A格式与MP3格式的优缺点对比 M4A与MP4格式密不可分&#xff0c;均属于MPEG-4标准。相较MP3&#xff0c;M4A…

“中医显示器”是人体健康监测器

随着科技的进步&#xff0c;现代医学设备已经深入到了人们的日常生活中。然而&#xff0c;在这个过程中&#xff0c;我们不应忘记我们的医学根源&#xff0c;中医。我们将中医的望、闻、问、切四诊与现代科技相结合&#xff0c;通过一系列的传感器和算法将人体的生理状态以数字…

通过Maven导入本地jar包

1.创建lib文件夹&#xff0c;把jar包放到文件夹里面 2.在pom里导入依赖 导入完成

滤波器笔记(杂乱)

线性相位是时间平移&#xff0c;相位不失真 零、基础知识 1、用相量表示正弦量 https://zhuanlan.zhihu.com/p/345546880 https://www.zhihu.com/question/347763932/answer/1103938667 A s i n ( ω t θ ) ⇔ A e j θ ⇔ A ∠ θ Asin(\omega t\theta) {\Leftrightarrow…

VMware 虚拟机中的 Ubuntu 16.04 设置 USB 连接

VMware 虚拟机中的 Ubuntu 16.04 设置 USB 连接 1. VMware USB Arbitration Service2. 可移动设备 USB 口连接主机3. 虚拟机 -> 可移动设备 -> 连接 (断开与主机的连接)4. 状态栏 -> 断开连接 (连接主机)References 1. VMware USB Arbitration Service 计算机 -> …

lv_micropython for ESP32-S2/S3/C3

一、更新文件 lv_binding_micropython:GitHub - kdschlosser/lv_binding_micropython at esp32-s-c-h_support 下载lv_binding_micropython分支&#xff1a; git clone -b esp32-s-c-h_support https://github.com/kdschlosser/lv_binding_micropython.git 替换文件&#x…

NodeJS特点

NodeJS特点 web服务器的主要特点是&#xff1a;事件驱动&#xff0c;非阻塞I/O&#xff0c;单线程&#xff0c;跨平台自身非常简单&#xff0c;通过通信协议来组织许多node&#xff0c;通过拓展来达成构建大型网络应用的目的。每一个node进程都构成这个网络的一个节点适用于io…