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 np


def 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_SIMPLEX
    cv2.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 None

    return r


def 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 None

    roi_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_image

    return mask


def 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 None

    mask = 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()

    # 选择水印的ROI
    roi = 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_image


if __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的情况,应输出相应的提示信息并终止水印去除操作。
    • 在处理过程中,应对可能出现的异常情况进行捕获和处理,确保程序的稳定性和可靠性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Java入门基础知识第八课(数组)——冒泡排序、Arrays工具类

前面二白讲了关于数组的概念、语法以及简单的输入输出,实际上关于数组的知识还有很多,接下来咱们讲一下冒泡排序以及一些常用的Arrays工具类,需要记忆的知识很多,而且容易混淆。 一、冒泡排序 简介(原理)…

基于SpringBoot的“银行OA系统的设计与实现”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“银行OA系统的设计与实现”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 用户登录界面 管理员主界面 员工基本档…

知道做到 一篇总结学习方法的笔记

元数据 [!abstract] 知道做到:跃迁式学习 书名: 知道做到:跃迁式学习作者: 彼得•霍林斯简介: 学习是改善你的生活环境、成为你想成为的人的关键。科学的方法能加速学习进程,让你事半功倍。技能、信息和能力…

openkylin系统通过网线连接ubuntukylin系统上网攻略

openkylin系统通过网线连接ubuntukylin系统上网攻略 主机1:x64 amd ,系统:ubuntukylin 22.04 ,状态:通过wifi连接热点进行上网,并共享网络。 主机2:x64 intel ,系统:ope…

5.x 版本 CallKit SDK 无法弹起通话界面

5.x 版本 CallKit SDK 作为接听方在前台的情况下无法弹起通话界面,作为拨打方能正常弹起通话界面 分析(根因分析、需求分析) CallKit SDK 初始化依赖于 IMKit SDK 初始化,如果您使用 IMLib SDK 的方法初始化的话,会导…

告别百年激进笔记

系列文章目录 八次危机笔记 告别百年激进笔记 文章目录 系列文章目录前言导图第一部分 资本全球化的宏大叙事第一节 人类创造的两个异化物第二节 全球资本化与制度性致贫第三节 国家竞争的“微笑曲线”第四节 欧债危机实属政治危机第五节 日本研究中的另类思考第六节 从…

流程图的新语法-mermaid的快速使用--推荐

chatgpt或者现在的大数据采用的流程图给出的代码如下: graph TD;A[接收客户请求] --> B[问题分类];B --> C[技术支持];B --> D[维修服务];C --> E[远程解决];C --> F[现场支持];D --> G[维修完成];G --> H[服务反馈];style A fill:#f9f,strok…

【数据结构与算法】贪心算法及例题

目录 贪心算法例题一:找零问题例题二:走廊搬运物品最优方案问题输入样例例题三:贪心自助餐 贪心算法 贪心算法是一种在每一步选择中都采取当前状态下最优的选择,以期望最终达到全局最优解的算法。它的核心思想是每次都选择当前最…

即插即用模块详解SCConv:用于特征冗余的空间和通道重构卷积

目录 一、摘要 二、创新点说明 2.1 Methodology 2.2SRU for Spatial Redundancy​编辑 2.3CRU for Channel Redundancy 三、实验 3.1基于CIFAR的图像分类 3.2基于ImageNet的图像分类 3.3对象检测 四、代码详解 五、总结 论文:https://openaccess.thecvf.c…

kafka的概念以及Zookeeper集群 + Kafka集群 +elfk集群

目录 zookeeper同步过程 分布式通知和协调 zookeeper同步过程 分布式通知和协调 准备 3 台服务器做 Zookeeper 集群 192.168.68.5 192.168.68.6 192.168.68.7 安装前准备 //关闭防火墙 systemctl stop firewalld systemctl disable firewalld setenforce 0 node1服务器&a…

Linux进阶篇:性能监控工具:socket 统计信息

Linux性能监控工具:socket 统计信息 1 ss命令介绍 ss 是 Socket Statistics 的缩写。ss 命令可以用来获取 socket 统计信息,它显示的内容和 netstat 类似。但 ss 的优势在于它能够显示更多更详细的有关 TCP 和连接状态的信息,而且比 netsta…

ssm052游戏攻略网站的设计与实现+vue

游戏攻略网站设计与实现 摘 要 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本游戏攻略网站就是在这样的大环境下诞生,其可以帮助管理者在短时间内处…

使用avx2 指令集加速向量算法运算

使用cpu-z 查看cpu指令集 2 向量加&#xff0c;乘法&#xff0c;除法 我们使用向量加&#xff0c;为什么函数是0 到 8 的计算&#xff0c;因为avx2 寄存器为256位&#xff0c;同时设置启动增强指令集 #include <immintrin.h> // 引入包含AVX2指令集的头文件void vecto…

2024认证杯数学建模A题保暖纤维保暖能力原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了认证杯数学中国数学建模网络挑战赛第一阶段A题目保暖纤维的保暖能力完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品…

【Conda基础命令】使用conda创建、查看、删除虚拟环境及可能的报错处理

文章目录 前言&#xff08;1&#xff09; 在默认路径下创建一个新的虚拟环境&#xff08;2&#xff09; 查看已有的虚拟环境&#xff08;3&#xff09; 删除已有的虚拟环境&#xff08;谨慎操作&#xff09;&#xff08;4&#xff09;激活虚拟环境&#xff08;5&#xff09;退出…

社区养老服务系统|基于springboot社区养老服务系统设计与实现(源码+数据库+文档)

社区养老服务系统目录 目录 基于springboot社区养老服务系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员部分功能 &#xff08;1&#xff09; 用户管理 &#xff08;2&#xff09;服务种类管理 &#xff08;3&#xff09;社区服务管理 &#xff08…

STM32F103ZE-中断

文章目录 122.12.22.32.42.52.62.6.12.6.2 33.13.23.34.14.3 56788.18.2 NVIC 管理所有中断EXTI 外部中断事件控制器 针对外部 可以看成NVIC 下属 1 中断和 中止&#xff08;不回去了&#xff09;不一样 搁一段时间就如果不用中断 用while&#xff08;&#xff09; 可能夹半天…

中伟视界:智慧矿山智能化预警平台功能详解

矿山智能预警平台是一种高度集成化的安全监控系统&#xff0c;它能够提供实时的监控和报警功能&#xff0c;帮助企业和机构有效预防和响应潜在的安全威胁。以下是矿山智能预警平台的一些关键特性介绍&#xff1a; 报警短视频生成&#xff1a; 平台能够在检测到报警时自动生成短…

记录一次内存溢出

1、查看catalina相关日志&#xff0c;确定关键字相关行号 文件&#xff1a;catalina.out命令1&#xff1a;cat -n catalina.out |grep -a OutOfMemoryError与内存溢出相关的如上&#xff0c;每一个行号其实都对应到具体时间点。可以发现&#xff0c;这个范围相符合&#xff1…

Harbor安装手册

安装Docker yum install -y yum-utils device-mapper-persistent-data lvm2 yum-config-manager \ --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo sed -i -e /mirrors.cloud.aliyuncs.com/d -e /mirrors.aliyuncs.com/d \ /etc/yum.repos.d/…