OpenCV  4.10.0
开源计算机视觉
加载...
搜索...
未找到匹配项
图像修复

目标

在本章中,

  • 我们将学习如何通过一种称为修复的方法,去除旧照片中的轻微噪点、笔触等内容
  • 我们将了解 OpenCV 中的修复功能。

基础知识

你们大多数人都会有一些陈旧、退化的照片,上面有一些黑点、笔触等内容。你有没有想过要修复这些照片?我们不能简单地使用绘图工具将其擦除,因为它只会将黑色结构替换为白色结构,这毫无用处。在这些情况下,可以使用一种称为图像修复的技术。基本思想很简单:用其相邻像素替换那些不好的标记,使其看起来像邻域。请考虑下面显示的图像(取自 Wikipedia

图像

为此,设计了许多算法,而 OpenCV 提供了其中的两种。两者都可以通过同一个函数访问,cv.inpaint()

第一个算法基于 Alexandru Telea 在 2004 年发表的论文 **“一种基于快速行进法图像修复技术”**。它基于快速行进法。假设要修复图像中的某个区域。算法从该区域的边界开始,逐渐向区域内部移动,首先填充边界中的所有内容。它在要修复邻域中的像素周围选取一个较小的邻域。用邻域中所有已知像素的归一化加权和来替换该像素。权重的选择是一个重要问题。位于点附近、靠近边界法线和平躺在边界轮廓上的那些像素将获得更大的权重。一旦修复了一个像素,它将使用快速行进法移动到下一个最近的像素。FMM 可确保已知像素附近的那些像素首先得到修复,因此它就像一个手动启发式操作。通过使用标志 cv.INPAINT_TELEA 启用此算法。

第二种算法基于论文 **“Navier-Stokes、流体动力学以及图像和视频修复”**,该论文由 Bertalmio、马塞洛、安德里亚·L·贝托齐和吉列尔莫·萨皮罗在 2001 年发表。此算法基于流体动力学,并利用偏微分方程。基本原理是启发式的。它首先沿着边缘从已知区域移动到未知区域(因为边缘应该是连续的)。它会继续等光线(将具有相同亮度的点连接起来的线,就像等高线将具有相同高度的点连接起来一样),同时匹配修复区域边界上的梯度方向。为此,运用了流体动力学方面的一些方法。获得这些方法后,会填充颜色以减少该区域中的最小方差。此算法通过使用标记 cv.INPAINT_NS 启用。

代码

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

import numpy as np
import cv2 as cv
img = cv.imread('messi_2.jpg')
mask = cv.imread('mask2.png', cv.IMREAD_GRAYSCALE)
dst = cv.inpaint(img,mask,3,cv.INPAINT_TELEA)
cv.imshow('dst',dst)
void imshow(const String &winname, InputArray mat)
在指定窗口中显示图像。
int waitKey(int delay=0)
等待按下按键。
void destroyAllWindows()
销毁所有 HighGUI 窗口。
CV_EXPORTS_W Mat imread(const String &filename, int flags=IMREAD_COLOR)
从文件中加载图像。
void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)
使用区域邻域恢复图像中的选定区域。

在下页查看结果。第一幅图像显示损坏的输入。第二幅图像为蒙版。第三幅图像为第一种算法的结果,最后一幅图像为第二种算法的结果。

图像

其他资源

  1. Bertalmio、Marcelo、Andrea L. Bertozzi 和 Guillermo Sapiro。“纳维-斯托克斯,流体动力学,图像和视频填补”。发表于计算机视觉和模式识别,2001 年。CVPR 2001. 2001 年 IEEE 计算机协会会议记录,卷 1,第 I-355 页。IEEE,2001 年。
  2. Telea, Alexandru。“基于快速进行方法的图像修复技术”。Journal of graphics tools 9.1 (2004): 23-34.

练习

  1. OpenCV 带有一个交互式修复样本,samples/python/inpaint.py,可以试一试。
  2. 几个月前,我在 内容感知填充 上观看了一段视频,这是一种在 Adobe Photoshop 中使用的先进修复技术。进一步搜索后,我发现 GIMP 中已经有了相同的技术,名称不同,“Resynthesizer”(你得装一个单独的插件)。我敢肯定你会喜欢这项技术。