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.hqwc.cn/news/625469.html

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

相关文章

MySQL与Redis缓存一致性的实现与挑战

缓存是提高应用性能的重要手段之一,而 MySQL 和 Redis 是两种常用的数据存储和缓存技术。在许多应用中,常常将 Redis 用作缓存层,以加速对数据的访问。然而,在使用 MySQL 和 Redis 组合时,保持缓存与数据库之间的一致性…

RAID 磁盘阵列及RAID配置实战

目录 一.RAID磁盘阵列介绍 二.常用的RAID磁盘阵列的介绍 1.RAID 0 (条带化存储) 2.RAID 1(镜像存储) 3.RAID 5 4.RAID 6 5.RAID 10(先做镜像,再做条带) 6.RAID 01 (先做条带…

聊聊最近两星期的学习吧!

今天是4月14号。 自从我3月份回到学校之后,我每天都有记录自己的学习时长。今天晚上,我在复盘我自己学习时长的时候,我发现,在整个四月份,我平均每天的有效学习时长只有6h,而且到今天为止,整个四…

vue3 源码解析(7)— diff 算法源码的实现

前言 vue3 采用的 diff 算法名为快速 diff 算法,整个 diff 的过程分为以下5个阶段完成。 处理前置节点处理后置节点处理仅有新增节点处理仅有删除节点处理其他情况(新增 / 卸载 / 移动) 这里我们先定义新旧两个节点列表,接下来…

光距感-接近传感芯片的工作原理以及应用领域

接近光传感芯片是一种可以检测物体距离和位置的传感器。它的工作原理基于光电效应。当某个物体与接近光传感器靠近时,传感器会发出一束红外线。随着物体越来越靠近,被反射回来的光线会变强,被接近光传感器捕获。传感器可以测量时间&#xff0…

PDF文档电子签名怎么做?

如何确保电子文档的签署具有公信力和法律效力,防止伪造和假冒签名等问题,是电子文档无纸化应用面临的重要挑战。本文将详细介绍PDF文档电子签名的概念、重要性、实施步骤以及相关的法律背景,帮助用户理解并有效应用PDF文档电子签名技术。 1.…

树和二叉树(一)

一、树 非线性数据结构,在实际场景中,存在一对多,多对多的情况。 树( tree)是n (n>0)个节点的有限集。当n0时,称为空树。 在任意一个非空树中,有如下特点。 1.有且仅有一个特定的称为根的节点…

西晋从建立到灭亡51年历史

西晋的建立,也标志着三国时期的结束,也开启了中国历史上的一个新时代。下面让我们来揭开西晋从建立到灭亡51年的历史。 1、高平陵事变 曹丕去世后,魏明帝曹睿继位,但曹睿却英年早逝,幼子曹芳继位。 司马懿受曹睿托孤…

全球首个AI女团Sorai.ai出道:定档4月19日北京电影节出道首秀

✨✨ 欢迎大家来访Srlua的博文(づ ̄3 ̄)づ╭❤~✨✨ 🌟🌟 欢迎各位亲爱的读者,感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢,在这里我会分享我的知识和经验。&am…

关于 Windows10 计算机丢失 MSVCP120.dll 的解决方法

今天学长跟平时一样打开电脑开始发布文章需要用到Adobe Photoshop CC 2018的时候居然给我来个Photoshop.exe-系统错误、无法启动此程序,因为计算机中丢失MSVCP120.dll 尝试重新安装该程序以解决此问题,安装上面的说明重新安装了我的Photoshop CC 打开还是…

转换为elementUI提示方法为uni-app的showToast提示

// 转换为elementUI提示方法为uni-app的showToast提示---------------------------------------- // 一般提示 Vue.prototype.$message function(title) {title && uni.showToast({icon: none,title}); }; // 成功提示 Vue.prototype.$message.success (title) > …

泰迪智能科技携手洛阳理工学院共建“泰迪·洛阳理工数据智能工作室”

为深化校企合作,实现应用型人才培养目标,4月11日,洛阳理工学院携手广东泰迪智能科技股份有限公司举行“泰迪洛阳理工数据智能工作室”揭牌仪式暨工作室成员动员会在洛阳理工学院举行。洛阳理工学院计算机与信息工程学院院长石念峰、副院长李明…