[db:标题]
摘要:基于Hessian矩阵特征值的纤维状目标增强算法,在医学领域,特别适合于血管方面的提取,前几天在翻一翻matlab中的帮助文档,无意中发现一个叫fibermetric的图像处理函数,正好是和这个有关的,因此,花费了几天时间予以优化和实现,本
前几天在翻一翻matlab中的帮助文档,无意中发现一个叫fibermetric的图像处理函数,感觉有点意思,可以增强或者说突出一些类似于管状的对象,后面看了下算法的帮助文档,在百度上找了找,原来这也是一种比较经典的增强算法。
核心的论文是《Multiscale vessel enhancement filtering》,可以从这里下载得到:https://www.researchgate.net/publication/2388170_Multiscale_Vessel_Enhancement_Filtering;
至于论文的思想,除了直接看原始论文,我也还参考了一下几篇文章:
https://ww2.mathworks.cn/matlabcentral/fileexchange/24409-hessian-based-frangi-vesselness-filter Hessian based Frangi Vesselness filter 原始作者的matlab实现
https://github.com/BoguslawObara/vesselness2d 2d multiscale vessel enhancement filtering
https://www.cnblogs.com/jsxyhelu/p/18157603 Hessian矩阵以及在血管增强中的应用——OpenCV实现【2024年更新】
https://blog.csdn.net/piaoxuezhong/article/details/78428785 眼底图像血管增强与分割--(5)基于Hessian矩阵的Frangi滤波算法
https://blog.csdn.net/lwzkiller/article/details/55050275 Hessian矩阵以及在图像中的应用
https://zhuanlan.zhihu.com/p/127951058 Multiscale Vessel Enhancement Filtering(多尺度血管增强滤波,基本是对原英文的翻译)
但是说实在的我没有看明白原理,懵懵懂懂的,反正大概就是知道通过判断Hessian矩阵的两个特征值之间的某些关系可以确定某个位置是否属于血管或者说管状结构,我觉得呢大概看懂论文里这个表可能就比较好了:
我们重点关注2D的情况。
表中Lambda1和Lambda2分别为某个尺度下的Hessian矩阵的特征值,并且是|Lambda1| < |Lambda2|,对于管状对象,一般是|Lambda1| << |Lambda2|,其中 <<表示远远小于,另外呢,一个先验就是在血管图像中背景部分的像素其Hessian矩阵的特征值一般都比较小,因此,基于这两个特征呢,构造了一下两个中间变量来衡量一个位置的像素是属于血管还是背景:
对于2D图像,RB可以简化为 RB= |Lambda1| / |Lambda2|,而S则即为 S = sqrt(Lambda1^2 + Lambda2^2);
利用这两个中间变量,然后构架了下式作为某个像素的输出响应:
其中Beta和C是一些可调节参数,Beta默认可设置为0.5。C后面再说。
注意观察,上面公式的下半部分是两个指数函数的乘积,而指数函数内部的参数必然是负值(2个平方数相除在求负),这个指数函数范围的有效值为【0,1】,后面部分的1-exp(//)的范围也必然是【0,1】。 因此2项的乘积必然也是在【0,1】之间。
第一个指数项中,如果RB值越小,则指数值越大,第二个项目中,如果S值越大,则指数值越大, 这恰好正确的反映了前面所说血管区域的特征。
对于某一个尺度下的响应使用上述公式,而为了获得更为理想的效果,可以使用连续的多个尺度进行计算,然后取每个尺度下的最大值作为最终的响应值。
具体到实现代码,我们首先参考了论文作者自己的代码,这个可在https://ww2.mathworks.cn/matlabcentral/fileexchange/24409-hessian-based-frangi-vesselness-filter Hessian based Frangi Vesselness filter下载。
