同步更新于github page
Guided Filter一般用来对2D图像进行降噪等处理,实际上,稍作修改后可以对3D点云进行降噪。
从Guided Filter的基本假设出发,可以推导出针对3D数据的处理方法。这里仅考虑引导数据是点云本身的情况。
首先,根据局部线性假设,有
q i = A k p i + b k q_i=A_kp_i+b_k qi=Akpi+bk
其中 q i q_i qi是滤波后输出的三维点, p i p_i pi是当前需要滤波的点(即算法的输入), A k A_k Ak是一个3x3矩阵, b k b_k bk是3x1向量。
我们希望这个局部线性模型,在 p i p_i pi的领域内有最小的重建误差,即
arg min A k , b k ∑ j ∈ N ( i ) ( ∥ A k p j + b k − p j ∥ 2 + ϵ ∥ A k ∥ 2 ) \text{arg}\min_{A_k, b_k}\sum_{j\in N(i)}(\Vert A_kp_j+b_k - p_j\Vert^2+\epsilon\Vert A_k\Vert^2) argAk,bkminj∈N(i)∑(∥Akpj+bk−pj∥2+ϵ∥Ak∥2)
用上式分别对 A k A_k Ak和 b k b_k bk求导,并令导数等于0,可得
A k ( ∑ j ∈ N ( i ) p j p j T + n ϵ I ) + b k ∑ j ∈ N ( i ) p j T − ∑ j ∈ N ( i ) p i p i T = 0 b k = 1 n ∑ j ∈ N ( i ) p j − A k 1 n ∑ j ∈ N ( i ) p j = μ i − A k μ i \begin{aligned} &A_k(\sum_{j\in N(i)}p_jp_j^T+n\epsilon I)+b_k\sum_{j\in N(i)}p_j^T-\sum_{j\in N(i)}p_ip_i^T=0 \\ &b_k=\frac{1}{n}\sum_{j\in N(i)}p_j-A_k\frac{1}{n}\sum_{j\in N(i)}p_j=\mu_i-A_k\mu_i \end{aligned} Ak(j∈N(i)∑pjpjT+nϵI)+bkj∈N(i)∑pjT−j∈N(i)∑pipiT=0bk=n1j∈N(i)∑pj−Akn1j∈N(i)∑pj=μi−Akμi
其中 n n n是 p i p_i pi的领域 N ( i ) N(i) N(i)中的点数(包括 p i p_i pi自己), μ i \mu_i μi是 N ( i ) N(i) N(i)中所有点的平均,将 b k b_k bk带入第一个等式中,且等式两边同时除以 n n n,有
A k ( 1 n ∑ j ∈ N ( i ) p j p j T − μ i μ i T + ϵ I ) = 1 n ∑ j ∈ N ( i ) p j p j T − μ i μ i T A_k(\frac{1}{n}\sum_{j\in N(i)}p_jp_j^T-\mu_i\mu_i^T+\epsilon I) = \frac{1}{n}\sum_{j\in N(i)}p_jp_j^T-\mu_i\mu_i^T Ak(n1j∈N(i)∑pjpjT−μiμiT+ϵI)=n1j∈N(i)∑pjpjT−μiμiT
注意到
1 n ∑ j ∈ N ( i ) p j p j T − μ i μ i T = Σ i \frac{1}{n}\sum_{j\in N(i)}p_jp_j^T-\mu_i\mu_i^T=\Sigma_i n1j∈N(i)∑pjpjT−μiμiT=Σi
即领域 N ( i ) N(i) N(i)中所有点的协方差矩阵,所以最终有
A k = Σ i ( Σ i + ϵ I ) − 1 b k = μ i − A k μ i \begin{aligned} A_k&=\Sigma_i(\Sigma_i+\epsilon I)^{-1} \\ b_k&=\mu_i-A_k\mu_i \end{aligned} Akbk=Σi(Σi+ϵI)−1=μi−Akμi
于是针对点云的Guided Filter算法,可概况为
上面的算法实际上对Guided Filter做了一些简化,原本的Guided Filter需要得到所有包含 p i p_i pi的领域对应的 A k A_k Ak和 b k b_k bk,并对这些 A k , b k A_k,b_k Ak,bk求平均,再输出 q i = A ˉ k p i + b ˉ k q_i=\bar A_kp_i+\bar b_k qi=Aˉkpi+bˉk。
三维情况的Guided Filter依然保持了二维情况的优点,即对边缘或者尖锐形状的地方有较好的保护作用。平滑作用的强弱可以通过调节领域搜索时的半径 r r r和 ϵ \epsilon ϵ来改变。
其实,双边滤波(Bilateral Filter)也能用于3D点云的降噪,而Guided Filter相对于双边滤波在三维情况下的最大优势,在于不用估计点云中每个点的法线方向。
Python源码可见github.