利用OpenCV实现图像修复(含源码链接)

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达

前一段时间小白分享过关于图像修复技术介绍的推文(点击可以跳转),有小伙伴后台咨询能不能分享一下关于图像修复的项目或者程序。今天小白带着满满的诚意,带来了通过OpenCV实现图像修复的C++代码与Python代码。

图像修复技术应用在什么地方呢?

想想一下,我们有一张非常棒的相片,但是由于时间比较久远,没有电子版留底,而纸质版的又十分不便于保存。因此长采用扫描的方式获得电子版。但是非常不幸,扫描过程中落入了一根头发,或者是机器出现故障,对相片造成了影响,这个时候就可以通过图像修复技术解决这个问题。

强大的OpenCV库里集成了两种用与图像修复的方法

INPAINT_NS: 基于Navier-Stokes的图像修复

该方法在2001年提出,其神奇之处竟然是基于流体力学理论提出的方法。根据其作者提出,我们需要解决的问题可以抽象成在一个鞋子图片上有一个黑色的区域,通过填充黑色区域,使得最佳的恢复鞋子的样子。

3b7b763e1f1c93738a04245e48e05367.png

对于如何填补这个黑色区域,可以抽象成存在一条曲线,使得由A到B将黑色区域分开,并且保证在曲线的一侧是蓝色,另一侧是白色。这个曲线应具有如下的约束:

  1. 保持边缘特征

  2. 在平滑区域中保持颜色信息

通过构建一个偏微分方程来更新具有上诉约束的区域内的图像强度,同时利用拉普拉斯算子估计图像平滑度信息,并沿着等照度传播。

由于这些方程与Navier-Stokes方程(流体力学中的方程,感兴趣的小伙伴可以自行百度)相关且类似,因此可以通过流体力学中的方法进行求解。

由于小白对流体力学不是很了解,具体就不详细解释了,感兴趣的小伙伴可以阅读该论文了解详情。

论文地址:http://www.math.ucla.edu/~bertozzi/papers/cvpr01.pdf

INPAINT_TELEA:基于快速行进方法的图像修复

该方法中没有使用拉普拉斯算子作为平滑度的估计,而是使用像素的已知图像邻域上的加权平均值来描述。同时利用邻域像素和梯度恢复填充区域像素的颜色。

当像素被修复之后,通过快速行进方法更新边界。

论文地址:

https://pdfs.semanticscholar.org/622d/5f432e515da69f8f220fb92b17c8426d0427.pdf

相关API介绍

C++:

void inpaint(
        Mat&src,
        Mat& inpaintMask,
    Mat& dst,
    double inpaintRadius,
    int flags)

Python:

dst =cv2.inpaint(
                 src,
                 inpaintMask,
                 inpaintRadius,
                 flags)

其中各参数的含义如下:

src =源图像

inpaintMask =二进制掩码,指示要修复的像素。

DST =目标图像

inpaintRadius =像素周围的邻域补绘。通常,如果要修复的区域很薄,使用较小的值会产生较少的模糊。

flags:INPAINT_NS(基于Navier-Stokes的方法)或INPAINT_TELEA(基于快速行进的方法)

示例

11d7b33296f1a99341878e887ecacafa.png

左边的第一个图像是输入图像,第二个图像是掩模,第三个图像是INPAINT_TELEA的结果,最终结果是INPAINT_NS

关于这个图片有一个小小的故事,1865年2月5日星期日,在华盛顿特区的加德纳画廊,亚历山大·加德纳拍摄了几张总统的多镜头照片。在本届会议结束之前,加德纳请求为总统拍摄最后一个姿势。他把相机拉得更近,拍了一张林肯头部、肩膀和胸部的照片。但是玻璃板在这个时候突然破裂,对拍摄图像产生影响。加德纳小心翼翼地将它带到了他的黑暗房间,制作一张相片,发现在林肯的脸上有一个不祥的裂缝。这张相片,即O-118,至今仍然存在。多年来,许多人认为这一裂缝是10周后林肯中弹的预言。

让我们看一个更复杂的例子,在图片上写上英文单词,之后通过opencv函数去修复该单词。

6e2dabcc2fba20ff12134aad708310d7.png

左:带有Scribbles的原始图像。中:使用快速行进方法修复,右:使用Navier-Stokes方法修复。

该程序的源码和使用的图片链接为:

https://github.com/spmallick/learnopencv/tree/master/Image-Inpainting

好消息,小白学视觉团队的知识星球开通啦,为了感谢大家的支持与厚爱,团队决定将价值149元的知识星球现时免费加入。各位小伙伴们要抓住机会哦!

88beec1804c874e25747de46ac956722.png

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:OpenCV实战项目20讲

在「小白学视觉」公众号后台回复:OpenCV实战项目20讲即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

a0e82d23890849a0baba52af13cd187d.png

d1b367c0044aea37cec6c8910ddfedc4.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值