使用OpenCV进行图像修复Navier-StokesINPAINT_TELEA,专栏:各种openCV实践的案例
Posted dlage
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用OpenCV进行图像修复Navier-StokesINPAINT_TELEA,专栏:各种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()