Ridge Detection 脊线检测插件教程

概述

Ridge Detection 即“脊线检测”,用于检测图像中线条的中心点坐标、线条两侧的边线坐标,以及线条的分支点坐标等信息。脊线检测应用广泛,常见于航空地图道路提取、医学血管提取提取等各种场景。

航空地图道路提取案例:

image-20250510173421380

血管提取案例:

image-20250510173441778

以上插图均来自 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 中。

例子

img img

此示例显示了插件在碳纳米管图像上的应用(Sigma = 1.5,Lower Threshold = 1.3,Higher Threshold = 7)。

参数选择

必须指定三个参数。这些是强制性参数。可选参数可用于估计强制参数。

Ridge_Detection_Parameters.png

上图中,Optional_parameters 是可选参数,Mandatory_parameter 是强制参数。

强制参数

Sigma:确定导数的 \(\sigma\)。这取决于线宽。

Lower Threshold:拒绝响应小于此阈值的线点。

Upper Threshold:Upper Threshold (阈值上限):接受响应大于此阈值的线点。

Darkline:Darkline:(true/false) 此参数决定是否提取暗线或亮线。

在 Steger 论文中通过高斯核估计图像的一阶导和二阶导(或者称为响应),计算海森矩阵来求线点,

线点的强度值即为该处海森矩阵的绝对值最大的特征值,该值反映了与高斯核响应的大小,通过该值来区分当前像素点是背景,线点起始点还是候选点。而图像中目标脊线可能是黑色或者白色,高斯响应值也相应的存在正负,通过这个参数来决定当前像素点的属性。

可选参数

Line width \(w\) :线宽 \(w\)(以像素为单位)。它通过以下方式估计强制参数 Sigma

\[\sigma = \frac{w}{2\sqrt{3}} + 0.5 \]

注意,这里的线宽指的是脊线左边缘到有右边缘的距离,而 Steger 论文中的线宽是脊线中心到边缘的距离(假设对称),因此这里会多出来一个 0.5 ,实际上是一回事。

High contrast (\(b_{upper}\)): 线条的最高灰度值。它通过以下方式估计强制参数 Upper threshold

\[T_{U}=\left\lfloor 0.17\cdot\frac{2\cdot b_{upper}\cdot\frac{w}{2}}{\sqrt{2\pi}\sigma^{3}}e^{-\frac{\left(\frac{w}{2}\right)^{2}}{2\sigma^{2}}}\right\rfloor \]

Low contrast (\(b_{low}\)): 线条的最低灰度值。它通过以下方式估计强制参数 Lower Threshold

\[T_{L}=\left\lfloor 0.17\cdot\frac{2\cdot b_{low}\cdot\frac{w}{2}}{\sqrt{2\pi}\sigma^{3}}e^{-\frac{\left(\frac{w}{2}\right)^{2}}{2\sigma^{2}}}\right\rfloor \]

更多选项(true/false)

Correct position : 如果线条位置的每一侧具有不同的对比度,请更正线条位置。

Estimate width:如果选择此选项,则估计线条的宽度。

Show junction points:如果选择此选项,则显示交汇点。

Show IDs:如果选择此选项,则显示每行的 ID。

Verbose mode:如果选择此选项,则运行时状态信息将打印到日志中。

Display results:如果选择此选项,则所有等值线和连接点都将填充到结果表中。

Add to Manager:所有线路和交汇点都将添加到 ROI Manager 中。

Output if "Estimated width" is selected

在 Steger 论文中提到,当线条两侧的灰度分布不成对称分布时,则中心坐标计算可能会产生偏差,通过查表求逆法,可修正位置。而交汇点则是被多次当作线点的这样的像素点,这些点在连接线点时会做特殊标记。

重叠分辨率

Overlap resolution :可以选择一种方法来尝试自动重叠解决。此方法的准确性将取决于数据的结构。

Method: NONE

默认采用该方法:不假设重叠。任何可能的交点都将被视为所涉及山脊的终点。

Method: SLOPE

此方法假设当两个山脊重叠时,它们更有可能继续沿其路径行驶,而不是转弯。这最适合具有短暂重叠时间的数据集!如果两个山脊有很大一部分重叠,这种方法的准确性将迅速降低。

如果使用这种重叠分辨率方法,建议您首先调整 Ridge Detection 参数,以获得最少的交汇点起始集,以便每个 Ridge 尽可能匹配现实。例如 Preview

img

此 sigma 为 1.6 的检测会产生一组不适合基于坡度的重叠检测的线和交汇点。

img

sigma 为 3.0 的同一图像。这些是“真实”的交界点,允许通过线坡度进行合理的重叠检测。

img

在此图像中,我们看到重叠检测效果不佳。在这种情况下,由于一只手臂底部的多余连接点,导致对哪些线条重叠的误检。

img

在启用基于坡度的重叠检测的情况下成功进行山脊检测。选择 134 号线是为了说明在许多交叉点的情况下选择一条完整的线。

插件安装

只需打开 Biomedgroup 更新站点,其中包括山脊检测插件(即在线安装)。

如果您使用 ImageJ,只需复制 plugins 文件夹中的 RidgeDetection.jar 文件,然后将 apache-commons-lang 3 jar 文件复制到 plugins/jars 文件夹中(即离线安装)。

任选一个 3.0以上的版本,如 3.17.0

image-20250510183732541

点击后跳转到该版本界面,点击 jar(657kb) 下载即可。

image-20250510183847423

同理需要下载本插件,Maven Repository: de.biomedical-imaging.imagej » ij_ridge_detect

image-20250510184925660

以上两个插件要放在 plugins/jars 中:

image-20250510185027449

谁用了这个插件?

以下是使用该插件的出版物列表:

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 中。

然后,打开一张图片,这里以官方网站上的图像为例:

image-20250510185438520

image-20250510185522701

再打开 插件:

image-20250510185557458

根据官网设置参数:

image-20250510185623599

点击 OK ,计算并弹出一系列结果窗口(图中已调整位置):

image-20250510190045571

可以查看线点信息,提取过程日志,图像可以缩放查看亚像素坐标。

image-20250510190113205

image

插件源码

https://github.com/thorstenwagner/ij-ridgedetection

Curve tracing 插件

ImageJ 下的脊线提取插件作者太多了,在找到这个插件后,又发现一个名为 “Curve tracing” 的插件。

作者在他的博客 中表示,Seteger 最开始有开源C源码[2],后来服务器宕机了,再后来被 GRASP 项目组收录作为模块[3]。所以自己尝试写java插件,但自己开发完后才发现 Ridge Detection 插件已经有了,但总不能删了把,于是就有了这个插件。作者还提到 Ridge Detection 的作者代码写的非常好,必须向他致敬。

Curve extraction 插件可以生成更丰富的调试信息,比如特征值强度、法向,交汇点,边界线等等。

image

image

image

一些相关的项目

参考资料


  1. An Unbiased Detector of Curvilinear Structures ↩︎

  2. ftp://ftp9.informatik.tu-muenchen.de/pub/detect-lines ↩︎

  3. 网站访问不了, 但找到了历史快照,确实如此。点击下载源码 ↩︎

posted @ 2025-05-10 19:21  GShang  阅读(96)  评论(0)    收藏  举报