Вычисление толщины веток в 2D изображении - PullRequest
0 голосов
/ 03 мая 2020

Я бы хотел измерить толщину веток на изображении. Ниже приводится результат, полученный на Фиджи.

enter image description here

Я хотел бы рассчитать среднюю меру толщины, связанной с каждым краем. Под краем я подразумеваю сегмент, существующий между любыми двумя точками ветвления.

Любые указания о том, как действовать, будут действительно полезны.

Источник изображения: ref

РЕДАКТИРОВАТЬ: Узел является точкой соединения или конечных точек. Пожалуйста, дайте мне знать, если это не ясно, и если я должен объяснить это далее. Например, если мы скелетируем вышеприведенное изображение, как показано на рисунке здесь , соединения или конечные точки будут узлами. Если это поможет, я могу поделиться скелетонированной версией изображения выше.

РЕДАКТИРОВАТЬ2: enter image description here

{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.}}

1 Ответ

1 голос
/ 03 мая 2020

Вы можете сделать преобразование расстояния. Умножьте полученное изображение на скелет. Смотрите пример. Разложить скелет на сегменты и усреднить по сегментам. Это будет средняя толщина линии. Код Matlab / Octave:

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

enter image description here

Или этот код 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

Результат: enter image description here

...