本系列博客主要分享Python在机器视觉/计算机视觉下的编程应用
cv2包是著名的视觉库OpenCV的Python实现
图像修复
很多时候遇到受损的图片我们需要利用机器视觉的手段对其进行修复,opencv中提供了inpaint函数实现了这一功能。
1.先来看一个例子
- 首先读入图片:
import numpy as np
import cv2 as cv
img = cv.imread('src.jpg')
polluted = cv.imread('polluted.png',0)
分别是原图和污损图。
- 下面我们使用阈值分割来得到污损图的掩膜:
_,mask = cv2.threshold(cv2.cvtColor(pllute,cv2.COLOR_BGR2GRAY),10,255,cv2.THRESH_BINARY_INV)
cv2.imshow('mask',mask);cv2.waitKey(1000);cv2.destroyAllWindows()
得到如下的掩膜图;
- 最后调用函数对图像进行修复
dst = cv.inpaint(polluted ,mask,3,cv.INPAINT_TELEA)
cv2.imshow('inpainted',dst)
cv2.imshow('src',src)
cv2.waitKey(0)
cv2.destroyAllWindows()
左图是修复图,右图是原图。
img from Animade
2.参数解析
图像修复函数inpaint
主要参数如下:
inpaint(src, inpaintMask, inpaintRadius, flags[, dst]) -> dst
. 这是一个利用领域信息恢复图像的函数.
.
. src 为输入图像
. inpaintMask 为单通道二值图掩膜,其中非零位置为需要修复的位置
. dst 为输出图像,与输入大小等同 .
. inpaintRadius 为领域大小,在修复时考虑周围像素的范围
. 修复方法的flag:
. - **INPAINT_NS** [Navier-Stokes based方法](https://ieeexplore.ieee.org/document/990497)
. - **INPAINT_TELEA** [Alexandru Telea方法](https://www.tandfonline.com/doi/abs/10.1080/10867651.2004.10487596)
.
3.原理实现
Navier-Stokes based方法
论文摘要:这种方法利用了经典流体动力学中的思想,将等照度线连续的从待修补区域周围传播到修补区域中去。主要的观点在于将图像强度视为了二维不可压缩流的流函数(stream function),其中图像强度的拉普拉斯量为流体的旋量、并将它通过矢量场定义的流函数输运到待修补区域。最终得到的算法会通过连续照度来匹配受损区域的梯度矢量。它直接依赖于流体力学中的纳维叶斯托克斯方程,具有较强的理论和数值优势。
Fast Marching Method
这篇文章提出的是基于快速行进算法的图像修复,其主要思想则是基于沿图像梯度传播平滑估计器。图像的平滑主要来自于受损图像领域的加权平均。同时将缺失的区域视为水平集,并用FMM(Fast Marching Method)来描述为图像信息的传播。
Image Prior
目前深度学习方法对于图像修复也有了很大的进展
ref:
1.OpencvDoc:https://docs.opencv.org/3.4/df/d3d/tutorial_py_inpainting.html
2.Deeplearning:https://arxiv.org/pdf/1711.10925.pdf
3.Code:https://github.com/atiyo/deep_image_prior
4.Fast Marching:https://blog.csdn.net/seamanj/article/details/51991067