图像修复 python_50.图像修复

目标

本节主要学习内容:

• 使用图像修复技术去除照片中的噪声和划痕

• 掌握 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中使用的一种高级修复技术。(您需要安装单独的插件)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值