很多时候,我们选择了一张图片,但是图片上有水印,那么如果我们不知道PS,应该如何处理图片呢?这里简单介绍一下opencv的cv2.inpaint的图片修复功能,可以完美匹配PS。
OpenCV提供了两种算法。两者都可以通过同一个函数cv2.inpaint()来访问
图像恢复
opencv图片修复算法
第一种算法基于alexandreu Telea 2004年发表的《基于快速行进法的图像修复技术》。它基于快速移动方法。考虑图像中要修复的区域。算法从区域的边界开始,然后进入区域,逐渐填充边界内的所有内容。它需要在邻近像素周围的小邻域中进行修复。该像素由邻域中所有已知像素的归一化加权和代替。选择权重是一个重要的问题。对于该点附近的那些像素,边界法线附近的像素和边界轮廓上的像素被赋予更多的权重。一旦像素被修复,它将使用快速行进方法移动到下一个最近的像素。FMM确保已知像素附近的像素首先被修复,这样它就像手动启发式操作一样工作。使用标志cv2。INPAINT_TELEA启用此算法。第二种算法是基于贝尔塔米奥、马塞洛、安德烈l贝尔托齐和吉列尔莫萨皮罗在2001年撰写的文章《纳维尔-斯托克斯、流体动力学和图像与视频修复》,该算法基于流体动力学,使用偏微分方程。基本原则是幽默的。它首先沿着已知区域的边缘行进到未知区域(因为边缘是连续的)。它继续等待照片(连接相同强度点的线,就像连接相同高度点的轮廓一样),同时匹配修复区域边界的梯度向量。为此,使用了流体动力学的一些方法。获得颜色后,填充颜色以减少该区域的最小差异。使用标志cv2。INPAINT_NS启用此算法。
附言(同postscript);警官(police sergeant)
图片修复代码实现
opencv可以修复图片,主要使用cv2.inpaint()功能。输出=cv2.inpaint(图像、遮罩、inpaintRadius、标志=标志)
图像:输入8位1通道或3通道图像
遮罩:修复遮罩,8位1通道图像
输出:输出与图像大小和类型相同的图像。
修复半径:算法考虑的每个点的圆形邻域的半径
标志:
基于纳维尔-斯托克斯的修复方法
亚历山德鲁泰拉的修复技术
知道了cv2.inpaint的功能,就可以用代码修复opencv图片了。
导入cv2
#flags=cv2。INPAINT _ TELEA
flags=cv2。修复程序
image=cv2 . imread(' examples/1 . png ')
mask=cv2.imread('示例/mask1.png ')
mask=cv2.cvtColor(mask,cv2。颜色_BGR2GRAY)
输出=cv2.inpaint(图像,遮罩,3,标志=标志)
cv2.imshow('Image ',Image)
cv2.imshow('mask ',mask)
cv2.imshow('输出',输出)
cv2.waitKey(0)
首先,我们设计了cv2.inpaint函数的标志。有两种方法可以自己尝试。
使用cv2.imread函数读取图片的原始图片和蒙版图片。
使用cv2。cvtcolor(屏蔽,cv2。color _ BGR2gray)函数将图片的BGR空间转换为灰度图片。
然后使用cv2.inpaint功能修复图片。
最后,我们展示图片。
修复后的照片