使用OpenCV进行图像修复Navier-StokesINPAINT_TELEA,专栏:各种openCV实践的案例

Posted dlage

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用OpenCV进行图像修复Navier-StokesINPAINT_TELEA,专栏:各种openCV实践的案例相关的知识,希望对你有一定的参考价值。

专栏连接:openCV练习-各种openCV实践的案例


前言

使用OpenCV进行图像修复,在ps里面有现成的功能,但是今天使用代码尝试了下,感觉效果还不错。

这个代码对比较细长的划痕、破损修复的效果比较好,但是对于一个区域类似于圆、矩形等形状修复效果并不是很好。下面会有例子展示。

作为一名工程师,不需要打开ps,只需要编写十几代码就可以进行图像修复!!!

环境:ubuntu、anaconda、python、vscode


什么是图像修复?

图像修复是计算机视觉中的一类算法,其目标是填充图像或视频内的区域。

该区域使用二值掩码来识别,填充通常是通过从需要填充的区域的边界传播信息来完成的。

图像修复最常见的应用是旧扫描照片的修复。它还用于删除图像中不需要的小对象。

修复算法

一共有两种修复算法,

INPAINT_NS : 基于 Navier-Stokes 的修复

大致的思路是这样的,如果你有兴趣可以去读一下源论文:

  • 保留梯度(即边缘特征)
  • 继续在平滑边缘传播颜色信息

INPAINT_TELEA : 基于快速行进方法

在已知的邻域像素和梯度和用于估计要修复的像素的颜色的情况下。使用像素的已知图像邻域的加权平均来修补。一旦像素被修复,边界需要更新

利弊

根据理论和论文,基于 Navier-Stokes 的修复应该更慢,并且倾向于产生比基于 Fast Marching 的方法更模糊的结果。在实践中,我发现情况并非如此。INPAINT_NS 在我们的测试中产生了更好的结果,速度也略好于 INPAINT_TELEA。

核心代码:

while True:
        ch = cv.waitKey()
        if ch == 27:
            break
        if ch == ord('t'):
            res = cv.inpaint(src=img_mask, inpaintMask=inpaintMask, inpaintRadius=3, flags=cv.INPAINT_TELEA)
            cv.imshow('Inpaint Output using FMM', res)
        if ch == ord('n'):
            res = cv.inpaint(src=img_mask, inpaintMask=inpaintMask, inpaintRadius=3, flags=cv.INPAINT_NS)
            cv.imshow('Inpaint Output using NS Technique', res)
        if ch == ord('r'):
            img_mask[:] = img
            inpaintMask[:] = 0
            sketch.show()

其实修复图片使用的代码只是调用了两个包。

使用方法

进入代码文件夹(使用的是conda环境)

python inpaint.py Lincoln.jpg

在这里插入图片描述

在原图需要修复的地方划线即可,按t、n即可使用不同的方法进行处理。


总结

只有手敲的代码才是你的代码。

github:https://github.com/dlagez/opencv/tree/master/github-learnOpenCV/image-Inpainting

参考文章:https://learnopencv.com/image-inpainting-with-opencv-c-python/

以上是关于使用OpenCV进行图像修复Navier-StokesINPAINT_TELEA,专栏:各种openCV实践的案例的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV学习2-----使用inpaint函数进行图像修复

OpenCV学习2-----使用inpaint函数进行图像修复

使用OpenCV进行图像修复Navier-StokesINPAINT_TELEA,专栏:各种openCV实践的案例

Python,OpenCV中的图像修复——cv2.inpaint()

opencv 5 图像轮廓与图像分割修复 2 使用多边形将轮廓包围

OpenCV实现照片自动红眼去除