帮你解锁一个新技能,opencv完美媲美PS,图片PS,我们代码实现除去水印

很多时候,我们相中了一张图片,怎奈图片上面有水印,不会PS的我们该如何来处理图片,这里小编介绍一下一下opencv的cv2.inpaint的图片修复函数,使用此cv2.inpaint函数,可以完美匹配PS。

OpenCV提供了两种算法。两者都可以通过相同的函数访问,cv2.inpaint()

图片修复

opencv图片修复算法

第一种算法基于Alexandru Telea于2004年发表的“基于快速行进方法的图像修复技术”。它基于快速行进方法。考虑图像中要修复的区域。算法从该区域的边界开始,然后进入区域内,逐渐填充边界中的所有内容。它需要在邻近的像素周围的一个小邻域进行修复。该像素由邻居中所有已知像素的归一化加权和代替。选择权重是一个重要的问题。对于靠近该点的那些像素,靠近边界的法线和位于边界轮廓上的像素,给予更多的权重。一旦像素被修复,它将使用快速行进方法移动到下一个最近的像素。 FMM确保首先修复已知像素附近的像素,这样它就像手动启发式操作一样工作。使用标志cv2.INPAINT_TELEA启用此算法。

第二种算法基于Bertalmio,Marcelo,Andrea L. Bertozzi和Guillermo Sapiro于2001年撰写的“Navier-Stokes,流体动力学和图像和视频修补”一文。该算法基于流体动力学并利用偏微分方程。基本原则是heurisitic。它首先沿着已知区域的边缘行进到未知区域(因为边缘是连续的)。它继续等照片(连接具有相同强度的点的线,就像轮廓连接具有相同高度的点一样),同时在修复区域的边界处匹配渐变矢量。为此,使用来自流体动力学的一些方法。获得颜色后,填充颜色以减少该区域的最小差异。使用标志cv2.INPAINT_NS启用此算法。

PS

图片修复代码实现

opencv实现图片的修复,主要使用cv2.inpaint()函数

output = cv2.inpaint(image, mask,inpaintRadius, flags=flags)

image:输入8位1通道或3通道图像

mask:修复掩码,8位1通道图像

output:输出与image具有相同大小和类型的图像

inpaintRadius:算法考虑的每个点的圆形邻域的半径

flags:

INPAINT_NS基于Navier-Stokes的方法

Alexandru Telea的INPAINT_TELEA方法

了解了cv2.inpaint的函数,就可以使用代码来实现opencv图片的修复了

import cv2

#flags = cv2.INPAINT_TELEA

flags = cv2.INPAINT_NS

image = cv2.imread(‘examples/1.png’)

mask = cv2.imread(‘examples/mask1.png’)

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)

output = cv2.inpaint(image, mask,3, flags=flags)

cv2.imshow(“Image”, image)

cv2.imshow(“mask”, mask)

cv2.imshow(“Output”, output)

cv2.waitKey(0)

首先我们设计cv2.inpaint函数的flags,这里有2种方式,可以自行尝试

使用cv2.imread函数来读取原始图片以及图片的mask图片

利用cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)函数把图片BGR空间转换为灰度图片

然后使用cv2.inpaint函数进行图片的修复

最后我们显示图片

修复的照片