Clear Filters
Clear Filters

how to build a graph from a skeleton

24 views (last 30 days)
Dibanda Annick
Dibanda Annick on 17 May 2019
Answered: George Abrahams on 2 Jan 2024
i got a 2D skeleton from a binary vessel map after applying thinning. Now i would like to build an undirected graph from this skeleton with nodes and edges linked together.
  2 Comments
Kamya H
Kamya H on 7 Jul 2021
Hey! I'm facing the same problem! Did you manage to find any answers/code to this question? tried skel2graph-3d too, but I'm getting quite a lot of errors!

Sign in to comment.

Answers (2)

Mike Wharton
Mike Wharton on 18 Oct 2023
Edited: Mike Wharton on 18 Oct 2023
There is a blog post which explains what to do https://blogs.mathworks.com/steve/2015/12/14/image-based-graphs/
I think it is essentially something like this:
g = binaryImageGraph(bw);
figure
plotImageGraph(g)
This should work with a skeletonised binary image.

George Abrahams
George Abrahams on 2 Jan 2024
Another method, using my bwgraph function from File Exchange.
% Load binary vessel map and skeletonize.
img = imread( "binaryVesselMap.png" );
img = bwskel( img );
% Construct an undirected graph from the skeletonized image.
G = bwgraph( img );
% For visual clarity and to save RAM, delete isolated nodes (those with no
% edges).
G = rmnode( G, find( ~img ) );
% Plot the graph, mimicking the layout of the source image.
[ Y, X ] = ind2sub( size( img ), find( img ) );
h = plot( G, 'XData', X(:), 'YData', Y(:), 'NodeLabel', [] );
axis tight equal
set( gca, 'YDir','reverse' )
% As an example application, use graph algorithms to find and highlight the
% longest branch of the graph. Distances are quasi-Euclidean.
d = distances( G );
d( isinf( d ) ) = -Inf;
[ ~, I ] = max( d(:) );
[ row, col ] = ind2sub( size( d ), I );
P = shortestpath( G, row, col );
highlight( h, P, 'NodeColor', 'r' )

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!