本文为转载,原博客地址为:http://blog.csdn.net/jorg_zhao/article/details/51328966

前言

大概是两个月之前开始学习曲率滤波,从一个完全一无所知的状态开始学习的,包括微分几何等相关基础知识也是未曾学习过的,从初学者的角度学习曲率滤波。现在新加坡南阳理工大学任教的龚元浩老师在其2015年博士论文中的第六章给出了理论基础和实际的应用,包括去噪平滑等,首先针对性的构造了高斯曲率滤波器,给出了详细的理论基础,主要是从微分几何的角度分析了其思想的根本来源,简言之就是通过某种合理的像素点投影映射将原始图像3维曲面映射成可展曲面,这里有个重要的知识点是:最小化平均曲率Mean Curvature会导致极小曲面,最小化高斯曲率Gaussian Curvature会导致可展曲面,可展曲面能够很好的保留边缘信息,因此就涉及了文中所说的ADAP-As Developable As Possible,使曲面尽可能可展。这是最基本的思想,具体的展开学习下面开始,或有理解错误的地方,才疏学浅,难免有误,见谅!

1. 概述

曲率滤波解决的问题其实是求解变分模型,相比之前的扩散方法或梯度下降法等,曲率滤波是从微分几何的角度最小化相关曲率来实现最小化正则项的方法,作为一个初学者,在真正学习曲率滤波之前,必须要了解的几个问题,归纳整理一下,也是我在学习过程中,必须要迈过去的坎。

1.1 适定性/病态问题

适定性问题,英文是well-posed problem,病态问题,英文是ill-posed problem,从离散样本中估计真实图像通常都是病态问题,比如去模糊deblurring,点云图像的曲面拟合estimated surface from point image

那么到底什么是病态问题呢?

给定图像f(x),如果x从x增加到x*,则△x=x-x*,其相对误差是△x/x,f(x*)的相对误差是(f(x)-f(x*))/ f(x),因此相对误差比是

|(f(x)-f(x∗) / f(x) )| / | Δx/x |= C_p

C_p叫做条件数condition number。如果条件数足够大,相对误差比也将会很大,这种问题叫病态问题,简言之就是自变量变化,结果就会出现大的变化,从而导致问题不易求解。

那么到底如何求解病态问题呢?

病态问题必须要添加正则项或先验,有关正则项的研究,已经有很多相关论文给出了求解方法,在龚元浩老师的PPT中有下面的总结和描述:

分段常数、分段线性和分段平滑的意思,按我的理解,现在正在看相关的论文,还处在刚开始接触的阶段,可能会有误,在图像分割问题中,如果将原始图像有意图的分割成2个区域,那么每个区域中的像素值是近似的,在过两个分割区域的边界时,像素值变化是剧烈的,分段常数就是说分割之后的两个块区域的函数表达式是分段常数的,不同的区域有不同的值,那么引申而来的,分段线性就是分割函数是分段线性的,分段平滑也类似的理解。

1.2 微分几何基础知识

从“曲率滤波”字面意思就能看出,关键词是曲率,曲率的概念在高等数学中简单的提及到,但是当初的知识点无法支撑我们现在所要研究的领域,因此,简单的对曲率的学习是必不可少的,本文所及的曲率有两个重要类型---高斯曲率Gaussian Curvature和平均曲率Mean Curvature,如图3:

曲面上的一点有一切平面tangent plane,此点处会有各个方向上的曲率,但是必然会有最大主曲率和最小主曲率,k1是最小主曲率,k2是最大主曲率,则平均曲率和高斯曲率的定义如上,具体的微分几何求解过程可以参考附件中的文档《曲率滤波---微分几何理论基础》。

1.3 变分学基础

在一般高等数学框架中,我们都知道微分的概念,一般的dy=f'(x)dx,但是这不是最基础的形式,在我整理的文档《曲率滤波---变分学基础》中, 可以得到这样的结论:

△y = f'(x) △x + O(△x)

可见,f'(x) △x是函数增量的主要部分,也是其线性部分,即“线性主要部分”,我们把函数增量的线性主要部分f'(x) △x叫做函数的微分,这才是微分的本质。

那么什么是变分呢?

变分指的是在泛函理论中的“微分”。

那么什么是泛函呢?

把具备某种性质的函数的集合记作D,对于D中的任何函数f(x),即对任意的f(x)∈D,变量Q都有唯一的值与之相对应,那么变量Q叫做依赖于f(x)的泛函,记为

Q = Q[f(x)]   或   Q = Q[f]

简言之就是一般的函数自变量是x,泛函的自变量是函数f(x),微分是一般函数的自变量x的微增量导致f(x)的变化,变分是泛函中的自变量f(x)的微增量导致的Q的变化。

根据一般函数的微分本质的表达方式,泛函中的微分本质的表达方式也可以类似的描述:

△Q = T[y(x), delta y]  + beta[y(x), delta y]

这里,T[y(x), delta y]对delta y而言是线性泛函,即主要部分,而后一项,是相对于max|delta y|的高阶无穷小,那么泛函的变分表示为:

delta Q = T[y(x), delta y]

具体的详细过程请参考附件《曲率滤波---微分几何理论基础》。

2. 高斯曲率滤波器

2.1 序言

根据1.2所述的相关微分几何知识,我们知道高斯曲率的定义,但是在二维图像中,高斯曲率的定义则是:

在去噪算法中,用到的变分模型是,总绝对高斯曲率变分模型:

其中,E(U)是高斯曲率能量,e是演化终止阈值,是个很小的数。

很多文献已经给出了上述问题的求解方法,一般是基于扩散的方法,即diffusion-based algorithm,主要是通过加入伪时间t,直到达到稳定状态或满足终止条件:

初始条件U(t=0,x) = I(x)。这个模型已经通过使用几何流的方法推广到各向异性扩散方法中(Lee and Seo, 2005):

具体的算法可以参考相关文献,这里不详细介绍了。

但是,扩散的方法有两个问题:

1) 收敛速度慢 收敛速度慢,演化时间复杂度从而就高,迭代次数一般就会很高,会达到2,3000。

2) 平滑度的要求 从数值上要显式计算高斯曲率,因而必须要求图像是二次可微的,即可以对图像求微分。

本文提到的高斯曲率滤波器,由于无需显式计算高斯曲率,大大降低了计算复杂度,反而从微分几何的角度,由图像的分段可展曲面去估计图像,这在处理此问题时,就会有如下优势:

1) 在时间和收敛度上,比之前的算法都要快!

2) 滤波器无需显式计算高斯曲率!

3) 滤波器是无参的(备:迭代次数的参数不算在内的话,算无参),且易于实现,还可并行实现,matlab有40行代码,c++少于100行代码。

2.2 理论阐述

可展曲面可由其切平面局部估计得到,如图4所示:

另外,微分几何中有定理1:

此定理的证明过程可以参考龚元浩老师的原文第134页6.1.2.1节的证明。前面我们已知,二维图像中的高斯曲率定义为两个主曲率的乘积,定理1告诉我们的是,任何可展曲面,虽然只有3个可展曲面,其任意点处的高斯曲率为零。因此,最小化其中任意一个主曲率,就相当于最小化高斯曲率!

定理1的结论即是高斯曲率滤波器的理论基础!

由此,我们即可实现高斯曲率的最小化而无需进行高斯曲率的显式计算,即如下式所示,最小化其中较小的主曲率即可实现高斯曲率的最小化:

2.3 域分解方法

局部最小化主曲率绝对值的较小者,受限于相邻像素之间的关联性,因此,提出了一种域分解方法,以去除相邻像素之间的依赖性。

如图5所示,将二维图像中的像素点分成4类,即水平方向和垂直方向上的同类像素点均不相邻:

这种划分实际上有3个好处:

1) 去除了相邻像素之间的依赖性;

2) 由于相邻像素之间的独立性,当前像素值的更新可以利用周围已更新的像素值,因为4类像素的更新是独立进行的,没有先后次序,所以在更新某一类像素时,可以利用周围已经更新过的某些类像素值;

3)在3×3局部窗口中,所有切平面可以枚举出来(切平面如何表示后续会介绍),因此近邻投影(proximal projecting)能够用于使得图像曲面更加可展,这就意味着可以局部的降低高斯曲率;

通过定理1可知,我们需要将原始图像曲面U(x)投影到U`(x),使得U`(x)在相邻像素的闭合切平面上。

首先,确定如何表示其切平面;

然后,确定如何选取投影方法;

2.4 切平面的表示方法

其实,有很多种切平面的表示方法(这在后续实际的应用上体现出了这种表示方法的多样性),在本小节中,选取的是三角构型用于表示曲面的切平面,下面以黑色圆x与其3×3邻域N(x)为例,如图6所示:

这是在此局部窗口中的一个三角切平面,其他的枚举示例下一小节会介绍,得到此切平面之后,我们将红色点,即当前点投影到绿色切平面上,就可以得到当前点到切平面的距离,如图7所示:

2.5 枚举所有类型的投影

为了在局部窗口N(x)中找到最小的投影距离di,需要将所有可能的三角构型切平面枚举出来,如图8所示:

图8(a)给出了一个示例,实际上,以黑色圆形点为中心点,切平面过白色点的三角构型切平面还有3种,也就是说图8(a)中的切平面共有4种,如图9所示:

类似的图8(b)也有4种,图8(c)有4种,其全部给出,如此,在一个3×3的局部窗口中,三角构型切平面共有12种情况,但是仔细看图6和图7可以看出,到切平面的距离di的实际情况没有12种,按照图7所示,图8可以简化为下图:

以图10(a)为例说明一下,黑色圆点到切平面的距离实际上就是黑色圆点到 ”白色圆-黑色圆-白色圆” 线段的距离,这种距离看图7应该可以理解,图10(b)(c)均好理解,这里不赘述了。

2.6 最小投影算子

图2.5节可知,当前点到切平面的投影总共有8种,即当前点到切平面的距离共有8种,{di, i=1,2,...,8},这里使用8种投影距离的最小值作为投影算子,更确切的说,令

然后,利用下式对原始图像的三维曲面进行计算:

完整的算法数值实现伪代码如图11所示:

图11对应于原始论文的第140页 Algorithm 11 。需要说明的是,基于Euler Theorem,我们有

其实,这个欧拉定理原始论文中也是直接给出的,没有参考文献可以参考,暂时这么记住吧! 上式中,k1 k2是两个主曲率,theta(i) 是到主平面的角度,主平面可以参考图3理解。因此,如果角度采样theta(i) 在[-pi, +pi]内是足够致密的(dense enough),可得 | dm | ≈ min{| ki |},其中k1k2≥0,关于di的详细介绍在下一章节中会重点介绍。

2.7 高斯曲率算子

由于之前我们只是针对某一类,比如黑色三角形进行的详细介绍,所以联合其他三类的投影操作就构成了此高斯曲率滤波器,如图12所示:

由于此四类像素是相互独立的,其迭代是互不影响的,因而可以并行运算。

2.8 收敛性证明

在证明高斯曲率滤波器之前,首先证明每一步最小投影算子都可以降低高斯曲率能量E(U),然后再证明高斯曲率滤波器能够降低总能量。

证明:4类像素只需要证明其中一种即可,其余类似,

换句话说,高斯曲率能量是相对于n的单调函数,又能量肯定是对于零的,由单调有界定理可知,高斯曲率滤波器算法2是收敛的。

2.9 小结

其实到这里,曲率滤波的理论部分全都介绍完了,

曲率滤波的理论基础和应用相关推荐

  1. SSE图像算法优化系列二十二:优化龚元浩博士的曲率滤波算法,达到约1000 MPixels/Sec的单次迭代速度...

      2015年龚博士的曲率滤波算法刚出来的时候,在图像处理界也曾引起不小的轰动,特别是其所说的算法的简洁性,以及算法的效果.执行效率等方面较其他算法均有一定的优势,我在该算法刚出来时也曾经有关注,不过 ...

  2. 计算机视觉方向博后,直播回顾 | 深圳大学龚元浩:比几何流快一万倍的曲率滤波算法(附博后招聘)...

    在深度学习.图像处理.流形学习等领域日益发展的今天,曲率作为一种数学方法扮演着至关重要的角色.那么对于离散样本如何进行曲率处理?传统优化曲率的几何流算法又存在什么弊端?面对这些问题,如何找到稳定性好, ...

  3. 图像分析之曲率滤波(困惑篇)

    本文与其说是介绍曲率滤波,倒不如说是叙述在阅读曲率滤波论文和代码时的一些困惑.主要是代码与论文无法对应的困惑,如果你能解决这些困惑,欢迎指教解惑.本文中所述的曲率滤波来自[2015 龚元浩]一文中第六 ...

  4. 曲率高斯滤波去噪python实现(附代码详解)

    曲率高斯滤波去噪python实现(附代码详解) 曲率滤波的理论基础可以参考下曲率滤波的理论基础和应用,这篇博客介绍的思想完美的避开了一大堆数学公式,简直是我的福音,但还是要细看的,不然很容易忽略重点, ...

  5. c语言 算术平均滤波法_基本C语言滤波算法

    11种软件滤波方法的示例程序 假定从8位AD中读取数据(如果是更高位的AD可定义数据类型为int),子程序为get_ad(); 1.限副滤波 /*  A值可根据实际情况调整 value为有效值,new ...

  6. python计算图像的曲率

    由于某些原因,需要计算图像的曲率.找了半天,网上都是曲率滤波的代码,而没有计算图像曲率的代码.于是去找曲率的计算公式,发现公式很简单,所以自己就用python写了一下. 平均曲率的计算公式如下所示 p ...

  7. 三维扫描原理及精度控制

    三维扫描学习目录 一.理论基础 1. 三维扫描原理及精度控制 二.边缘定位(原理) 2. 边缘细定位边缘(求解普遍亚像素边缘) 3. 针对圆型标志点曲率滤波 三.求解标志点圆心 4. 三种基于矩的亚像 ...

  8. 异配图神经网络小结:突破同配性,拥抱异配性

    ©作者 | 薄德瑜.王啸 单位 | 北邮GAMMA Lab 研究方向 | 图神经网络 前言 图神经网络(Graph Neural Networks, GNN)在诸多图任务上的巨大潜力已经有目共睹.众多 ...

  9. 运动目标跟踪(五)--搜索算法预测模型之PF,KF,EKF,UKF比较总结

     http://blog.sina.com.cn/s/blog_7dc49c690100t9dv.html [转载] 之前一直在做移动机器人定位算法.查来查去,发觉粒子滤波算法(又叫MC算法)应该 ...

最新文章

  1. php mvc单入口搭建,PHP实现MVC开发最简单方法是单点入口
  2. 练习五:整数顺序排列
  3. C++自定义自适应中值滤波
  4. [渝粤教育] 西南科技大学 西方经济学 在线考试复习资料
  5. 易驾佳智能机器人教练_机器人教练创始人马宏先生受邀到中国人民大学进行经验分享...
  6. C++学习系列笔记(三)
  7. 《SQL高级应用和数据仓库基础(MySQL版)》学习笔记 ·008【常用函数】
  8. 百度文库文章提取器(下)
  9. Android 12 WiFi 框架
  10. 【路径规划】基于改进差分算法实现三维多无人机协同航迹规划
  11. 吉林大学计算机系2019录取分数线,吉林大学录取分数线2019(在各省市录取数据)...
  12. 如何将计算机网络设置为家庭网络连接打印机共享,怎样设置家庭网络打印机共享...
  13. 华为荣耀android是什么系统,华为荣耀+
  14. ICPC 2019 徐州网络赛
  15. halcon 图像差分_Halcon学习(10)边缘检测(一)
  16. 2015山东毕业生如何进行网上报道(报到证)?
  17. ListView分页详解(非常有用)
  18. 从携程信用卡信息泄露事件谈网上支付安全
  19. 1k求和c语言使用方法,(C语言递归实现)S=1k +2k+……+nK(1的K次方,2的K次方等等),N,K从键盘浏览....
  20. Linux之用户管理、权限管理、程序安装卸载

热门文章

  1. GravitybCamp-链上云计算应用技术分享会
  2. Spring MVC更多家族成员----文件上传---06
  3. 基于卷积神经网络CNN的甘蔗芽体自动识别,卷积神经网络分类预测
  4. 两个对象数组去重的3种方法
  5. Google天涯问答提问遭遇
  6. 补充照片:某基同学使用Bing词典
  7. 一度智信|想要提高店铺流量,商家需要了解这些引流渠道
  8. LoadRunner 11压测时碰到错误Error: missing newline in E:\xx\RCV.dat
  9. uniapp canvas画板
  10. go 并发编程 之 数据竞争 data race (三)