【问题标题】:Computing the thickness of branches in a 2D image计算二维图像中分支的厚度
【发布时间】:2020-05-03 10:02:39
【问题描述】:

我想测量图像中树枝的厚度。以下是从斐济得到的输出。

我想计算与每条边相关的平均厚度。我所说的边缘,是指存在于任意两个分支点之间的线段。

任何关于如何进行的指导都会非常有帮助。

图片来源:ref

编辑: 节点是连接点或端点。如果不清楚,请告诉我,如果我需要进一步解释。例如,如果我们像here 所示的那样对上面的图像进行骨架化,则连接点或端点将是节点。如果有帮助,我可以分享上图的骨架化版本。

编辑2:

{1 -> {36.4156, 23.8112, 0.},
 2 -> {83.4779, 151.809, 0.}, 
 3 -> {182.451, 145.504, 0.},
 4 -> {227.385, 86.2469, 0.}, 
 5 -> {311.9, 218.811, 0.},
 6 -> {483.204, 190.795, 0.}, 
 7 -> {601.916, 226.427, 0.},
 8 -> {780.405, 312.889, 0.}, 
 9 -> {974.959, 274.093, 0.},
 10 -> {656.313, 209.944, 0.}, 
 11 -> {815.08, 182.186, 0.},
 12 -> {923.162, 121.453, 0.}, 
 13 -> {353.554, 34.5667, 0.},
 14 -> {479.314, 87.3631, 0.}, 
 15 -> {662.5, 119.5, 0.},
 16 -> {759.72, 99.8905, 0.}, 
 17 -> {539.501, 34.4999, 0.},
 18 -> {712.917, 26.8174, 0.}, 
 19 -> {896.5, 65.5, 0.},
 20 -> {143.654, 379.583, 0.}, 
 21 -> {203.382, 270.926, 0.},
 22 -> {311.084, 354.623, 0.}, 
 23 -> {495.5, 330.5, 0.},
 24 -> {643.872, 319.37, 0.}, 
 25 -> {794.571, 405.533, 0.},
 26 -> {415.864, 397.252, 0.}, 
 27 -> {624.794, 369.389, 0.},
 28 -> {488.5, 276.5, 0.}}

【问题讨论】:

  • 究竟是什么定义了图像中的分支?你也有一些节点吗?
  • @s.k 节点是一个连接点或端点。如果不清楚,请告诉我,如果我需要进一步解释
  • 你找到路口了吗?
  • 我的意思是,你有图像参考框架中的节点坐标吗?
  • Cris 只是在说“如果连接两个节点的线是黄色的,它是胖的。如果它是红色的,它是中等粗的”如果是洋红色,它是细的。”

标签: python-3.x opencv image-processing fiji image-slicer


【解决方案1】:

你可以做距离变换。 将生成的图像乘以骨架。看一个例子。将骨架分解成段并在这些段上平均。这将是平均线粗细。 Matlab/Octave 代码:

a=imread('IW.png');
bw=im2bw(a, 0.1);
skeleton=bwmorph(bw, 'skel', Inf);
D = bwdist(~bw);
imagesc(D.*single(skeleton));

或者这个 Matlab/Octave 代码:

a=imread('IW.png');
bw=im2bw(a, 0.1);
skeleton=bwmorph(bw, 'skel', Inf);
branchpoints=bwmorph(skeleton, 'branchpoints');
se=strel('disk', 3);
branchpoints=imdilate(branchpoints,se);
segments=skeleton>branchpoints;
segments=bwareaopen(segments, 8);
stats = regionprops(segments,'Centroid', 'PixelIdxList');
centroids = cat(1, stats.Centroid);
D = bwdist(~bw);
hold on
%imagesc(D.*single(skeleton))
imshow(a)
for i=1:numel(stats)
    m(i)=mean(D(stats(i).PixelIdxList));
    text(centroids(i,1),centroids(i,2), num2str(m(i)), 'Color','blue');
end

结果:

【讨论】:

  • 谢谢。我正在寻找的是颜色的平均值/每个分支的主要颜色(分支是两个连接点之间的段)。最后,我想为每个分支分配一个颜色值。如果我的理解是正确的,上面发布的图像已经有了。我们可以将此结果转换为带有边缘标签(例如边缘 1-2 颜色代码 6.5)和颜色的表格吗?
  • 首先你需要把骨架切成段。这可以通过 XOR 操作(skeleton, 'branchpoints' )来完成。然后你需要遍历连接的组件并计算段的平均值。
  • 非常感谢您的提示。您能否就如何做到这一点提出一些建议First you need to cut the skeleton into segments
  • 谢谢。出于某种原因,当我在 2019b 中运行上述代码时,我发现只有一张黑白图像,上面显示了文字。你用的是2020a吗?如果是,请告诉我如何在 2019b 中获得与上面显示的相同的输出?
  • 2017b 版。你换第一行?文件名正确吗?开始逐步调试模式。
猜你喜欢
  • 2011-08-11
  • 2013-04-01
  • 2018-05-20
  • 2011-02-28
  • 2020-08-30
  • 1970-01-01
  • 2022-12-10
  • 1970-01-01
  • 2013-03-27
相关资源
最近更新 更多