版权声明:本文为博主原创文章,未经博主容许不得转载。 https://blog.csdn.net/xuanwu_yan/article/details/7962508
勘误使于2017年3月19日
本文写于2012年硕士生阶段,有较多疏漏和误解,于今日起开始勘误,以最大限度的保留原始文章,同时更正其中错误。html
1、背景碎碎念
以前的saliency filter引用了一篇Adams的Fast high-dimensional filtering using the permutohedral lattice,2010(见引用4),看了不少遍,感受因为篇幅受限略过去了不少东西,数学又是属于基础的问题,看起来很慢。不死心继续搜,终于功夫不负有心人,找到了Adams在2011年写的HIGH-DIMENSIONAL GAUSSIAN FILTERING FOR COMPUTATIONAL PHOTOGRAPHY(
Pdf)博士毕业论文,全文133页,详细阐明了新提出的两种高斯卷积加速方法:一个就是本篇中要详细讲的利用permutohedral lattice,第二种使用了Gaussian KD-Tree。
文章首先在开始处介绍了几种Gaussian滤波的家族成员:双边滤波,joint-双边滤波,joint-双边滤波upsample,以及Non-local Means的主要函数形式,以及在图片处理中的效果。下面是高维高斯滤波的函数形式:
左边为位置i的新数值(通常为颜色),向量表示;pi表示当前点的特征值,pj为窗口空间中剩余点的特征值,

,
对于此处为何有个1,个人理解是为了保证窗口中权值之和为1须要除一个参数,新获得rgb值缺乏这么一个参数,因而就有了这个1
咱们分析不一样滤波方式中特征值不一样产生的影响:
1)在普通的高斯滤波中有
也就是说当前像素点周围只是位置的远近影响新的值;
2)而双边滤波中
致使颜色迥异的点时权值近似为零。(后来我才知道这里放的两只黑狗照片是做者拍摄地,有钱淫,他的Stanford主页上还有各类旅游风景照,口水ing)这里先作简单介绍,实现代码与此有关。此后又对以上几种方法进行了图片(Canon 400D at ISO 1600.)处理的对比,发现对于非高斯噪点,joint-双边滤波对人眼表现最好,但Non-local Means处理后的照片最真实。
说了这么多,其实做者的意思就是高斯卷积在图片处理中处于使用量巨大,可是同时速度很慢的一个技术,如何快速计算高斯卷积是一项灰常灰常重要的事。
本文思想
下面轮到介绍本文的基本思想了,也许各位也看过了不少遍吧。。。
1)用新建坐标系,用pi表示特征值节点坐标而不是原始的(x, y),vi保持不变
2)投影映射,就是坐标变换,降维的步骤在此处进行。一个坐标不是投影到一个点,而是相似于重心插值投影到一个单形(lattice)各个顶点处,保留各顶点的权值为之后的upsample保存。若两个不一样的点投影到相同的顶点坐标时,增大此点值。
3)对lattice的顶点计算高斯卷积
4)upsample获得原始的点。
2、现有成果
因为我读本文重点在于permutohedral lattice,因此那些滤波之类的就只作了一下简单了解,joint-双边滤波-upsample和Non_local Means真心没有搞懂,这里也不瞎作介绍。而后有一幅图挺重要的,具体对比了Gaussian Filter这些年的进步。
1)Naive方法只是单纯地将窗口中全部点进行卷积,时间复杂度O(mn^d);
2)快速高斯卷积方法首先将格子中的每一个点都放在了格子的重心上,时间复杂度O(mk^d),因为格子的个数k小于point的个数n,因此提速;
3)双边方格卷积在上面的基础上,不对每一个点卷积,而是对格子的每一个顶点卷积,最后使用插值方式恢复特征点,复杂度变为O(k^(d+1)),特征点的个数多于格子的个数,因此有加速,但此方法有个缺点就是对于维度仍然是指数复杂度,对高维特征的高斯滤波不合适(d>3 or d>5)
4)改进的快速高斯卷积,不局限于方格而是簇概念,每一个簇能够是跨维度的形状,双边滤波改进处就是在中心表示以后,直接对重心进行blur,而后在插值造成原来的点,时间复杂度O(mkd);
5)本文在第一步采用了新的方法,经过提升维度的方法将格子原来的grid变成了文中的permutohedral lattice,时间复杂度也是O(nd^2),但因为使用质心插值方法,可以产生更加优秀的效果;高斯Kd-tree则在分类上作了改变,有时间再继续读。
3、Permutohedral Lattice
本文贡献
Permutohedral lattice相比以前工做的进步之处于,
- 它不只仅把一个点映射到格子中心表示,而是映射到单形格子的各个顶点上,这样子近似卷积的更加精确;
- 因为每一个lattice具备同等形态,可以用质心差值插值映射到lattice的各个顶点上;
- 而且可以快速在此lattice上找到映射点四周的顶点,这样子两次映射(splat,slice)可以快速进行;
- blur阶段能够每一维离散进行,而且一个lattice顶点的周边顶点可以迅速肯定,此阶段可以快速进行。
定义
一个d维的permutohedral lattice是d+1维空间子平面分割,此超平面法向量为
![\vec{1}=[1,1,...,1]](http://static.javashuo.com/static/loading.gif)
,因此咱们有

。什么是分割?通常认为分割的格子(lattice)是一样形状,一个平面可以被相同形状的格子没有缝隙,没有重叠的布满,那么格子就是空间的分割。
咱们须要对此子平面进行分割,做者使用了单形进行分割。单形顶点在d+1维空间坐标咱们不得而知,做者从新定义了基向量(并不彻底准确,由于之间线性相关),因而此子平面上单形顶点的坐标直接知足在平面上的要求,即

。
当d=3时,单形顶点在原点,单形的边长为1,格子如上图所示。单形的顶点坐标为整数,而且一个点的坐标各项模d+1=3有相同余项k,咱们称这个顶点为余k点。这里对上面的基向量稍微作一下解释,假设在三维空间中,有子空间

,有
在xoy平面上,有三个点

,这个点通过映射变换,就对应了上图中的橙色区域,坐标为
也就是说,下图右侧x轴原点y轴夹的右上部分区域,是下图左侧分割空间坐标映射变换
下面的文章都是基于映射后的坐标。
网格性质
子平面具备三个属性:
- 这个子平面被相同形状的单形填充,不留缝隙,没有重叠
- 子平面中任意一点所在的单形顶点都能以
的时间内定义
- 单形顶点周围全部的顶点也能以
的时间内定义
文章有详细的论证,咱们这里简单的说明一下:
这个子平面被相同形状的单形填充,不留缝隙,没有重叠。做者首先证实了一个距离子平面中一点x最近的余0顶点是原点,其充分必要条件是该点坐标最大值与最小值差小于等于d+1。由格子的平移不变性,咱们能够获得每一个点(不在格子的边上)的最近余0点l都是惟一的,并且能够经过x-l的坐标获得具体在余0点周边具体的单形区域(也惟一)。因此子平面被单形分割,没有缝隙,没有重叠。
子平面中任意一点所在的单形顶点都能以

的时间内定义。分两步,先肯定最近余0点,而后经过l-x坐标判断所在单形而后计算单形顶点。本文使用Conway&Sloane提出的方法肯定最近余0点,给一个坐标,先找出其最近的余0点。具体方法为:坐标向量中每一个值找到最近的模d+1余0的值,若是坐标向量1范式值不为0(不在此子平面),则调整坐标中变化最大的那一项,使其向反方向增长或者减小d+1。用时

。
单形顶点周围的顶点也能以

的时间内定义。一个单形顶点全部临近点与其坐标相差为
![\pm [-1,...,-1,d,-1,...-1]](http://static.javashuo.com/static/loading.gif)
,总共有2(d+1)个这样的点,因此用时

。
计算高斯卷积
下面介绍利用这个permutohedral lattice计算高斯卷积。
生成特征值映射到子平面的点
首先将每一个坐标点除了一个偏差,是由splat,blur以及slice中产生的。而后映射到子平面上,注意此时的映射矩阵与上面的不一样,由于上面的基向量不是正交的,而且此映射能够用

的时间计算出来。
举例bilateral filter,position由5-D向量组成,
计算方法以下:
Splat阶段:
这个阶段主要是把特征点的值使用质心插值的方法,累加到所在单形的全部顶点上。上文已经介绍了如何经过点找到所在单形的顶点。那么质心插值如何计算?
还记得上面图片的橙色三角区域吗,假设其中有一个点y,s是单形的顶点,b是插值系数,那么咱们有
做者证实了此阶段时间复杂度是

。
Blur阶段:
查找单形顶点的全部相邻点对,即
![\hat{l}_i\pm [-1,...,-1,d,-1,...,-1]](http://static.javashuo.com/static/loading.gif)
,使用核函数进行blur操做,此步骤复杂度为

。
Slice阶段:
同splat阶段步骤,利用权重b计算插值。因为在splat阶段创建了b的table,因此用时O(nd)。
本算法总计用时为O((n+l)d^2)。
此图为速度比的等高线,为最快速度和第二快的算法结构用时之比。颜色越深相差越大。图片左侧标志维度,横轴为filter size,右侧为使用的算法。
能够看到5-20维度时候permutohedral lattice根据filter size状况最优。
完结。算法