The Fast Bilateral Solver 快速双边求解器 双边网格可视化展示

The Fast Bilateral Solver 快速双边求解器

一. 前言

双目相机拍到的原始图后计算出来的深度图a,右图则是通过FBS算法得到的图像b。
在这里插入图片描述
使用这个算法优化计算后的深度图我们还需要两个图像信息,一个是置信图c,c中的元素越接近1,a中相应元素的正确概率就越高。还有是原始图像的RGB像素图d。
在这里插入图片描述

二. 算法的原理与优化步骤

2.1 创建双边空间优化全局代价函数

下面文章作者构建的代价函数,加号前面一项是平滑项,后面一项是数据项,接下来我们就是要最小化这个式子:
m i n i m i z e x λ 2 ∑ i , j W i , j ( x i − x j ) 2 + ∑ i c i ( x i − t i ) 2 (1) \tag{1} \Large \mathop{minimize}\limits_{x} \frac{\lambda}{2} \sum^{}_{i,j}W_{i,j}(x_i - x_j)^2 + \sum^{}_{i}c_i(x_i - t_i)^2 xminimize2λi,jWi,j(xixj)2+ici(xiti)2(1)

  • x x x 像素空间的输出图
  • y y y 双边空间的输出图
  • c c c 输入的置信图
  • t t t 输入的待优化图像
  • W W W 双边平滑权重

平滑项 λ 2 ∑ i , j W i , j ( x i − x j ) 2 \frac{\lambda}{2} \sum^{}_{i,j}W_{i,j}(x_i - x_j)^2 2λi,jWi,j(xixj)2中的 x i x_i xi x j x_j xj 是一幅视差图中不同位置的像素的视差值。这个时候,我们要把视差图看作展开的一维向量。一个宽高分别为 w 和 h 的视差图,展开后就是 ( w ∗ h , 1 ) (w*h,1) (wh,1)的一维向量,于是 i i i j j j 就是不同像素的编号,或者坐标值。

W W W矩阵,是在YUV域的双边滤波矩阵,如果x是一个一维表示的尺寸为 ( w ∗ h , 1 ) (w*h,1) (wh,1)的图像,我们可以用下面的公式来表示双边滤波:
y = W x W 1 ⃗ (2) \tag{2} \Large y = \frac{Wx}{W\vec{1}} y=W1 Wx(2)
y y y即是滤波后的图像,为 ( w ∗ h , 1 ) (w*h,1) (wh,1)的一维向量。
这里的矩阵 W W W是一个对称的矩阵,尺寸是 ( w ∗ h , w ∗ h ) (w*h,w*h) (wh,wh)。对于彩色图像的双边滤波, W W W矩阵的每个元素如下:
W i , j = e x p ( − ∣ ∣ ( p i x , p j y ) − ( p i x , p j y ) ∣ ∣ 2 2 σ x y 2 − ( p l x − p l y ) 2 2 σ x y 2 − ∣ ∣ ( p i u , p j v ) − ( p i u , p j v ) ∣ ∣ 2 2 σ x y 2 ) (3) \tag{3} \Large W_{i,j} =exp(-\frac{||(p^x_i,p^y_j)-(p^x_i,p^y_j)||^2}{2\sigma_{xy}^2}-\frac{(p^x_l-p^y_l)^2}{2\sigma_{xy}^2}-\frac{||(p^u_i,p^v_j)-(p^u_i,p^v_j)||^2}{2\sigma_{xy}^2}) Wi,j=exp(2σxy2∣∣(pix,pjy)(pix,pjy)22σxy2(plxply)22σxy2∣∣(piu,pjv)(piu,pjv)2)(3)
这么说还是太抽象了,让我们可视化一下,下面图像是一张 16x16 的黑白图像,每个像素用黑白方块表示。所以双边滤波矩阵的大小为 ( 256 , 256 ) (256,256) (256,256)

在这里插入图片描述

如上图所示,首先一张 16X16 的灰度图变为 ( 256 , 1 ) (256,1) (256,1)的向量,左乘一个滤波矩阵,得到一个新的 ( 256 , 1 ) (256,1) (256,1)的向量,reshape一下就得到了滤波之后的图像。大家看懂了吗?如果能回答下面的问题,就可以说是看懂了

  1. 图中的滤波矩阵分别都是什么类型的滤波矩阵?
  2. 两个滤波矩阵有什么不同?(颜色的亮度代表亲和力的强弱,越亮的代码亲和力越强)

2.2 由双边滤波到双边网格

好了,现在我们知道什么是滤波矩阵了,那么问题又来了,如果我们的图片是 1280X720 的图像,那将是一个巨大的计算灾难(1280x720,1280x720)。这时就用到了我们一开始提到的思想:将大规模问题转换为小规模问题。其中有一种称为双边网格的方法,这是2007年Chen Jiawen等人提出的。

依然将上面的 16x16 的黑白灰度图像中的每个像素,按照其x坐标、y坐标、灰度值I,被分组放到了一个小盒子中,这时候坐标和灰度值就相当于小盒子的门牌号。实际在我们操作时,不可能让小盒子中只放一个像素,将一幅2D的灰度图像中的每个像素。所以可能会让 ( x , y , I ) ∈ ( ( x 1 , x 2 ) , ( y 1 , y 2 ) , ( I 1 , I 2 ) ) (x,y,I)\in((x_1,x_2),(y_1,y_2),(I_1,I_2)) (x,y,I)((x1,x2),(y1,y2),(I1,I2))的像素被分到同1个小盒子中,这时候小盒子中可能会存在一个或多个像素。还是很抽象我们依然使用上面 ( 16 , 16 ) (16,16) (16,16)图像来说明:

在这里插入图片描述

红色框是 ( x , y , I ) ∈ ( ( x 1 , x 2 ) , ( y 1 , y 2 ) , ( I 1 , I 2 ) ) (x,y,I)\in((x_1,x_2),(y_1,y_2),(I_1,I_2)) (x,y,I)((x1,x2),(y1,y2),(I1,I2));蓝色框是小盒子
Splat矩阵记录了像素到小盒子的变化,所以它的转置矩阵就是小盒子返回到红色框。
之后我们称红色框为网格宽度,小盒子为格点,格点组成了新的向量,特别像数据聚类,从而实现了数据量的压缩。

现在我们仅仅是得到一个小规模的数据的变化矩阵,依然没有生成滤波矩阵,所以我们需要对每个格点生成滤波矩阵,每个格点中其实隐藏了3个纬度的信息,所以需要对三个纬度的信息分别做滤波,为了方便计算使用 [ 1 , 2 , 1 ] [1,2,1] [1,2,1]滤波核

在这里插入图片描述

每个 B B B矩阵每行不超过3个非零元素,在大多数文献中,双边网格是用双线性插值实现的,并且是“密集的”即使没有填充顶点,也会创建顶点,模糊矩阵近似为每个维度的模糊矩阵的外积。相比之下,本文的简化网格是“稀疏的”,没有分配像素的顶点永远不会被创建。这使得网格可以扩展到比密集的双边网格更高的维度。

请注意,因为我们的模糊操作是模糊的和而不是一个结果,每个模糊可以有效地并行计算。
为了更好地理解这些作为矩阵因式分解的双边表示,请参见图:
在这里插入图片描述

从上往下分别为网格宽度是8,4,2的双边网格矩阵。
由于双边网格的规模远远小于原始图像,比如一幅100万像素的图像投射到双边网格中可能只有10万个格子。而高斯滤波又比双边滤波的计算量低很多。因此通过这样的方式,就可以实现非常快速的双边滤波了。
总结一下:
把从原始图像到双边空间的过程称为Splat,在双边空间中进行滤波称为Blur,把滤波后的结果转换到原始图像像素空间中的过程称为Slice。 Splat-Blur-Slice,就是这类方法的三个重要步骤。由于高斯滤波是可以分解的,在双边网格中的高斯滤波可以变换为每个维度上(对于1维图像来说是space和intensity两个维度,对于RGB图像是x,y,r,g,b五个纬度)分别进行的一维滤波相加的结果(这是一种近似):

W ≈ W ^ = S T B S (4) \tag{4} \Large W \approx \hat{W} = S^T B S WW^=STBS(4)

  • S S S splat
  • B B B blur
  • S T S^T ST slice

现在我们终于可以回到主线任务中了,最小化公式 ( 1 ) (1) (1)

2.3 双随机矩阵

文中使用了一种迭代算法,该算法将矩阵的每一行和每列的 ∞ ∞ 范数渐近地缩放为1(双随机矩阵)。这种缩放算法保持了原始矩阵的对称性,并以1/2的渐近速率显示出快速的线性收敛。对于1范数的情况,收敛是线性的,其速率依赖于缩放矩阵的谱。使用缩放算法通过减少旋转的需要来帮助直接求解。特别是对于对称矩阵。下面是双随机对称矩阵的求解步骤:
在这里插入图片描述

然后公式 ( 1 ) (1) (1)整理为:
m i n i m i z e y = 1 2 y T ( λ ( D m − D n B ‾ B n ) + d i a g ( S c ) ) y − ( S ( d i a g ( c ) t ) ) T + 1 2 ( d i a g ( c ) t ) T t ,其中 y = S x (5) \tag{5} \Large \mathop{minimize}\limits_{y} = \frac{1}{2} y^T(\lambda(D_m-D_n\overline{B}B_n)+diag(S_c))y - (S(diag(c)t))^T+\frac{1}{2}(diag(c)t)^Tt ,其中y=Sx yminimize=21yT(λ(DmDnBBn)+diag(Sc))y(S(diag(c)t))T+21(diag(c)t)Tt,其中y=Sx(5)
然后我们用标准二次型重写他:
m i n i m i z e y 1 2 y T A y − b T y + c (6) \tag{6} \Large \mathop{minimize}\limits_{y} \frac{1}{2} y^TAy -b^Ty+c yminimize21yTAybTy+c(6)
A = λ ( D m − D n B ‾ B n ) + d i a g ( S c )       b = S ( d i a g ( c ) t )      c = 1 2 ( d i a g ( c ) t ) T t \Large A=\lambda(D_m-D_n\overline{B}B_n)+diag(S_c) \ \ \ \ \ b=S(diag(c)t) \ \ \ \ c=\frac{1}{2}(diag(c)t)^Tt A=λ(DmDnBBn)+diag(Sc)     b=S(diag(c)t)    c=21(diag(c)t)Tt
通过对该损失函数求导并将其设为零,我们可以看到最小化该二次形式等价于求解稀疏线性系统。

2.4 共轭梯度法求解

最后就是求解 A x = B Ax=B Ax=B。本文的求解算法是预条件共轭梯度法,我们首先来介绍一下共轭梯度法共轭梯度法(Conjugate Gradient),它是介于最速下降法与牛顿法之间的一个方法,它仅需利用一阶导数信息,但克服了最速下降法收敛慢的缺点,又避免了牛顿法需要存储和计算Hesse矩阵并求逆的缺点。多用于解维度高的稀疏线性方程组,其优点是所需存储量小,具有步收敛性,稳定性高,而且不需要任何外来参数。
共轭梯度法怎么理解?共轭梯度法对最优梯度法进行了修正,搜索方向为共轭方向,将负梯度方向旋转了一个角度,每次往最优方向需要在负梯度方向进行修正。
什么是共轭方向那?设 Q Q Q是正定矩阵,若对于两不同的非零向量 d i T , d j d_i^T,d_j diT,dj满足:
d i T Q d j = 0 (6) \tag{6} \Large d_i^T Q d_j = 0 diTQdj=0(6)
则称 d i T , d j d_i^T,d_j diT,dj关于 Q Q Q共轭, d i T d_i^T diT d j d_j dj是共轭方向。
再说说什么是共轭共轭向量组:如果一组方向 d 0 , d 1 , . . . d n − 1 d_0,d_1,...d_{n-1} d0,d1,...dn1中任意两个满足向量 d i , d j d_i,d_j di,dj满足公式 d i T Q d j = 0 d_i^T Q d_j = 0 diTQdj=0,即为共轭向量组,且共轭向量组中的向量一定线性无关。

下面分别为梯度下降法,共轭梯度法,预处理共轭梯度法
在这里插入图片描述

对于n阶线性方程组,通常最多n+1次迭代可以获得收敛。但是在极端大的线性方程组,此时,采用共轭梯度法,有时可能需要上万次的迭代才能收敛,虽然每次收敛的计算量并不大,但是整体求解也会花费较多时间。此时共轭梯度法能否快速收敛与系数矩阵A密切相关。
对于共轭梯度法存在以下定理:
如果 A = I + B A=I+B A=I+B为 nxn 的对称正定矩阵,且 r a n k ( B ) = r rank(B)=r rank(B)=r,则共轭梯度法至多 r + 1 r+1 r+1步收敛。其中I指单位矩阵,rank是矩阵的秩。
从该定理可知,共轭梯度法能否快速收敛,主要取决于 A A A是否“接近于”单位矩阵。特别地,当 A A A就是单位矩阵时, r a n k ( B ) = 0 rank(B)=0 rank(B)=0,此时一步即可收敛,当然这是很显然的。基于上述定理,多种基于共轭梯度法法衍生的预处理共轭梯度法(PCG)得以广泛地应用
采用不同的M,最终影响共轭梯度法的收敛性。很显然,对于整个原始方程的PCG求解效率来说,首先这个预处理方程需要比较容易求解,否则求解该预处理方程就已经花费了较多时间,则整个原始方程求解效率自然不会高。其次,M的选取需要确实能够减少迭代步数。这两方面在实际中往往是冲突的。
对角线预处理:对角线预处理指的就是M矩阵为原始系数矩阵A的对角线矩阵。一般情况下,这种方法求解预处理方程十分简单,但是通常对于系数矩阵严格对角占优(即对角线元素大于该行其他元素之和)的情况下才比较有效。

三. 应用

双边求解器是一种灵活和快速诱导边缘感知平滑的技术。FBS的不仅可以用于优化初始的视差图,还能做视差图或深度图图的超分辨率重建。这里有一个低质量的输入视差图,以及一个参考图像,通过FBS可以得到高质量的输出图像。

在这里插入图片描述

另外一个应用是用户引导的灰度图像上色。这里也有低质量的输入图像y,即用户指定的最终色彩图像的骨架,原始的灰度图像则作为参考图像。再指定一个置信度图c,我们一样通过FBS求解输出彩色图像x,并且要求x自身相对参考图像来说是双边平滑的,同时还在高置信度的区域和用户输入y尽可能一致。

在这里插入图片描述

参考文档

[1] Barron, Jonathan T,B Poole ,The Fast Bilateral Solver, DOI:10.48550/arXiv.1511.03296

[2]JT Barron,A Adams,YC Shih,C Hernandez Fast bilateral-space stereo for synthetic defocus DOI : 10.1109/CVPR.2015.7299076

[3]J Chen,S Paris,F Durand,Real-time edge-aware image processing with the bilateral grid DOI:10.1145/1276377.1276506

[4]BORA,UAR,DANIEL,RUIZ,PHILIP,A.,KNIGHT,A Symmetry Preserving Algorithm for Matrix Scaling https://doi.org/10.1137/110825753

[5]JL Nazareth,Conjugate gradient method DOI:10.1002/wics.13

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值