目标
在本章中,
- 我们将学习如何通过一种叫做图像修复的方法来去除旧照片中的小噪点、笔画等。
- 我们将了解OpenCV中的图像修复功能。
基础知识
你们大多数人家里都会有一些老旧的、有黑点、笔画等损坏的照片。你们有没有想过恢复它们?我们不能简单地在绘图工具中擦除它们,因为它只会用白色结构替换黑色结构,这是没有用的。在这些情况下,使用一种叫做图像修复的技术。基本思想很简单:用相邻像素替换那些坏的痕迹,使其看起来像邻域。考虑下图所示的图像(来自维基百科)
image
为此设计了几种算法,OpenCV提供了其中两种。两者都可以通过同一个函数访问,cv.inpaint()
第一种算法基于 Alexandru Telea 在 2004 年发表的论文 "An Image Inpainting Technique Based on the Fast Marching Method"。它基于快速行进法。考虑图像中要修复的区域。算法从该区域的边界开始,逐渐进入区域内部,首先填充边界中的所有内容。它在要修复的邻域中的像素周围取一个小邻域。该像素被邻域中所有已知像素的归一化加权和替换。权重的选择是一个重要的问题。更多的权重被赋予那些靠近该点、靠近边界法线以及位于边界轮廓上的像素。一旦像素被修复,它就使用快速行进法移动到下一个最近的像素。FMM 确保首先修复靠近已知像素的像素,因此它的工作方式就像手动启发式操作一样。可以使用标志 cv.INPAINT_TELEA 启用此算法。
第二种算法基于 Bertalmio、Marcelo、Andrea L. Bertozzi 和 Guillermo Sapiro 在 2001 年发表的论文 "Navier-Stokes, Fluid Dynamics, and Image and Video Inpainting"。此算法基于流体动力学并利用偏微分方程。基本原理是启发式的。它首先沿着从已知区域到未知区域的边缘行进(因为边缘应该是连续的)。它继续等照度线(连接具有相同强度的点的线,就像轮廓线连接具有相同海拔的点的线一样),同时匹配修复区域边界处的梯度向量。为此,使用了一些来自流体动力学的方法。一旦获得它们,就会填充颜色以减少该区域中的最小方差。可以使用标志 cv.INPAINT_NS 启用此算法。
代码
我们需要创建一个与输入图像大小相同的掩码,其中非零像素对应于要修复的区域。其他一切都很简单。我的图像被一些黑色笔画损坏了(我手动添加的)。我使用绘图工具创建了相应的笔画。
import numpy as np
import cv2 as cv
mask =
cv.imread(
'mask2.png', cv.IMREAD_GRAYSCALE)
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)
使用区域邻域恢复图像中选定的区域。
请看下面的结果。第一张图像显示了损坏的输入。第二张图像是掩码。第三张图像是第一种算法的结果,最后一张图像是第二种算法的结果。
image
补充资源
- 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.
- Telea, Alexandru. "An image inpainting technique based on the fast marching method." Journal of graphics tools 9.1 (2004): 23-34.
练习
- OpenCV 带有一个关于图像修复的交互式示例,samples/python/inpaint.py,尝试一下。
- 几个月前,我观看了一个关于 Content-Aware Fill 的视频,这是 Adobe Photoshop 中使用的一种高级图像修复技术。进一步搜索后,我发现 GIMP 中已经存在相同的技术,但名称不同,称为“Resynthesizer”(您需要安装单独的插件)。我相信你会喜欢这项技术。