[完结]saliency filters精读之permutohedral lattice

2012年09月28日 22:40:08 工长山 阅读数:12432
 
 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/xuanwu_yan/article/details/7962508

勘误使于2017年3月19日

本文写于2012年硕士生阶段,有较多疏漏和误解,于今日起开始勘误,以最大限度的保留原始文章,同时更正其中错误。

一、背景碎碎念

之前的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得到原始的点。

二、现有成果

由于我读本文重点在于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则在分类上做了改变,有时间再继续读。

三、Permutohedral Lattice

本文贡献

Permutohedral lattice相比之前工作的进步之处于,
  1. 它不仅仅把一个点映射到格子中心表示,而是映射到单形格子的各个顶点上,这样子近似卷积的更加精确;
  2. 由于每个lattice具有同等形态,能够用质心差值插值映射到lattice的各个顶点上;
  3. 并且能够快速在此lattice上找到映射点四周的顶点,这样子两次映射(splat,slice)能够快速进行;
  4. blur阶段可以每一维离散进行,并且一个lattice顶点的周边顶点能够迅速确定,此阶段能够快速进行。

定义

一个d维的permutohedral lattice是d+1维空间子平面分割,此超平面法向量为,所以我们有。什么是分割?一般认为分割的格子(lattice)是同样形状,一个平面能够被相同形状的格子没有缝隙,没有重叠的布满,那么格子就是空间的分割。
我们需要对此子平面进行分割,作者使用了单形进行分割。单形顶点在d+1维空间坐标我们不得而知,作者重新定义了基向量(并不完全准确,因为之间线性相关),于是此子平面上单形顶点的坐标直接满足在平面上的要求,即
当d=3时,单形顶点在原点,单形的边长为1,格子如上图所示。单形的顶点坐标为整数,并且一个点的坐标各项模d+1=3有相同余项k,我们称这个顶点为余k点。这里对上面的基向量稍微做一下解释,假设在三维空间中,有子空间,有
 
在xoy平面上,有三个点,这个点经过映射变换,就对应了上图中的橙色区域,坐标为
也就是说,下图右侧x轴原点y轴夹的右上部分区域,是下图左侧分割空间坐标映射变换
下面的文章都是基于映射后的坐标。

网格性质

子平面具有三个属性:
  1. 这个子平面被相同形状的单形填充,不留缝隙,没有重叠
  2. 子平面中任意一点所在的单形顶点都能以的时间内定义
  3. 单形顶点周围所有的顶点也能以的时间内定义
文章有详细的论证,我们这里简单的说明一下:
这个子平面被相同形状的单形填充,不留缝隙,没有重叠。作者首先证明了一个距离子平面中一点x最近的余0顶点是原点,其充分必要条件是该点坐标最大值与最小值差小于等于d+1。由格子的平移不变性,我们可以得到每个点(不在格子的边上)的最近余0点l都是唯一的,而且可以通过x-l的坐标得到具体在余0点周边具体的单形区域(也唯一)。所以子平面被单形分割,没有缝隙,没有重叠。
子平面中任意一点所在的单形顶点都能以的时间内定义。分两步,先确定最近余0点,然后通过l-x坐标判断所在单形然后计算单形顶点。本文使用Conway&Sloane提出的方法确定最近余0点,给一个坐标,先找出其最近的余0点。具体方法为:坐标向量中每个值找到最近的模d+1余0的值,如果坐标向量1范式值不为0(不在此子平面),则调整坐标中变化最大的那一项,使其向反方向增加或者减少d+1。用时
单形顶点周围的顶点也能以的时间内定义。一个单形顶点所有临近点与其坐标相差为,总共有2(d+1)个这样的点,所以用时

计算高斯卷积

下面介绍利用这个permutohedral lattice计算高斯卷积。

生成特征值映射到子平面的点

首先将每个坐标点除了一个误差,是由splat,blur以及slice中产生的。然后映射到子平面上,注意此时的映射矩阵与上面的不同,因为上面的基向量不是正交的,并且此映射可以用的时间计算出来。
举例bilateral filter,position由5-D向量组成,

计算方法如下:

Splat阶段:

这个阶段主要是把特征点的值使用质心插值的方法,累加到所在单形的所有顶点上。上文已经介绍了如何通过点找到所在单形的顶点。那么质心插值如何计算?

还记得上面图片的橙色三角区域吗,假设其中有一个点y,s是单形的顶点,b是插值系数,那么我们有
作者证明了此阶段时间复杂度是
 
Blur阶段:
查找单形顶点的所有相邻点对,即,使用核函数进行blur操作,此步骤复杂度为
Slice阶段:
同splat阶段步骤,利用权重b计算插值。由于在splat阶段建立了b的table,所以用时O(nd)。
本算法总计用时为O((n+l)d^2)。

 
此图为速度比的等高线,为最快速度和第二快的算法结构用时之比。颜色越深相差越大。图片左侧标志维度,横轴为filter size,右侧为使用的算法。
可以看到5-20维度时候permutohedral lattice根据filter size情况最优。

完结。

permutohedral lattice理解的更多相关文章

  1. Computer Graphics Research Software

    Computer Graphics Research Software Helping you avoid re-inventing the wheel since 2009! Last update ...

  2. 快速双边滤波 附完整C代码

    很早之前写过<双边滤波算法的简易实现bilateralFilter>. 当时学习参考的代码来自cuda的样例. 相关代码可以参阅: https://github.com/johng12/c ...

  3. 论文阅读笔记十一:Rethinking Atrous Convolution for Semantic Image Segmentation(DeepLabv3)(CVPR2017)

    论文链接:https://blog.csdn.net/qq_34889607/article/details/8053642 摘要 该文重新窥探空洞卷积的神秘,在语义分割领域,空洞卷积是调整卷积核感受 ...

  4. 论文阅读笔记九:SEMANTIC IMAGE SEGMENTATION WITH DEEP CONVOLUTIONAL NETS AND FULLY CONNECTED CRFS (DeepLabv1)(CVPR2014)

    论文链接:https://arxiv.org/abs/1412.7062 摘要 该文将DCNN与概率模型结合进行语义分割,并指出DCNN的最后一层feature map不足以进行准确的语义分割,DCN ...

  5. lattice diamond fpga 状态机的理解

    比如序列检测101,需要三个状态 :so,s1,s2. 思路:(1)s0状态有两种情况0或1,若为0时在自身打圈,是1时进入s1状态. (2)s1状态有两种0或1,若为1自身打圈,因为1可以作为下次检 ...

  6. Lattice Diamond 学习之编译、检查和设置约束

    在新建工程以及完成代码的输入之后.则就要进行编译,并检测错误. 一. Generate Hierarchy(产生层次结构). 1. 点击Generate Hierarchy 图标或者Design -- ...

  7. 【心得】Lattice Diamond 后端约束实战小结

    [博客导航] [导航]FPGA相关 IOB约束 参考<插入IO寄存器和位置约束---lattice&diamond>,推荐的方法是: 1.在strategy设置[Map Desig ...

  8. 【Static Program Analysis - Chapter 4】格理论(Lattice Theory)与程序分析

    # 从一个例子说起, **任务:给定这样一段代码,假设我们想分析出这段代码中,每个数值型变量和表达式的符号,即正数,负数或0.** 此外,还有可能出现两种情况就是: 1.我们无法分析出结果,即我们无法 ...

  9. [SPOJ VLATTICE]Visible Lattice Points 数论 莫比乌斯反演

    7001. Visible Lattice Points Problem code: VLATTICE Consider a N*N*N lattice. One corner is at (0,0, ...

随机推荐

  1. Linux下载软件

    .yum yum install tree yum install telnet 直接安装与更新 .查询软件是否装上 rpm -qa tree telnet .查询软件包的内容 rpm -ql tre ...

  2. 原生CSS设置网站主题色—CSS变量赋值

    定义CSS变量 在css文件顶部定义css变量,注意必须以--开头,使用:root包括这几个变量 :root { --main-bg-color: #ff7675; --color1: #fbfee9 ...

  3. [BZOJ1814]Formula 1

    Description: 一个 m * n 的棋盘,有的格子存在障碍,求经过所有非障碍格子的哈密顿回路个数 Hint: \(n,m<=12\) Solution: 插头dp模板题,注意要讨论多种 ...

  4. [ZJOI2013]K大数查询

    Description: 给定一个序列,支持两种操作 1.在[L,R]的每个位置上加上一个数 (注意一个位置上有多个数) 2.查询[L,R]上所有数中的第K大 Hint: \(n,m<=5e4\ ...

  5. BZOJ3490 : Pa2011 Laser Pool

    与横线以及竖线的交点个数很容易求,那么只要求出横线竖线交点与运动轨迹的交点数即可. 运动轨迹可以划分成若干条贯穿边界的斜线,对于第一条和最后一条,可以用bitset暴力统计. 对于中间的部分,斜线都是 ...

  6. Cheapest Palindrome [POJ3280] [区间DP] [经典]

    一句话题意:每个字母添加和删除都相应代价(可以任意位置 增加/删除),求把原串变成回文串的最小代价 Description 保持对所有奶牛的跟踪是一项棘手的任务,因此农场主约翰已经安装了一个系统来实现 ...

  7. Nginx (LNMP+https)

    单向认证与双向认证的概念 什么是单向认证 单项认证就是比如你有个密码用户名然后和服务器上的用户信息进行比对一致的话你们就可以建立连接. 什么是双向认证 SSL的双向认证就是客户端要获取服务端的证书,检 ...

  8. list-循环小练习(作业已交未交)

    报错 list index out of range : 超出下标   这个错误是因为在写stus列表的时候写成了如下stus=['小花,未交'] ,但是取下标的时候取的是stus[1]:实际该列表中 ...

  9. 通过脚本调用MSBuild编译项目时指定Configuration(解決方案配置)和Platform(解決方案平台),Rebuid(重新生成解决方案),Clean(清理解决方案)

    为了方便打包测试,自己PowerShell写了一个编译和发布的脚本,调用msbuild通过命令行来编译当前解决方案 后来发现一个问题,用VS编译解决方案,我通过 项目属性-Build设置 Releas ...

  10. C# 枚举类型 enum

    我个人感觉平日用到的enum应该是非常简单的,无非就是枚举和整数.字符串之间的转换.最近工作发现一些同事居然不太会用这个东东,于是就整理一下. 枚举类型是定义了一组“符号名称/值”配对.枚举类型是强类 ...