3D Skeletonize/Distance Transform of gray image stack

Hello ImageJ/Fiji community,

I am looking for a solution to generate 3D skeleton from filtered images of blood vessel.
I attached a 2D max projection image for example, if neccessary I can also try to attach the original 3D stack:

To get this I started with a fairly noisy image and performed a multi-scale tubeness filtering, to enhance the vasculature structures. The filtered image stack can either be 8-bit or 32-bit gray image, but doesn’t matter too much. We would like to generate skeleton of the blood vessels from such image stack. The skeleton doesn’t need to be super precise but should decent enough to represent both thick vessel and thin vessel.
Currently I couldn’t find a good threshold value to satisfy both large and small vessel structures, to generate a binary mask. Alternatively I am thinking to just use the gray value image to generate the skeleton. However I couldn’t seem to find a plugin that doing this.
I found this:

But all links are broken now.

I don’t think I’m the first one that need a 3D skeletonize on gray value image, but couldn’t find a readily solution after half day of googling. I haven’t done research in method/algorithm yet, and that’s my next step if no available solution found. I wouldn’t mind to code a plugin or implement a nice algorithm from sketch to do that, but certainly don’t want to reinvent the wheels.

Any help or suggestions will be appreciated. Thanks.

Ziqiang Huang

The Skeletonize3D (https://imagej.net/Skeletonize3D) plugin should be able to process greyscale images as long as they are 8-bit. It handles both 2D as well as 3D images: Plugins > Skeleton > Skeletonize (2D/3D)

or do I misunderstand your problem?

I think the important thing is with the tubness filter at least in imagej (https://www.longair.net/edinburgh/imagej/tubeness/) is that you find a good value for the Gaussian filter that is applied before: Plugins > Analyze > Tubeness

Thanks, Schmied,

However Skeletonize3D won’t solve my problem.

The Skeletonize3D plugin works on 8-bit binary image. If the input is not binary, it treat any pixel with value larger than 0 as 255, to thus form a binary stack. I feel I will need a distance transform that takes the whole dynamic range of the data.

As I stated, I used a multi-scale Tubeness filter. The approach is the same as described in Frangi filter, the only difference it the way to treat the eigenvalues of the Hessian Matrix. Tubness provides a better representation of the blood vessel network comparing to Frangi, most probably has something to do with the SNR and noise composition in my raw image.

Ok sorry, I get the problem now. I guess this is not implemented in Fiji(?). I found these suggestions in a thread in the old imagej forum: http://imagej.1557.x6.nabble.com/grey-scale-skeleton-transform-td5017505.html

When searching I also found references to published approaches to do thinning algorithms on greyscale…


Thanks for your prompt reply.

I ran across this post earlier but concluded all suggestion were in the direction of getting a better binary representation. Following this line, I have tried: directional filtering, laplacian filtering, edge detection, histogram equalization, adaptive thresholding. I can not say all failed but none reached closer to a performance a human would draw it.

After study the source codes of the skeletonize function I can find so far, I feel I don’t quite like the lookup table based approach. It only works in binary case, tedious to come up with all cases, and it can hardly generalize. My gut feeling tells me I will need a distance map / distance ridge based approach.
Apparently on the second look of that post, at least Jeremy Adler suggested an intensity ridge approach that worth trying. I will think a bit more and also study the paper you shared.

I will confirm later the gray-scale skeletonize doesn’t exist, and start working on it.

Best Regards,