目标
本节主要学习内容:
• 使用图像修复技术去除照片中的噪声和划痕
• 掌握 OpenCV 中与图像修复技术相关的函数
基础说明
想一想,你在生活中有没有遇到过这样的问题?一张自己很喜欢的具有怀念意义的照片,随着年代的久远,照片逐渐老化,有时候在看照片时一不小心弄上了点污渍或者是画了几笔。你有没有想过要修复这些照片呢?你可能会说,我可以使用笔刷工具简易在上面涂抹两下不就行了吗?但这其实是没用的,事实上你只是用白色笔画取代了黑色笔画。
此时要想恢复照片的原貌,就需要用到图像修复(也叫图像恢复)技术了。这种技术的基本想法其实很简单:使用坏点周围的像素取代坏点。这样它看起来和周围像素就比较像了。
算法介绍
为了实现上面所说的目的,科学家们和众多研究者在图像修复领域其实已经提出了好多种算法?我们重点讲OpenCV 中的实现算法,OpenCV提供了其中的两种。这两种算法都可以通过使用函数 cv2.inpaint() 来实现。
算法一:根据 Alexandru_Telea 在 2004 发表的文章实现。基于快速进行算法。以图像中一个待修补的区域为例。算法从这个区域的边界开始向区域内部慢慢前进,首先填充区域边界像素。然后选取待修复像素周围的一个小的邻域,使用这个区域内的归一化加权和更新待修复的像素值。权重的选择非常重要。对于靠近带修复点的像素点,靠近正常边界像素点和在轮廓上的像素点给予更高的权重。当一个像素被修复之后,使用快速进行算法(FMM)移动到下一个最近的像素。FMM 保证了靠近已知(没有退化)像素点的坏点先被修复,这与手工启发式操作比较类似。在OpenCV可以通过置标签参数为 cv2.INPAINT_TELEA 来使用此算法。
算法二:根据 Bertalmio,Marcelo,Andrea_L.Bertozzi, 和 Guillermo_Sapiro在 2001 年发表的文章实现的。基于流体动力学并使用了偏微分方程。基本原理是启发式的。它首先沿着正常区域的边界向退化区域前进。(因为边界是连续的,所以退化区域的边界与正常区域的边界应也是连续的)。它通过匹配代修复区域的梯度向量来延伸等光强线(isophotes,由灰度值相等的点连成的线)。为了实现这个目的,作者使用了流体动力学中的一些方法。完成这一步之后,通过填充颜色来使这个区域内的灰度值变化最小。可以通过设置标签参数为 cv2.INPAINT_NS 来使用此算法。
代码实现
messi_2.png
mask2.png
原理:我们首先创建一个与输入入图像大小相等的掩模图像。将待修复区域的像素设置为 255,其他地方为 0。待修复的图像中有几个黑色笔画。我是使用画笔工具添加的。
# -*- coding: utf-8 -*
import numpy as np
import cv2
img = cv2.imread('messi_2.png')
# 缩放的目的是为了保证掩模图像和原图像大小一致
img = cv2.resize(img, (150, 112))
print(img.shape, img.size)
mask = cv2.imread('mask2.png', 0)
print(mask.shape, mask.size)
# 使用算法一修复
dst = cv2.inpaint(img, mask, 3, cv2.INPAINT_TELEA)
# 使用算法二修复
dst2 = cv2.inpaint(img, mask, 3, cv2.INPAINT_NS)
# 显示待修复图像
cv2.imshow('img',img)
# 算法一的修复结果
cv2.imshow('dst', dst)
# 算法二的修复结果
cv2.imshow('dst2',dst2)
cv2.waitKey(0)
cv2.destroyAllWindows()
运行结果如下:第一幅图是退化后的输入图像?第二幅是掩模图像。第三幅是使用第一个算法的结果,最后一副是使用第二个算法的结果。
更多资源和技巧:
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. CVPR2001. Proceedings of the 2001 IEEE Computer Society Confer-ence 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.
3.OpenCV附带了一个关于修补的交互式示例,samples/python2/inpaint.py,试试看。(注意python版本和OpenCV版本)
4. 查看python中某个库的安装位置:import cv2 cv2.__file__
5.关于内容感知填充(Content Aware Fill:https://www.youtube.com/watch?v=ZtoUiplKa2A)的视频,这是Adobe Photoshop中使用的一种高级修复技术。(您需要安装单独的插件)。