11.2. 图像修补

11.2.1. 目标

在本章中,
-我们将学习如何通过一种称为修补的方法去除旧照片中的小噪音、笔划等-我们将在OpenCV中看到修补功能。

11.2.2. 基础

你们中的大多数人都会有一些旧的退化照片,上面有一些黑点,一些笔划等。你想过把它复原吗?我们不能简单地在绘制工具中删除它们,因为它将简单地用白色结构替换黑色结构,而白色结构毫无用处。在这些情况下,使用一种称为图像修复的技术。基本思想很简单:用相邻像素替换那些坏标记,使其看起来像邻域。考虑下图(取自 Wikipedia ):

为此设计了几个算法,OpenCV提供了其中两个。两者都可以通过同一个函数访问, cv2.修补()

第一个算法是基于论文 “基于快速行进法的图像修复技术” 2004年亚历山德罗·特拉。它基于快速行进法。考虑图像中要修复的区域。算法从该区域的边界开始,进入该区域内,首先逐步填充边界内的所有内容。它需要一个小邻里周围的像素在邻里被修复。该像素被邻域中所有已知像素的归一化加权和所代替。权重的选择是一个重要的问题。对于靠近点、接近边界法线和位于边界轮廓上的像素,赋予了更大的权重。一旦一个像素被修复,它就使用快速行进法移动到下一个最近的像素。FMM确保那些靠近已知像素的像素首先被修复,因此它就像一个手动的启发式操作一样工作。此算法是通过使用标志启用的, cv2.INPAINT_TELEA .

第二个算法是基于论文 “Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting” 作者:Bertalmio、Marcelo、Andrea L.Bertozzi和Guillermo Sapiro,2001年。该算法基于流体力学,利用偏微分方程。基本原理是启发式的。它首先沿着边缘从已知区域移动到未知区域(因为边缘是连续的)。它在修补区域边界匹配梯度向量的同时,继续使用等参线(线连接强度相同的点,就像等高线连接高程相同的点一样)。为此,采用了流体力学的一些方法。一旦得到它们,颜色被填充以减少该区域的最小方差。此算法是通过使用标志启用的, cv2.INPAINT_NS .

11.2.3. 代码

我们需要创建一个与输入图像大小相同的遮罩,其中非零像素对应于要修复的区域。其他一切都很简单。我的图像被一些黑色笔划降级(我手动添加)。我用画图工具创建了一个对应的笔划。

>>> import numpy as np
>>> import cv2
>>>
>>> img = cv2.imread('/cvdata/messi_2.jpg')
>>> # mask = cv2.imread('/cvdata/mask2.png',0)
>>> mask = cv2.imread('/cvdata/mask2.png',0)
>>>
>>> # dst = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)
>>>
>>> dst = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)
>>>
>>> # cv2.imshow('dst',dst)
>>> # cv2.waitKey(0)
>>> # cv2.destroyAllWindows()
>>> %matplotlib inline
>>>
>>> import matplotlib.pyplot as plt
>>> plt.imshow(img)
<matplotlib.image.AxesImage at 0x7f106c2fdeb8>
../_images/sec02-inpainting_2_1.png
>>> plt.imshow(mask)
<matplotlib.image.AxesImage at 0x7f106c269550>
../_images/sec02-inpainting_3_1.png
>>> plt.imshow(dst)
<matplotlib.image.AxesImage at 0x7f106c250ef0>
../_images/sec02-inpainting_4_1.png

见下面的结果。第一张图片显示了降级的输入。第二幅是面具。第三个图像是第一个算法的结果,最后一个图像是第二个算法的结果。

11.2.4. 额外资源

  1. 贝塔尔米奥、马塞洛、安德烈亚·L·贝托齐和吉列尔莫·萨皮罗。“Navier-stokes,流体力学,图像和视频修复”,计算机视觉和模式识别,2001年。CVPR 2001年。2001年IEEE计算机协会会议记录,第1卷,第I-355页。IEEE,2001年。

  2. 特雷亚,亚历山德罗。“基于快速行进法的图像修补技术”,《图形工具杂志》9.1(2004):23-34。

11.2.5. 练习

  1. OpenCV附带了一个关于修补的交互式示例, samples/python2/inpaint.py ,试试看。

  2. 几个月前,我在 Content-Aware Fill ,Adobe Photoshop中使用的高级修补技术。在进一步的搜索中,我发现相同的技术已经存在于GIMP中,名称不同,“ressynthesizer”(您需要安装单独的插件)。我相信你会喜欢这项技术的。