利用Hessian矩阵的滤波函数Frangi,网上的文章只是把论文中的公式贴出来了。

我感觉分析下滤波函数是怎么起作用,还是挺有意思的一件事情。

Frangi滤波方法的论文是:

  Frangi A F, Niessen W J, Vincken K L, et al. Multiscale vessel enhancement filtering[C]//International Conference on Medical Image Computing and Computer-Assisted Intervention. Springer Berlin Heidelberg, 1998: 130-137.

Matlab版程序在:

  https://ww2.mathworks.cn/matlabcentral/fileexchange/24409-hessian-based-frangi-vesselness-filter?s_tid=gn_loc_drop

我改写了一个python版的在:

  https://github.com/yimingstyle/Frangi-filter-based-Hessian

这里我先只说二维方法。

Hessian矩阵是:

$$H=\left[ \begin{matrix} I_{xx} & I_{xy} \\ I_{yx} & I_{yy}  \end{matrix} \right] \tag{1} $$

由于Hessian是二阶偏导数组成的,对噪声非常敏感。就像使用拉普拉斯算子进行边缘检测一样,首先进行平滑非常必要。

所以论文中首先对图像进行高斯滤波,又因为高斯滤波和求Hessian矩阵这两个操作可以同步进行,那就合并了,直接对高斯滤波矩阵求二阶导数了。

但是接下来我们分析Frangi滤波的时候一直带着这个高斯滤波器太麻烦了,我们就认定高斯滤波是单独在求Hessian之前对预处理好了。

Frangi滤波的大致步骤是:

1.求Hessian矩阵:对应函数 Hessian2D()

  用卷积核$$G_{xx}$$对图像进行卷积操作得到$$I_{xx}$$,其中卷积核是$$\left[ \begin{matrix} 0&0&0\\1 &-2&1\\0&0&0 \end{matrix} \right] \tag{1} $$

  以此类推得到$$I_{xy}$$和$$I_{yy}$$

2.求Hessian矩阵的两个特征值:对应函数 eig2image()

  $$\left| \lambda E-H \right|=0$$

  $$\left|\left[ \begin{matrix} E-I_{xx} & E-I_{xy} \\E-I_{yx} & E-I_{yy}  \end{matrix} \right]\right|=0\tag{1} $$

   对于图像中的某一个像素而言,它的Hessian矩阵是2*2的,所以一定存在两个特征值(重根算重数):λ1和λ2(我们设λ1为较小的那个)。
  Hessian矩阵特征值和对应的特征向量分别代表该点处沿某一方向上图形曲率大小和方向。
  那么λ1可以代表曲率较小的方向(灰度梯度变化小),λ2代表曲率较大的方向(灰度梯度变化大)。

  构建两个变量:$$R_{b}=\frac{ \lambda_1 }{ \lambda_2 }$$和$$S=\sqrt{R_{b}^2-\lambda_2^2}$$

  我们可以根据图像形态把图像中的像素大致分为三类:

  1)背景,它们的灰度分布较均匀。任意方向上曲率都较小。

  2)孤立的点,角点,它在任意方向上的曲率都很大。

  3)血管处,一般获取的图像中,血管这个圆珠形态沿径向方向λ2上的曲率始终较大,轴向方向λ2上较小。

3.再根据Rb和S构建响应函数:

  $$V_o=\left| \begin{matrix}0    if \lambda_2>0 \\  (1-\frac{R_{b}^2}{2\beta^2})^2 ( 1-(  -\frac{S^2}{2c^2}  )^2  ) \end{matrix}  \right| \tag{1} $$

  式中条件:λ2>0,这是要看我们观测的是黑色背景还是白色背景,要是白背景那就是λ2<0。这个在程序中是根据“BlackWhite”这一参数选择的。

  令上式中 $$ A=- \frac{ R_{b}^2 }{ 2\beta^2 } $$
  $$ B=(1-(-\frac{S^2}{2c^2})) $$
  背景 孤立点 血管
特征值 λ1小     λ2小 λ1大     λ2大 λ1小     λ2大
A和B的绝对值 A 不定   B较小 A 接近0   B较大 A 接近1   B较大

  可以看到A对孤立点有抑制作用,B对背景有抑制作用,最后剩下的只有血管处的信号响应强烈。

  式中的B(贝塔,用latex公式打出来直接就换行了,所以用B代替一下)用来调节区分块状区域和条状区域的敏感程度,在程序中是“FrangiBetaOne”。

  如果B(贝塔)很大,那么A接近1,对孤立区域抑制就减弱了。而B(贝塔)很小,A很容易受到Rb的影响趋于0,那么在血管的弯曲处,也容易被抑制。

  c影响滤波后图像的整体平滑程度。程序中是“FrangiBetaTwo”。

  S对血管处的响应起关键作用,如果c较大,S的变化程度相对被压制了,图像就变得平滑。c很小,把S放大了,那么滤波后的图像(也就是滤波器的响应)就变得波动较大。

  这个滤波器只有在卷积尺度和血管宽度最接近的时候效果最好。如何确定卷积尺寸呢,最直接也是最有效的方法就是--枚举法。

  所以程序中就是用不同的卷积尺度去做滤波,得到的多幅滤波后图像中,在每一点处选择响应值最高的结果。函数中“FrangiScaleRange”就是枚举的尺度范围。

  这一点也很好理解。我们是用高斯卷积核的二阶导数求Hessian矩阵的。

  高斯函数的标准差表示卷积尺度(论文中是标准差的3倍),高斯滤波是按照高斯函数给某一点处及其周围像素设定权重,加权求平均。

  所以假设我们的卷积尺度比血管宽度大很多,那么得到的卷积结果就会被背景处拉低,因为背景处的灰度梯度变化是较小的。

  而当卷积尺度比血管宽度小很多时,无论噪声还是块状区域都会被滤波器保留。

Frangi形态学滤波详解的更多相关文章

  1. 电容参数:X5R,X7R,Y5V,COG 详解

    电容参数:X5R,X7R,Y5V,COG 详解 文章来源:http://www.hzlitai.com.cn/article/ARM9-article/cphard/1777.html 仅供分享学习~ ...

  2. SIFT算法详解(转)

    http://blog.csdn.net/zddblog/article/details/7521424 目录(?)[-] 尺度不变特征变换匹配算法详解 Scale Invariant Feature ...

  3. 【转】 SIFT算法详解

    尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Fun zdd  zddmail@gmail.com 对于初学者,从Davi ...

  4. EasyPR--开发详解

    我正在做一个开源的中文车牌识别系统,Git地址为:https://github.com/liuruoze/EasyPR. 我给它取的名字为EasyPR,也就是Easy to do Plate Reco ...

  5. Kintinuous 相关论文 Volume Fusion 详解

    近几个月研读了不少RGBD-SLAM的相关论文,Whelan的Volume Fusion系列文章的效果确实不错,而且开源代码Kintinuous结构清晰,易于编译和运行,故把一些学习时自己的理解和经验 ...

  6. 18.Llinux-触摸屏驱动(详解)

    本节的触摸屏驱动也是使用之前的输入子系统 1.先来回忆之前第12节分析的输入子系统 其中输入子系统层次如下图所示, 其中事件处理层的函数都是通过input_register_handler()函数注册 ...

  7. 深度学习之卷积神经网络(CNN)详解与代码实现(一)

    卷积神经网络(CNN)详解与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10430073.html 目 ...

  8. matlab-霍夫变换详解(判断正方形长方形)

    霍夫变换 霍夫变换是1972年提出来的,最开始就是用来在图像中过检测直线,后来扩展能检测圆.曲线等. 直线的霍夫变换就是 把xy空间的直线 换成成 另一空间的点.就是直线和点的互换. 我们在初中数学中 ...

  9. SIFT算法详解

    尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Fun zdd  zddmail@gmail.com or (zddhub@ ...

随机推荐

  1. 【[Offer收割]编程练习赛9 D】 矩阵填数

    [题目链接]:http://hihocoder.com/problemset/problem/1480 [题意] [题解] 这是一道杨氏矩阵的题; 一个固定形状的杨氏矩阵的种类个数; 等于这个杨氏矩阵 ...

  2. uva 11916 Emoogle Grid (BSGS)

    UVA 11916 BSGS的一道简单题,不过中间卡了一下没有及时取模,其他这里的100000007是素数,所以不用加上拓展就能做了. 代码如下: #include <cstdio> #i ...

  3. iptables 网址转译 (Network Address Translation,NAT)

    当封包流经NAT電腦時,其位址/通訊端口會被修改,以達到改变包目的地(或旅程),或是让目的地误以为包是源自NAT电脑的效果.換言之,对封包执行NAT的电脑,可以成为新包的来源或目的地,或是成为真正来源 ...

  4. tinyhttpd简介

    一:简介: tinyhttpd是由J. DavidBlackstone在1999年编写的,实现了一个很简单的web服务器.支持GET和POST方法,总代码量也就在500行左右,可以用来学习HTTP协议 ...

  5. poj 3334 Connected Gheeves (Geometry + BInary Search)

    3334 -- Connected Gheeves 题意是,给出两个尖形的相连的容器,要求向其中灌水.它们具有日常的物理属性,例如两个容器中水平面高度相同以及水高于容器顶部的时候就会溢出.开始的时候打 ...

  6. 2019-6-23-修复-dotnet-Core-缺SDK编译失败

    title author date CreateTime categories 修复 dotnet Core 缺SDK编译失败 lindexi 2019-6-23 10:55:9 +0800 2019 ...

  7. SuperSocket通过本地证书仓库的证书来启用 TLS/SSL

    你也可以通过本地证书仓库的证书,而不是使用一个物理文件. 你只需要在配置中设置你要使用的证书的storeName和thumbprint: <server name="EchoServe ...

  8. mysql基础(库、表相关)

    一. mysql支持的数据类型 1.1 mysql支持的数字类型: TINYINT 1 字节 (-128,127) (0,255) 小整数值 SMALLINT 2 字节 (-32 768,32 767 ...

  9. H3C NAPT

  10. python基础十三之内置函数

    内置函数 操作字符串代码 eval和exec print(eval('1+2')) # 简单的计算 有返回值 exec('for i in range(10):print(i)') # 简单的流程控制 ...