帮你解锁一个新技能,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函数进行图片的修复
最后我们显示图片
修复的照片