使用Python,OpenCV进行去水印,图像修复

图像修复是图像保存图像恢复的一种形式,其历史可以追溯到1700年代,当时意大利威尼斯的公共图片修复总监彼得·爱德华兹(Pietro Edwards)应用这种科学方法来修复和保存著名作品(资料来源)。

图像修复技术显着提高了图像绘画的质量,使我们能够:

  • 恢复旧的,降级的照片
  • 修复因损坏和老化而缺少区域的照片
  • 遮罩并从图像中删除特定对象(并以美观的方式进行)

今天,我们将研究OpenCV开箱即用提供的两种图像修复算法。 要了解如何使用OpenCV和Python执行图像修复,请继续阅读!

1. Python,OpenCV内置的修复算法

俩种修复算法简述:引自openCV 文档

cv2.INPAINT_TELEA 简称Telea,基于快速行进方法(Fast Marching Method,简称FMM)考虑图像中要修复的区域。算法从该区域的边界开始,并进入该区域内部,然后逐渐填充边界中的所有内容。在要修复的邻域上的像素周围需要一个小的邻域。用附近所有已知像素的归一化加权总和替换该像素。权重的选择很重要。那些位于该点附近,边界法线附近的像素和那些位于边界轮廓线上的像素将获得更大的权重。修复像素后,将使用快速行进方法将其移动到下一个最近的像素。
FMM确保首先修复已知像素附近的那些像素,以便像手动启发式操作一样工作。

cv2.INPAINT_NS: 基于流体动力学(fluid dynamics)并利用偏微分方程(partial differential equations)。基本原理是启发式的。它首先沿着边缘从已知区域移动到未知区域(因为边缘是连续的)。它延续了等距线(isophotes)(线条连接具有相同强度的点,就像轮廓线连接具有相同高程的点一样),同时在修复区域的边界匹配梯度矢量(gradient vectors)。为此使用了一些流体动力学方法。获得它们后,将填充颜色以减少该区域的最小差异。

  • 在使用OpenCV应用修复时,我们需要提供两个图像,
    output = cv2.inpaint(image, mask, radius,flags) 返回是修复后的图像
  • image:我们希望修复和恢复的输入图像。该图像以某种方式被“损坏”,我们需要应用修复算法对其进行修复。
  • maks:遮罩图像,高亮出了图像中被损坏的区域。该图像应具有与输入图像相同的空间尺寸(宽度和高度)。非零像素对应于应该修复(即固定)的区域,而零像素被认为是“正常”并且不需要修复;
  • radius:修复半径以像素为单位(算法考虑的每个修补点的圆形邻域)
  • flags:修复的算法(cv2.INPAINT_TELEA or cv2.INPAINT_NS)

手动干预是使用OpenCV内置的修复算法的主要限制之一。每次都需要我们提供与原图宽高一致且突出显示被毁坏区域的mask图。每次手动去构建mask是一个乏味而冗繁的过程,可以利用机器学习训练全卷积模型等去“学习以修复”,来解决这个问题。

2. python内置算法修复效果对比

1. 使用FMM方法得到的mask,原图,输出的修复图像
在这里插入图片描述应用快速前进方法。可以看到文本已成功删除,但是您可以看到许多图像伪像,尤其是在高纹理区域,例如混凝土人行道和皮带。

2. 使用Navier Stokes修复
在这里插入图片描述左侧原图,中间mask蒙版,右侧显示了Navier-Stokes修复方法的输出。通过使用这种OpenCV修复方法,我们已经能够部分修复损坏的旧照片。

3. 最后一个示例
在这里插入图片描述在这里插入图片描述左边是原始图像,中间是相应的蒙版。 可以看到mask蒙版有两个区域,我们将尝试“修复”:右下角的水印,圆形区域对应于其中一棵树。
在此示例中,我们将OpenCV修复视为一种从图像中删除对象的方法,其结果可以在底部看到。不幸的是,结果并不如我们期望的那样好。我们希望删除的树显示为圆形模糊,而水印也模糊。

3. 怎么提升水印修复的效果

OpenCV内置的修复算法的最大问题之一是它们需要人工干预,这意味着我们必须手动提供希望修复和恢复的遮罩区域。

手动提供口罩很繁琐-有没有更好的方法? 其实有。

使用基于深度学习的方法,包括全卷积神经网络和生成对抗网络(GANs),我们可以“学习修补”。 这些网络:

  • 要求零人工干预
  • 可以生成自己的训练数据
  • 产生比传统计算机视觉修复算法更美观的结果

基于深度学习的修复算法不在本教程的范围内,但将在以后的博客文章中介绍。

参考:

猜你喜欢

转载自blog.csdn.net/qq_40985985/article/details/106210010