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

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

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

相关文章

笔记本电脑没有麦克风,声音无法找到输入设备

新买的电脑没有扬声器&#xff0c;电脑声音没有输入设备&#xff0c;在开腾讯会议的时候才发现竟然有这个问题。 网上找原因&#xff0c;哎&#xff0c;找了一大堆每一个靠谱的 这让我想起来上次电脑没有热键的问题&#xff0c;所有问题的终极解决方案&#xff0c;都在源头那里…

csa从初阶到大牛(训练题1)

使用普通账户新建如下结构的2个目录&#xff1a; ~/t1/t2/t3/t4&#xff0c;~/m1/m2/m3/m4,并显示t1目录的详细信息&#xff0c;将/etc/passwd文件拷贝到~/t1/t2/t3目录下面&#xff0c;将~/t1/下面的内容拷贝到~/m1/m2/m/3/m4目录下面,最后删除~/t1/t2/t3下面的目录 # 创建目…

C语言内存函数的使用、剖析及模拟实现

目录 一、内存拷贝函数——memcpy 1.函数声明&#xff1a; 注意&#xff1a; 2.函数使用用例&#xff1a; 3.memcpy函数的模拟实现&#xff1a; 二、内存拷贝函数2——memmove 1.函数声明&#xff1a; 2.memmove函数的模拟实现 三、内存比较函数——memcmp 1.函数声明…

ros2发布者节点

没有书看啊&#xff0c;就来看看这个代码吧&#xff1a; 首先&#xff1a;第一个函数&#xff1a;init&#xff0c;通过f12可以知道这个函数共有4个变量&#xff0c;前面2个就这么填&#xff0c;后面2个有默认值&#xff0c;不用管&#xff0c;所以一般这么写就好了。 spin函…

【数据分享】海洋热含量Global Ocean Heat Content CDR】

【数据分享】海洋热含量Global Ocean Heat Content CDR 海洋与大气科学 海洋热含量数据可以不用计算了&#xff0c;直接下载使用&#xff01; 海洋热含量气候数据记录&#xff08;CDR&#xff09;是一组 1955 年至今的海洋热含量异常&#xff08;OHCA&#xff09;时间序列&…

ChatGLM OPENCL 和 CUDA 哪个 GPU 加速计算框架更快

OpenCL和CUDA都是强大的GPU加速计算框架,CUDA在与NVIDIA GPU的紧密结合下提供了更高性能,适用于专注于NVIDIA平台开发者;而OpenCL具有跨平台兼容性和多厂商支持的优势,适用于需要在不同硬件平台上进行开发的场景。 在现代计算领域,GPU 加速已经成为一种强大的工具,能够显…

Python 基于人脸识别的实验室智能门禁系统的设计,附可视化界面

1 简介 本基于人脸识别的实验室智能门禁系统通过大数据和信息化的技术实现了门禁管理流程的信息化的管理操作。平台的前台页面通过简洁的平台页面设计和功能结构的分区更好的提高用户的使用体验&#xff0c;没有过多的多余的功能&#xff0c;把所有的功能操作都整合在功能操作…

Windows安装Mysql--免安装版

在Windows系统上安装免安装版MySql的步骤 官方下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 将下载好的文件“mysql-5.7.18-winx64”解压缩到C盘的 目录下&#xff1a; 配置环境变量&#xff1a; &#xff08;略&#xff09; 正式安装&#xff0c;添加my.i…

CSDN博客去水印方法

直接在 创作中心->博客 设置这里关了好像就行了&#xff0c;之前方法是找图片链接?后面的一大串字符给去掉。

Excel中的宏、VBA

一、宏是什么&#xff1f; EXCEL MACRO 是一种记录和播放工具&#xff0c;它仅记录您的 Excel 步骤&#xff0c;并且宏将根据需要播放任意多次。 VBA 宏可自动执行重复任务&#xff0c;从而节省了时间。 这是一段可在 Excel 环境中运行的编程代码&#xff0c;但您无需成为编码…

C语言大佬的必杀技---宏的高级用法

C语言大佬的必杀技—宏的高级用法 目录: 字符串化标记的拼接宏的嵌套替换多条语句防止一个文件被重复包含宏和函数的区别 可能大家在学习的时候用得比较少&#xff0c;但是在一些代码量比较大的时候&#xff0c;这样使用&#xff0c;可以大大的提高代码的可读性&#xff0c;…

SpringBoot轻松实现项目集成Knife4j接口文档

Knife4j 介绍 Knife4j 官网 Knife4j是一款基于Swagger生成API文档的增强工具&#xff0c;它简化了开发者构建和管理RESTful API文档的过程。通过自动扫描项目中的接口信息&#xff0c;Knife4j能够生成详细、易读的API文档&#xff0c;无需手动编写和维护。它提供交互式的接口调…