1.harmonic_interpolation(Image, Region : InpaintedImage : Precision : )
harmonic_interpolation重建图像Image区域Region 内被破坏后的图像数据,
求解相应的灰度值函数u的离散拉普拉斯方程
,
在InpaintedImage中返回区域外图像Image给出的狄利克雷边界条件下的唯一解。
这种方法称为谐波插值,因为在函数理论中,拉普拉斯方程的解称为谐波函数。
如果区域Region 与图像Image灰度值矩阵的边界相接触,
使得一些狄利克雷边界值不存在,则使用冯·诺依曼边界条件。
这意味着灰度值在图像Image的边界处被镜像。
如果根本不存在Dirichlet边界值,则返回灰度值为0的常量图像。
空间导数离散为
该方程由迭代共轭梯度求解器求解,迭代地提高计算误差,
直到其更新步长的最大范数小于输入数据范数的精度或达到1000次迭代的最大值为止。
精度= 0.01,表示相对计算精度为1%。
2.inpainting_ced(Image, Region : InpaintedImage : Sigma, Rho, Theta, Iterations : )
inpainting_ced对输入图像Image的区域Region 执行各向异性扩散过程,
其目的是通过增加图像中包含的图像结构的一致性来完成不连续的图像边缘扩散,
而不平滑这些垂直于其主导方向的边缘。
其机理与基于各向异性扩散方程离散化的算子coherence_enhancing_diff相同
由Weickert制定。对于依赖于图像Image中灰度值的2x2系数矩阵G,这是对平均曲率流或本征热方程的增强
在用输入图像Image和时间t0=0定义的灰度值函数u上 。平滑算子mean_ature_flow是平均曲率流动方程的直接应用。
操作符inpainting_mcf也可以用于图像inpainting。
离散扩散方程求解时,步长 Theta,迭代次数Iterations
InpaintedImage输出图像包含 Iterations * Theta的灰度值函数。
为了更可靠地检测图像方向,特别是在有噪声的输入数据上,
可以在计算灰度值梯度之前附加一个各向同性平滑步骤。
参数Sigma通过相应高斯卷积核的标准差来确定平滑的大小,
就像操作符isotropic_diffusion用于各向同性图像平滑一样。
与inpainting_mcf运算符类似,通过平滑图像的水平线,简化了区域内图像数据的结构。
通过这种方法,可以去除图像中的错误和不需要的对象,同时不断扩展邻域中的边缘。
这个过程被称为图像绘制。其目的是引入最少数量的人为干扰或平滑效果,使图像处理对人眼的可见性最小。
而矩阵G由下面公式结出
在inpainting_mcf操作符的情况下,
其中I表示单位矩阵,
Gmfc为用标准偏差Rho的coherence_enhancing_diff进行高斯滤波平滑分量。
最后一个系数矩阵
由得到的中间矩阵的特征值y1,y2和特征向量w1,w2构造,其中函数
是根据经验确定的,从Weickert的出版中摘录。
因此,mean_curvature_flow内的扩散方向只取决于局部的灰度值梯度的方向,
同时Gced 考虑了图像的宏观结构上的对象规模 Rho,
coherence_enhancing_diff扩散的大小取决于这个结构定义。
为了实现新创建的边缘与来自邻近区域的图像数据的最大可能一致性,在靠近边界的像素上,
灰度值不会在区域边界处镜像,以计算与比例rho的平滑滤波器遮罩的卷积,
尽管这是滤波器函数常用的方法。
相反,假设区域周围存在宽度为CEIL(3.1*rho)+2像素的带上的灰度值,这些值用于卷积。
这意味着区域必须与Image的边界保持如此远的距离。
通过引入该扩展区域的灰度值和方向信息,可以得到边缘的连续性不仅是连续的,而且是平滑的,这意味着没有扭结。
请注意,Inpainting进度仅限于输入图像的ROI中包含的像素。
如果ROI不包括整个区域Region ,则使用Region 和ROI交叉点周围的带定义边界值。
为了减少获得满意结果所需的迭代次数,
在调用inpainting_ced之前,先将算子harmonic_interpolation应用于Image,
用谐波插值(一个曲率最小的连续函数)在区域内初始化灰度值矩阵可能是有用的。
例程:
* 程序演示如何使用inpainting_ced来填充无法通过立体重建的区域,
*例如,由于闭塞或缺少纹理。您将看到inpainting_ced创建了一个具有相对锐利边缘的重构。
dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 672, 484, 'black', WindowHandle)
* 设置少吃点参数
gen_cam_par_area_scan_division (0.0130507774353, -665.817817207, 1.4803417027e-5, 1.48e-5, 155.89225769, 126.70664978, 320, 240, CamParamL)
gen_cam_par_area_scan_division (0.0131776504517, -731.860636733, 1.47997569293e-5, 1.48e-5, 162.98210144, 119.301040649, 320, 240, CamParamR)
create_pose (0.153573, -0.003734, 0.0447354, 0.174289, 319.843388, 359.894955, 'Rp+T', 'gba', 'point', RelPose)
* 生成一校正映射
gen_binocular_rectification_map (MapL, MapR, CamParamL, CamParamR, RelPose, 1, 'geometric', 'bilinear', RectCamParL, RectCamParR, CamPoseRectL, CamPoseRectR, RectLPosRectR)
* 读取立体图像对,增强对比度,并对图像执行一般变换
read_image (ImageL, 'stereo/board/board_l_01')
read_image (ImageR, 'stereo/board/board_r_01')
emphasize (ImageL, ImageL, 7, 7, 1)
emphasize (ImageR, ImageR, 7, 7, 1)
map_image (ImageL, MapL, ImageRectifiedL)
map_image (ImageR, MapR, ImageRectifiedR)
* 确定距离图像。
binocular_distance (ImageRectifiedL, ImageRectifiedR, DistanceImage, ScoreImageDistance, RectCamParL, RectCamParR, RectLPosRectR, 'ncc', 17, 17, 5, 10, 40, 1, 0.1, 'left_right_check', 'interpolation')
* 在使用inpainting_ced执行inpainting之前,我们必须创建合适的凝视值。这是通过harmonic_interpolation来实现的。
*确定图像修补区域。它由binocular_distance返回的域的补码给出。
get_domain (DistanceImage, Domain)
complement (Domain, RegionInpaintingFull)
* harmonic_interpolation与图像的域相交。
*由于inpainting区域是距离图像域的补码,所以交集为空。
* 因此,我们必须使用图像上的全域来绘制。
full_domain (DistanceImage, DistanceImageFull)
harmonic_interpolation (DistanceImageFull, RegionInpaintingFull, HarmonicDistanceImage, 0.00001)
* 我们现在可以用inpainting_ced来执行inpainting。
*与harmonic_interpolation不同,图像修补区域必须与图像边界保持一定的距离。
*因此,我们剪辑inpainting区域。
get_image_size (DistanceImage, Width, Height)
clip_region (RegionInpaintingFull, RegionInpainting, 12, 12, Height - 13, Width - 13)
inpainting_ced (HarmonicDistanceImage, RegionInpainting, InpaintedDistanceImage, 0.5, 3, 0.5, 100)
* 显示距离图像和密集距离图像
dev_clear_window ()
dev_display (DistanceImage)
stop ()
dev_clear_window ()
dev_display (InpaintedDistanceImage)
|