Ridge Detection 脊线检测插件教程
概述
Ridge Detection 即“脊线检测”,用于检测图像中线条的中心点坐标、线条两侧的边线坐标,以及线条的分支点坐标等信息。脊线检测应用广泛,常见于航空地图道路提取、医学血管提取提取等各种场景。
航空地图道路提取案例:
血管提取案例:
以上插图均来自 Steger 论文[1],脊线检测算法中最为广泛流传的就是这位大佬的算法。
Ridge Detection插件
Ridge Detection 插件是 ImageJ 软件上一款开源的脊线检测插件,本节内容翻译自 https://imagej.net/plugins/ridge-detection 。
目的
此插件实现并扩展了中描述的 ridge / line 检测算法:
Steger, C., 1998. An unbiased detector of curvilinear structures. IEEE Transactions on Pattern Analysis and Machine Intelligence, 20(2), pp.113–125.
它与堆栈一起使用,并行化,具有预览模式,并且能够解决重叠的行。它依赖于 apache-commons-lang 3
库。对于 ImageJ,请将其复制到 plugins/jars
中。
例子
![]() |
![]() |
---|
此示例显示了插件在碳纳米管图像上的应用(Sigma = 1.5,Lower Threshold = 1.3,Higher Threshold = 7)。
参数选择
必须指定三个参数。这些是强制性参数。可选参数可用于估计强制参数。
上图中,Optional_parameters 是可选参数,Mandatory_parameter 是强制参数。
强制参数
Sigma:确定导数的 \(\sigma\)。这取决于线宽。
Lower Threshold:拒绝响应小于此阈值的线点。
Upper Threshold:Upper Threshold (阈值上限):接受响应大于此阈值的线点。
Darkline:Darkline:(true/false) 此参数决定是否提取暗线或亮线。
在 Steger 论文中通过高斯核估计图像的一阶导和二阶导(或者称为响应),计算海森矩阵来求线点,
线点的强度值即为该处海森矩阵的绝对值最大的特征值,该值反映了与高斯核响应的大小,通过该值来区分当前像素点是背景,线点起始点还是候选点。而图像中目标脊线可能是黑色或者白色,高斯响应值也相应的存在正负,通过这个参数来决定当前像素点的属性。
可选参数
Line width \(w\) :线宽 \(w\)(以像素为单位)。它通过以下方式估计强制参数 Sigma
:
注意,这里的线宽指的是脊线左边缘到有右边缘的距离,而 Steger 论文中的线宽是脊线中心到边缘的距离(假设对称),因此这里会多出来一个 0.5 ,实际上是一回事。
High contrast (\(b_{upper}\)): 线条的最高灰度值。它通过以下方式估计强制参数 Upper threshold
:
Low contrast (\(b_{low}\)): 线条的最低灰度值。它通过以下方式估计强制参数 Lower Threshold
:
更多选项(true/false)
Correct position : 如果线条位置的每一侧具有不同的对比度,请更正线条位置。
Estimate width:如果选择此选项,则估计线条的宽度。
Show junction points:如果选择此选项,则显示交汇点。
Show IDs:如果选择此选项,则显示每行的 ID。
Verbose mode:如果选择此选项,则运行时状态信息将打印到日志中。
Display results:如果选择此选项,则所有等值线和连接点都将填充到结果表中。
Add to Manager:所有线路和交汇点都将添加到 ROI Manager 中。
在 Steger 论文中提到,当线条两侧的灰度分布不成对称分布时,则中心坐标计算可能会产生偏差,通过查表求逆法,可修正位置。而交汇点则是被多次当作线点的这样的像素点,这些点在连接线点时会做特殊标记。
重叠分辨率
Overlap resolution :可以选择一种方法来尝试自动重叠解决。此方法的准确性将取决于数据的结构。
Method: NONE
默认采用该方法:不假设重叠。任何可能的交点都将被视为所涉及山脊的终点。
Method: SLOPE
此方法假设当两个山脊重叠时,它们更有可能继续沿其路径行驶,而不是转弯。这最适合具有短暂重叠时间的数据集!如果两个山脊有很大一部分重叠,这种方法的准确性将迅速降低。
如果使用这种重叠分辨率方法,建议您首先调整 Ridge Detection 参数,以获得最少的交汇点起始集,以便每个 Ridge 尽可能匹配现实。例如 Preview
此 sigma 为 1.6 的检测会产生一组不适合基于坡度的重叠检测的线和交汇点。
sigma 为 3.0 的同一图像。这些是“真实”的交界点,允许通过线坡度进行合理的重叠检测。
在此图像中,我们看到重叠检测效果不佳。在这种情况下,由于一只手臂底部的多余连接点,导致对哪些线条重叠的误检。
在启用基于坡度的重叠检测的情况下成功进行山脊检测。选择 134 号线是为了说明在许多交叉点的情况下选择一条完整的线。
插件安装
只需打开 Biomedgroup 更新站点,其中包括山脊检测插件(即在线安装)。
如果您使用 ImageJ,只需复制 plugins 文件夹中的 RidgeDetection.jar
文件,然后将 apache-commons-lang 3 jar 文件复制到 plugins/jars 文件夹中(即离线安装)。
任选一个 3.0以上的版本,如 3.17.0
:
点击后跳转到该版本界面,点击 jar(657kb)
下载即可。
同理需要下载本插件,Maven Repository: de.biomedical-imaging.imagej » ij_ridge_detect
以上两个插件要放在 plugins/jars 中:
谁用了这个插件?
以下是使用该插件的出版物列表:
Glaser, M., Schnauß, J., Tschirner, T., Schmidt, B. U. S., Moebius-Winkler, M., Käs, J. A., & Smith, D. M. (2016). Self-assembly of hierarchically ordered structures in DNA nanotube systems. New Journal of Physics, 18(5), 055001. doi:10.1088/1367-2630/18/5/055001
如何引用
我们认为最好的方法是引用形式化方法和使用的实现:
方法:
Steger, C. (1998). An unbiased detector of curvilinear structures. IEEE Transactions on Pattern Analysis and Machine Intelligence, 20(2), 113–125. doi:10.1109/34.659930
实现:
Wagner, T., Hiner, M., & Xraynaud. (2017). thorstenwagner/ij-ridgedetection: Ridge Detection 1.4.0 (Version v1.4.0). Zenodo. doi:10.5281/ZENODO.845874
插件使用教程
首先,下载ImageJ,apache-commons-lang 3,ij_ridge_detect 三个文件,并安装到 plugins/jars 中。
然后,打开一张图片,这里以官方网站上的图像为例:
再打开 插件:
根据官网设置参数:
点击 OK ,计算并弹出一系列结果窗口(图中已调整位置):
可以查看线点信息,提取过程日志,图像可以缩放查看亚像素坐标。
插件源码
https://github.com/thorstenwagner/ij-ridgedetection
Curve tracing 插件
ImageJ 下的脊线提取插件作者太多了,在找到这个插件后,又发现一个名为 “Curve tracing” 的插件。
作者在他的博客 中表示,Seteger 最开始有开源C源码[2],后来服务器宕机了,再后来被 GRASP 项目组收录作为模块[3]。所以自己尝试写java插件,但自己开发完后才发现 Ridge Detection 插件已经有了,但总不能删了把,于是就有了这个插件。作者还提到 Ridge Detection 的作者代码写的非常好,必须向他致敬。
Curve extraction 插件可以生成更丰富的调试信息,比如特征值强度、法向,交汇点,边界线等等。
一些相关的项目
- https://github.com/rodrigoCastroReyes/Line-Detector
- https://github.com/songyuncen/EdgesSubPix
- C++版本: https://github.com/yaodix/ridge_detection
- Python版本: https://pypi.org/project/ridge-detection
- steger算法GPU版分析报告: https://dvikan.no/ntnu-studentserver/reports/fall_project_report.pdf
- halcon 的 steger 算法: https://www.mvtec.com/doc/halcon/13/en/lines_gauss.html