OpenCV 4.11.0
开源计算机视觉库
加载中…
搜索中…
无匹配项
图像修复

目标

在本章中,

  • 我们将学习如何使用一种称为图像修复的方法去除旧照片中的小噪点、划痕等。
  • 我们将了解OpenCV中的图像修复功能。

基础知识

你们大多数人在家里都会有一些旧的、损坏的照片,上面有一些黑点、划痕等。你有没有想过修复它?我们不能简单地在绘图工具中擦除它们,因为这只会用白色结构替换黑色结构,这是没有用的。在这些情况下,使用一种称为图像修复的技术。基本思想很简单:用其相邻像素替换这些坏标记,使其看起来像邻域。请考虑下面显示的图像(取自维基百科

图像

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

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

第二种算法基于Bertalmio, Marcelo, Andrea L. Bertozzi和Guillermo Sapiro在2001年发表的论文“Navier-Stokes、流体动力学以及图像和视频修复”。该算法基于流体动力学,并利用偏微分方程。基本原理是启发式的。它首先沿着边缘从已知区域移动到未知区域(因为边缘应该连续)。它继续等光线(连接具有相同强度的点的线,就像轮廓连接具有相同高度的点一样),同时匹配修复区域边界处的梯度向量。为此,使用流体动力学中的一些方法。一旦获得这些方法,就会填充颜色以减少该区域的最小方差。此算法通过使用标志启用,cv.INPAINT_NS

代码

我们需要创建一个与输入图像大小相同的掩码,其中非零像素对应于要修复的区域。其他一切都很简单。我的图像因一些黑色笔触而损坏(我手动添加的)。我用绘图工具创建了相应的笔触。

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_BGR)
从文件加载图像。
void inpaint(InputArray src, InputArray inpaintMask, OutputArray dst, double inpaintRadius, int flags)
使用区域邻域修复图像中的选定区域。

请参见下面的结果。第一张图显示损坏的输入。第二张图是掩码。第三张图是第一种算法的结果,最后一张图是第二种算法的结果。

图像

额外资源

  1. Bertalmio, Marcelo, Andrea L. Bertozzi, and Guillermo Sapiro. "Navier-Stokes, fluid dynamics, and image and video inpainting." In Computer Vision and Pattern Recognition, 2001. CVPR 2001. Proceedings of the 2001 IEEE Computer Society Conference on, vol. 1, pp. I-355. IEEE, 2001.
  2. Telea, Alexandru. "An image inpainting technique based on the fast marching method." Journal of graphics tools 9.1 (2004): 23-34.

练习

  1. OpenCV附带一个关于图像修复的交互式示例,samples/python/inpaint.py,请尝试一下。
  2. 几个月前,我观看了一个关于内容感知填充的视频,这是一种Adobe Photoshop中使用的先进图像修复技术。进一步搜索后,我发现GIMP中已经存在相同的技术,名称不同,称为“Resynthesizer”(需要安装单独的插件)。我相信你会喜欢这项技术的。