OpenCV 4.10.0
开源计算机视觉
|
在本章中,
你们大多数人都会有一些陈旧、退化的照片,上面有一些黑点、笔触等内容。你有没有想过要修复这些照片?我们不能简单地使用绘图工具将其擦除,因为它只会将黑色结构替换为白色结构,这毫无用处。在这些情况下,可以使用一种称为图像修复的技术。基本思想很简单:用其相邻像素替换那些不好的标记,使其看起来像邻域。请考虑下面显示的图像(取自 Wikipedia)
为此,设计了许多算法,而 OpenCV 提供了其中的两种。两者都可以通过同一个函数访问,cv.inpaint()
第一个算法基于 Alexandru Telea 在 2004 年发表的论文 **“一种基于快速行进法图像修复技术”**。它基于快速行进法。假设要修复图像中的某个区域。算法从该区域的边界开始,逐渐向区域内部移动,首先填充边界中的所有内容。它在要修复邻域中的像素周围选取一个较小的邻域。用邻域中所有已知像素的归一化加权和来替换该像素。权重的选择是一个重要问题。位于点附近、靠近边界法线和平躺在边界轮廓上的那些像素将获得更大的权重。一旦修复了一个像素,它将使用快速行进法移动到下一个最近的像素。FMM 可确保已知像素附近的那些像素首先得到修复,因此它就像一个手动启发式操作。通过使用标志 cv.INPAINT_TELEA 启用此算法。
第二种算法基于论文 **“Navier-Stokes、流体动力学以及图像和视频修复”**,该论文由 Bertalmio、马塞洛、安德里亚·L·贝托齐和吉列尔莫·萨皮罗在 2001 年发表。此算法基于流体动力学,并利用偏微分方程。基本原理是启发式的。它首先沿着边缘从已知区域移动到未知区域(因为边缘应该是连续的)。它会继续等光线(将具有相同亮度的点连接起来的线,就像等高线将具有相同高度的点连接起来一样),同时匹配修复区域边界上的梯度方向。为此,运用了流体动力学方面的一些方法。获得这些方法后,会填充颜色以减少该区域中的最小方差。此算法通过使用标记 cv.INPAINT_NS 启用。
我们需要创建一个与输入图像相同大小的蒙版,其中非零像素对应于需要修复的区域。其他一切都很简单。我的图像被一些黑色笔画(我手动添加的)破坏了。我使用 Paint 工具创建了对应的笔画。
在下页查看结果。第一幅图像显示损坏的输入。第二幅图像为蒙版。第三幅图像为第一种算法的结果,最后一幅图像为第二种算法的结果。