我试图使用 Frangi 过滤器从植物图像中提取所有茎。我想利用每个茎比叶子有更多类似血管的特性。 使用本文作为参考。
我的输入图像是这样的
这是我的 matlab 代码片段
options=struct('FrangiScaleRange', [1 3], 'FrangiScaleRatio', 1, 'FrangiBetaOne', 0.5,...
'FrangiBetaTwo', 2, 'verbose',true,'BlackWhite',true);
[outIm,whatScale,Direction] = FrangiFilter2D(double(rgb2gray(img2)), options);
outIm = uint8(outIm/max(outIm(:))*256);
这是输出
我知道可能还有其他方法来完成此任务,但我只是想知道为什么这种方法不起作用。
就 Frangi-filter 而言,正如已经讨论过的,你的茎和叶都是类似容器的,所以你不能简单地使用过滤器输出来区分它们。
但是,您可以:(i) 选择更好的尺度(大致适合您要检测的结构的尺度)和 (ii) 尝试不同的参数。
我尝试过,给定尺度
5 10 20 30
和 Frangi 参数 beta=0.5
和 c=100
[Frangi 等人:多尺度血管增强过滤,MICCAI 1998]
这就是我得到的:
以原始图像的逻辑单位进行缩放https://i.sstatic.net/s6wuE.jpg,已在 Photoshop 中转换为gray-8bpp。
您可以观察到以下内容。叶子的反应尺度比茎更高。也许这可能是一个线索。
编辑:
我查看了https://i.sstatic.net/eZwxg.png。 “边缘检测器”对明亮叶子的影响是由于 Frangi 的理论不足以适应二维:
相反
Frangi 滤波器测量图像区域的拉长程度,因此它将血管检测为“长”而不是“斑点”的对象。 论文中的示例图像的茎又窄又直(就像你的一样),叶子非常圆(与你的不同)。 由于叶子比论文中的更长、更薄,因此第一步的算法效果较差。 您的选择是:
(a) 对参数进行 futz(在 matlab 中,我相信它们是 FrangiAlpha 和 .FrangiBeta 参数)。 这些默认设置为 0.5,我认为你需要将它们设置得更低(这样你就必须更长更瘦才能算作茎)。
(b) 就像 @dasdingonesin 所说,论文有很多步骤,后面的 Hough Filter 步骤也会鼓励比 Frangi 过滤器考虑的更大规模的长连续线。
有谁知道如何获得弗兰吉过滤器中用于血管增强的最佳参数? 感谢您在本主题中的富有洞察力的讨论。