首先我们知道opencv里面也有关于图像复原的函数-----cvInpaint

      在cv里面找到:

enum { INPAINT_NS=CV_INPAINT_NS, INPAINT_TELEA=CV_INPAINT_TELEA };

CV_EXPORTS void inpaint( const Mat& src, const Mat& inpaintMask,
                         Mat& dst, double inpaintRange, int flags );

     从该函数里面可以看出有两种算法可供调用,调用方式如下:

cvInpaint( img, inpaint_mask, inpainted, 3, CV_INPAINT_TELEA );



然后我们用opencv里面的例子源码测试:

opencv返回像素颜色 opencv图像复原_opencv返回像素颜色

当参数为 :CV_INPAINT_TELEA

opencv返回像素颜色 opencv图像复原_像素点_02

当参数为 :当参数为 :CV_INPAINT_NS

opencv返回像素颜色 opencv图像复原_水平集_03



CV_INPAINT_NS - 基于Navier-Stokes的方法。

比较难懂,贴个链接:

http://wenku.baidu.com/link?url=aut0V0I8ngmDiQOl6uvjZqAukhfAYeiF38C2-EMS8NScb5VKB3ZMBTpicbO7hU_22yP7zcH2Lz9PDVQrzOYWIthrLWBqYNRAvHCuSZqD6qa


CV_INPAINT_TELEA - Alexandru Telea[Telea04]的方法。

Telea在2004年提出的基于快速行进的修复算法(后面简称FMM算法)。

论文题目:An Image Inpainting Technique Based on the Fast Marching Method (2004)

作者主页:http://www.cs.rug.nl/~alext/

论文下载: http://www.cs.rug.nl/~alext/PAPERS/index.html (编号36的那篇)


在opencv中实现修复有两种算法,这里介绍Telea的算法,即基于快速行进(FMM)的修复算法。


首先看c++接口中,函数的定义。


1



2



3



4



5



6


void cv::Inpaint( const Mat& src, const Mat& mask, Mat& dst,  double inpaintRange, int flags )



//src:要修复的图像;



//mask:修复模板,必须是单通道图像;



//dst:目标图像;



//inpaintRange:选取邻域半径;



//flags:要使用的方法,可以是CV INPAINT NS或CV INPAINT TELEA(本文介绍的方法)。



其实c++接口实现的inpaint方法,只是调用了一下c接口中的cvInpaint。


1


cvInpaint( const vArr*_input_img,const CvArr* _inpaint_mask,CvArr* _output_img, double inpaintRange, int flags )



首先,FMM算法基于的思想是,先处理待修复区域边缘上的像素点,然后层层向内推进,直到修复完所有的像素点。

下面以灰度图为例,我们只需要计算出像素新的灰度值即可。对于彩色图像,分别用同样的方法处理各个通道即可。

一、先说一下如何修复一个像素点的。

opencv返回像素颜色 opencv图像复原_opencv返回像素颜色_04

参考上图,Ω区域是待修复的区域;δΩ指Ω的边界);要修复Ω中的像素,就需要计算出新的像素值来代替原值。

现在假设p点是我们要修复的像素。以p为中心选取一个小邻域B(ε),该邻域中的点像素值都是已知的(只要已知的)。(这个ε就是opencv函数中参数 inpaintRadius)

显然,我们需要的是用邻域Bε(p)中的所有点计算p点的新灰度值。显然,各个像素点所起的作用应该是不同的,也就引入了权值函数来决定哪些像素的值对新像素值影响更大,哪些比较小。采用下面的公式(公式2):

 

opencv返回像素颜色 opencv图像复原_水平集_05

这里的w(p, q)就是权值函数,是用来限定邻域中各像素的贡献大小的。

 w(p, q) = dir(p, q) · dst(p, q) · lev(p, q)

 

opencv返回像素颜色 opencv图像复原_像素点_06

其中,d0和 T0分别为距离参数和水平集参数,一般都取为 1。方向因子 dir(p,q)保证了越靠近法线方向 N =  ?T的像素点对 p 点的贡献最大;几何距离因子 dst(p,q)保证了离 p 点越近的像素点对p 点贡献越大;水平集距离因子lev(p,q)保证了离经过点 p 的待修复区域的轮廓线越近的已知像素点对点 p 的贡献越大。