当前位置: 首页 > news >正文

Opencv-python去图标与水印方案实践

RGB色彩模式是工业界的一种颜色标准,是通过对红(R)、绿(G)、蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红、绿、蓝三个通道的颜色,这个标准几乎包括了人类视力所能感知的所有颜色,是运用最广的颜色系统之一。
在这里插入图片描述

RGB 模式的彩色图像在读入 OpenCV 内进行处理时,会按照行方向依次读取该 RGB 图像的 B 通道、G 通道、R 通道的像素点,并将像素点以行为单位存储在 ndarray 的列中。例如,有一幅大小为 R 行×C 列的原始 RGB 图像,其在 OpenCV 内以 BGR 模式的三维数组形式存储。
在这里插入图片描述

import numpy as np
import matplotlib.pyplot as plt
import cv2
img=cv2.imread('img\GDP.JPG')h,w,l=img.shape
img.shape
	(347, 496, 3)

注:数据存储格式,每个单元数据范围在0~255,RGB中(255,255,255)为白色,(0,0,0)为黑色,在二位平面图上,原点(0,0)在图的左下角。

1. 按水印颜色范围滤除水印或按曲线颜色提取图形

按水印颜色范围滤除水印方案,主要是针对简单、水印背景颜色单一,例如上图中的灰色。使用windows系统自带工具“图画”,获取RGB颜色值。
在这里插入图片描述

如图中,选中1号位置取色器,放置到水印图标上2号位置,通过3号位置的颜色编辑器获取颜色数值。(默认灰色为:128,128,128)

R=242,G=242,B=244

删除灰色,以及临近灰色,同时,也可能把临近的灰色坐标也删除,删除就删除了吧,下一篇再说用处。

import numpy as np
import matplotlib.pyplot as plt
import cv2
img=cv2.imread('img\GDP.JPG')h,w,l=img.shape
img.shapefor j in range(h):for k in range(w):# 删除灰色水印if img[j][k][0] > 128 and img[j][k][1] > 128 and img[j][k][2] > 128 :img[j][k][0] = 255img[j][k][1] = 255 img[j][k][2] = 255# 删除标题if img[j][k][0] < 150 and img[j][k][1] < 150 and img[j][k][2] < 150 :img[j][k][0] = 255img[j][k][1] = 255 img[j][k][2] = 255            plt.imshow(img,cmap=plt.cm.gray)cv2.imshow("Image", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

对比Open CV输出,BGR颜色发生了变化。😊
在这里插入图片描述
对于背景复杂的情况,如下图所示,采用直接提取曲线的方案。
在这里插入图片描述

for j in range(h):for k in range(w):if img[j][k][0] <140 or img[j][k][0] >170 or img[j][k][1] <195 or img[j][k][1] >215 or img[j][k][2] <48 or img[j][k][2] >129:img[j][k][0] = 255img[j][k][1] = 255 img[j][k][2] = 255

在这里插入图片描述

2. Open CV图像修复(去除水印)

2.1. 图片抠图去水印的思路

  • 准备一张有水印的图片
    在这里插入图片描述
    此图命名为heart.JPG。

  • 用绘画工具在有水印的图片上框出水印位置
    在这里插入图片描述
    此图命名为heart_mask.jpg,标注水印位置,实际应用中,不带外边框,就是个白色矩形,可参见后续灰色图像效果。

  • 利用findContours函数查找水印所在的位置

  • 初始化一个与原图像大小相同的0矩阵

  • 将获取到的水印图片定位到初始化的矩阵中

  • 利用inpaint函数进行水印的去除

2.2. 实践案例及代码

import cv2
import numpy as np# 读取模板图像
image = cv2.imread('img\heart_mask.jpg')
image_gray = cv2.cvtColor(image, cv2.COLOR_BGRA2GRAY)  # 转换成灰度图col,row,l = image.shape
print(col,row)# 初始化一个与原图像等同的矩阵
temp = np.zeros((col,row))
temp = temp.astype(np.uint8)cv2.imshow('gary', image_gray)
cv2.waitKey(0)# 查找图像中的矩阵
ret,thresh = cv2.threshold(image_gray, 250, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(thresh, 2, 1)
cnt=contours[0]
x, y, w, h = cv2.boundingRect(cnt) 
print(x, y, w, h)
# 由于背景太简单,识别矩形失败!替换为手工标注
x = 536
y = 240
w = 91
h = 94
img = cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)  cv2.imshow('gary', img)
cv2.waitKey(0)# 显示水印图片
image2 = cv2.imread("img\heart.JPG")
roi = image2[y:y+h,x:x+w,0:3]
roi = cv2.cvtColor(roi, cv2.COLOR_BGRA2GRAY)
ret,roi = cv2.threshold(roi, 80, 90, cv2.THRESH_BINARY)  # 参数可调节,因图片的像素而异
roi = cv2.morphologyEx(roi,cv2.MORPH_ELLIPSE,(5,5)) # 将水印图片赋值给初始化的矩阵图片
roi2 = temp[y:y+h,x:x+w]
roi3 = cv2.add(roi, roi2)
temp[y:y+h,x:x+w] = roi3dst = cv2.inpaint(image2, temp, 30, cv2.INPAINT_NS) # 使用INPAINT_TELEA算法进行修复
cv2.imshow('TELEA', dst)
cv2.waitKey(0)

在这里插入图片描述

2.3. 关键图像处理技术

2.3.1. 图像阈值处理cv2.threshold

阈值的作用是根据设定的值处理图像的灰度值,比如灰度大于某个数值像素点保留。通过阈值以及有关算法可以实现从图像中抓取特定的图形,比如去除背景等。

cv2中单阈值函数:cv2.threshold(src, thresh, maxval, type[, dst]),返回值为retval, dst

其中:

  • src是灰度图像
  • thresh是起始阈值
  • maxval是最大值
  • type是定义如何处理数据与阈值的关系。有以下几种:
选项像素值>thresh其他情况
cv2.THRESH_BINARYmaxval0
cv2.THRESH_BINARY_INV0maxval
cv2.THRESH_TRUNCthresh当前灰度值
cv2.THRESH_TOZERO当前灰度值0
cv2.THRESH_TOZERO_INV 0当前灰度值

另外的取值为:
cv2.THRESH_OTSU使用最小二乘法处理像素点,而cv2.THRESH_TRIANGLE使用三角算法处理像素点。一般情况下,cv2.THRESH_OTSU适合双峰图。cv2.THRESH_TRIANGLE适合单峰图。单峰图或者双峰图指的是灰度直方图。

2.3.2. 形态学操作开闭运算(morphologyEx函数)

开运算基本原理

图像开运算是图像依次经过腐蚀、膨胀处理后的过程。图像被腐蚀后,去除了噪声,但是也压缩了图像;接着对腐蚀过的图像进行膨胀处理,可以去除噪声,并保留原有图像。

开运算实际是先腐蚀运算,再膨胀运算,把看上去把细微连在一起的两块目标分开了。

一般来说,开运算可以使图像的轮廓变得光滑,还能使狭窄的连接断开和消除细毛刺。开运算在过滤噪声的同时并没有对物体的形状、轮廓造成明显的影响,这是一大优势。当只关心物体的位置或者个数时,物体形状的改变不会给任务带来困扰,此时用开运算处理具有处理速度上的优势。

闭运算基本原理

闭运算是开运算的相反操作,先膨胀运算,再腐蚀运算,处理后的图片看上去将两个细微连接的图块连接在一起。

闭运算同样可以使得图像变得光滑,并且能够填平图像中的凹陷(即小孔),弥合小裂缝,而图像中目标的位置和形状可以保持不变。因此在图像去噪中,闭运算也是常用操作。

开运算、闭运算在 OpenCV 中可以使用形态学滤波函数morphologyEx()来进行。函数原型为:cv2.morphologyEx(src, op, kernel)

  • src:输入图像,即源图像,填Mat类的对象即可;
  • op: 表示形态学运算的类型,可以是如下之一的标识符:
    • MORPH_OPEN :开运算(Opening operation);
    • MORPH_CLOSE :闭运算(Closing operation);
    • MORPH_GRADIENT :形态学梯度(Morphological gradient);
    • MORPH_TOPHAT :“顶帽”(“Top hat”);
    • MORPH_BLACKHAT :“黑帽”(“Black hat”);
    • MORPH_ERODE :“腐蚀”;
    • MORPH_DILATE :“膨胀”。
  • kernel:形态学运算的内核。若为NULL时,表示的是默认使用参考点位于中心3 x 3的核。一般使用函数getStructuringEleme
    nt()配合这个参数的使用。getStructuringElement()函数会返回指定形状和尺寸的结构元素(内核矩阵)。

2.3.3. 数字修复算法cv2.inpaint

修复是图像插值。数字修复算法在图像插值,照片恢复,缩放和超分辨率等方面具有广泛的应用。

大多数人会在家里放一些旧的退化照片,上面有一些黑点,一些笔画等。你有没有想过恢复它?我们不能简单地在绘画工具中擦除它们,因为它将简单地用白色结构替换黑色结构,这是没有用的。在这些情况下,使用称为图像修复的技术。基本思路很简单:用邻近的像素替换那些坏标记,使其看起来像是邻居(取自维基百科),考虑下面显示的图像:

库函数:
dst = cv2.inpaint(src,mask, inpaintRadius,flags)

参数是:

  • src:输入8位1通道或3通道图像。
  • inpaintMask:修复掩码,8位1通道图像。非零像素表示需要修复的区域。
  • dst:输出与src具有相同大小和类型的图像。
  • inpaintRadius:算法考虑的每个点的圆形邻域的半径。
  • flags:
    • INPAINT_NS基于Navier-Stokes的方法
    • Alexandru Telea的INPAINT_TELEA方法

3. 第三方开源修复工具Lama Cleaner

Lama Cleaner 是由 SOTA AI 模型提供支持的免费开源图像修复工具。可以从图片中移除任何不需要的物体、缺陷和人,或者擦除并替换(powered by stable diffusion)图片上的任何东西。

详见“python抠图(去水印)开源库lama-cleaner入门应用实践”。

参考:

[1]. 肖永威. python抠图(去水印)开源库lama-cleaner入门应用实践. CSDN博客. 2023.09

[2]. 风华明远. CV2简单阈值函数:cv2.threshold(). CSDN博客. 2020.12

[3]. 奔向理想的星辰大海. 【Python】Python 去除图片水印. CSDN博客. 2023.08

[4]. 小鹏AI. OpenCV 图片去水印(不需要自己做水印模板). CSDN博客. 2020.05

[5]. wp猿. opencv之形态学操作开闭运算(morphologyEx函数). CSDN博客. 2022.01

[6]. mjiansun. 【Python】OpenCV中的cv2.inpaint()函数. CSDN博客. 2021.07

相关文章:

Opencv-python去图标与水印方案实践

RGB色彩模式是工业界的一种颜色标准&#xff0c;是通过对红&#xff08;R&#xff09;、绿&#xff08;G&#xff09;、蓝&#xff08;B&#xff09;三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的&#xff0c;RGB即是代表红、绿、蓝三个通道的颜色&#xff…...

自己写过比较蠢的代码:从失败中学习的经验

文章目录 引言1. 代码没有注释2. 长函数和复杂逻辑3. 不恰当的变量名4. 重复的代码5. 不适当的异常处理6. 硬编码的敏感信息7. 没有单元测试结论 &#x1f389; 自己写过比较蠢的代码&#xff1a;从失败中学习的经验 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1f379;✨博客主页&a…...

C语言 cortex-A7核 点LED灯 (附 汇编实现、使用C语言 循环实现、使用C语言 封装函数实现【重要、常用】)

1 汇编实现 text global _start start: ************** LED1点灯 ---> PE10 **************/ ************** RCC章节初始化 **************/ CC_INIT:1.使能GPIOE组控制器&#xff0c;通过RCC_MP_AHB4ENSETR寄存器设置GPIOE组使能0x50000A28[4] 1ldr r0,0x50000A28 准…...

LABVIEW 实战案例1--温度报警系统

图1 温度报警系统前面板 图2 温度报警系统后面板...

【力扣】292. Nim 游戏

题目描述 你和你的朋友&#xff0c;两个人一起玩 Nim 游戏&#xff1a; 桌子上有一堆石头。你们轮流进行自己的回合&#xff0c; 你作为先手 。每一回合&#xff0c;轮到的人拿掉 1 - 3 块石头。拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数…...

IAP固件升级分几步?(Qt上位机、)

前言 这周一直想做一个IAP固件升级的上位机&#xff0c;然后把升级流程全都搞懂 有纰漏请指出&#xff0c;转载请说明。 学习交流请发邮件 1280253714qq.com IAP原理 IAP的原理我就不多赘述了&#xff0c;这里贴上几位大佬的文章 STM32CubeIDE IAP原理讲解&#xff0c;及U…...

Otter改造 增加springboot模块和HTTP调用功能

环境搭建 & 打包 环境搭建&#xff1a; 进入 $otter_home/lib 目录执行&#xff1a;bash install.sh 打包&#xff1a; 进入$otter_home目录执行&#xff1a;mvn clean install -Dmaven.test.skip -Denvrelease发布包位置&#xff1a;$otter_home/target 项目背景 阿里…...

Vue.js vs React:哪一个更适合你的项目?

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…...

Debian环境下搭建STM32开发环境

1. 安装交叉编译工具&#xff0c;解压gcc-arm-none-eabi-10.3-2021.10-x86_64-linux.tar.bz2&#xff0c;并且把交叉编译环境添加到path路径。 2.安装下载工具驱动和下载工具 # 安装下载工具openocd sudo apt -y install openocd 3.下载测试 sudo openocd -f cmsis-dap.cfg -…...

如何防止商业秘密泄露(洞察眼MIT系统商业机密防泄密解决方案)

在当今的商业环境中&#xff0c;保护公司的商业秘密是至关重要的。商业秘密可能包括独特的业务流程、客户列表、研发成果、市场策略等&#xff0c;这些都是公司的核心竞争力。一旦这些信息被泄露&#xff0c;可能会对公司的生存和发展产生重大影响。本文将探讨如何通过使用洞察…...

题目 1062: 二级C语言-公约公倍

输入两个正整数m和n&#xff0c;求其最大公约数和最小公倍数。样例输入 2 3样例输出 1 6 这题一知半解的&#xff0c; 最小公倍数两数の积/最大公约数&#xff1b; 最大公约数通过迭代法求得(见其下)&#xff0c; 作为a,b两数有一个属为有一个为0为无效数据时 《-----a%b等…...

【Leetcode】148.排序链表

一、题目 1、题目描述 给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例1: 输入:head = [4,2,1,3] 输出:[1,2,3,4]示例2: 输入:head = [-1,5,3,4,0] 输出:[-1,0,3,4,5]示例3: 输入:head = [] 输出:[]提示: 链表中节点的数目在范围 [0, 5 …...

用《斗破苍穹》的视角打开C#多线程开发1(斗帝之路)

Thread.Start() 是的&#xff0c;我就是乌坦城那个斗之气三段的落魄少爷&#xff0c;在我捡到那个色眯眯的老爷爷后&#xff0c;斗气终于开始增长了。在各种软磨硬泡下&#xff0c;我终于学会了我人生中的第一个黄阶斗技——吸掌。 using System.Threading;namespace Framewo…...

图像处理与计算机视觉--第三章-颜色与纹理分析-6问

图像处理与计算机视觉--第三章-颜色与纹理分析-6问 1.哪些因素决定物体颜色的感知? 对于物体颜色的感知&#xff0c;主要取决于以下三个因素: 1.照射到物体表面光波长的分布 2.物体表面如何反射照射光 3.传感器或者视觉细胞的敏感性 除了上述的三个因素之外&#xff0c…...

vue重修002

文章目录 版权声明一 指令修饰符1. 什么是指令修饰符&#xff1f;2. 按键修饰符3. v-model修饰符4. 事件修饰符 二 v-bind对样式控制的增强-操作class1. 语法&#xff1a;2. 对象语法3. 数组语法4. 代码练习 三 京东秒杀-tab栏切换导航高亮四 v-bind对有样式控制的增强-操作sty…...

[PowerQuery] PowerAutoMate 刷新PowerBI 数据

通过PowerBI Automate 进行PowerBI 数据刷新之前,需要有Power Automate 授权或者Power Automate 试用账户,可以通过如下的地址进行申请注册。 https://flow.microsoft.com/zh-cn/ 完成Power Automate 登录之后,选中计划的云端流后创建,图为创建计划的云端流的操作步骤。 …...

C语言中各种接口标准

1.POSIX&#xff08;Portable Operating System Interface&#xff0c;可移植操作系统接口&#xff09;&#xff1a;是一个定义了操作系统接口标准的家族。它旨在提供一致的API&#xff08;Application Programming Interface&#xff0c;应用程序编程接口&#xff09;和环境&a…...

vscode常用插件

koroFileHeader: 设置详情, 文件头自动注释 code runner: 支持多语言编译运行 git lens: git 提交可视化查看工具 Markdown配套软件&#xff1a; Markdown All in One&#xff1a; Markdown文档工具集成Markdown PDF: Markdown文档导出为PDFMarkdown Preview Enhanced: 分屏查…...

代码随想录算法训练营day60|84.柱状图中最大的矩形 |完结撒花~

84.柱状图中最大的矩形 力扣题目链接 给定 n 个非负整数&#xff0c;用来表示柱状图中各个柱子的高度。每个柱子彼此相邻&#xff0c;且宽度为 1 。 求在该柱状图中&#xff0c;能够勾勒出来的矩形的最大面积。 1 < heights.length <10^5 0 < heights[i] < 10^…...

在 android 上使用 adb client

adb tool 分为 adb 和 adbd。 adb 用作 host 使用&#xff0c;包含了client和server&#xff0c;adbd 则作为 device 端&#xff0c;在 android 源码目录下&#xff0c;共用一套源码。但 android 源码下的 adb&#xff0c;不支持把 adb 编译为 android 平台的 adb client。因此…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能

下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能&#xff0c;包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...

转转集团旗下首家二手多品类循环仓店“超级转转”开业

6月9日&#xff0c;国内领先的循环经济企业转转集团旗下首家二手多品类循环仓店“超级转转”正式开业。 转转集团创始人兼CEO黄炜、转转循环时尚发起人朱珠、转转集团COO兼红布林CEO胡伟琨、王府井集团副总裁祝捷等出席了开业剪彩仪式。 据「TMT星球」了解&#xff0c;“超级…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”

2025年#高考 将在近日拉开帷幕&#xff0c;#AI 监考一度冲上热搜。当AI深度融入高考&#xff0c;#时间同步 不再是辅助功能&#xff0c;而是决定AI监考系统成败的“生命线”。 AI亮相2025高考&#xff0c;40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕&#xff0c;江西、…...

云原生玩法三问:构建自定义开发环境

云原生玩法三问&#xff1a;构建自定义开发环境 引言 临时运维一个古董项目&#xff0c;无文档&#xff0c;无环境&#xff0c;无交接人&#xff0c;俗称三无。 运行设备的环境老&#xff0c;本地环境版本高&#xff0c;ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

【学习笔记】erase 删除顺序迭代器后迭代器失效的解决方案

目录 使用 erase 返回值继续迭代使用索引进行遍历 我们知道类似 vector 的顺序迭代器被删除后&#xff0c;迭代器会失效&#xff0c;因为顺序迭代器在内存中是连续存储的&#xff0c;元素删除后&#xff0c;后续元素会前移。 但一些场景中&#xff0c;我们又需要在执行删除操作…...

论文阅读笔记——Muffin: Testing Deep Learning Libraries via Neural Architecture Fuzzing

Muffin 论文 现有方法 CRADLE 和 LEMON&#xff0c;依赖模型推理阶段输出进行差分测试&#xff0c;但在训练阶段是不可行的&#xff0c;因为训练阶段直到最后才有固定输出&#xff0c;中间过程是不断变化的。API 库覆盖低&#xff0c;因为各个 API 都是在各种具体场景下使用。…...