Selecting a denoising filter for a CT

In my application I need to detect spineContactPoint over a line that goes through the spine. For this I check until HU value is over 200 but this could fail because there are random sparce voxels with HU value 200 as you can see in this picture of thresholding (with 200HU lower limit):

threshold_noisy_ct

So I though I have to use a denoising filter. I tried “Gradient anisotropic diffusion” and it worked well but there are four denoising algorithms. What of these four filter is recommended for my use case? Thanks

It’s very hard to get a filter to clean up data like that reliably and there are many parameters that interact in nonlinear fashion. You might be better off trying a segmentation filter. @lassoan pointed to this work and said he had good results. @RonSpine also tested it on clinical data and reported good experience so it might work for you as well: https://deep-spine.de/. There’s interest in working with this model based on what was done at Project Week.

2 Likes

I agree that you need a shape model/neural network for fully automatic spine segmentation or if you want to separate vertebrae.

However, if you just need a clean posterior surface for creating a surgical guide then running a non-linear filter (such as a simple median filter) on the image that you showed above should be sufficient. If you need to fill internal holes then you can use SurfceWrapSolidify extension for the region of interest.

I just need the area posterior to the spine to be denoised.
Then I detect when I have the spineContactPoint checking when the HU value of the CT is above 200 over a line that goes through the spine. Then I segment the whole spine automatically using localThreshold with spineContactPoint as seed. It works well most of the times but it could fail due to noise.
I just wanted to know what is the most convenient denoising filter for this use case. But I’ll use the median filter since you recommended it. Thanks

Edit: to give more context the line I use for bone detection comes from a planned pedicleScrew.
After I segment the spine with localThreshold, I make a shell with hollow effect and the paint the guideBases using the hollowSegment as mask