I would like to remove noise from CBCT images before I import them to a surgery planning software that can only do simple thresholding and only accepts DICOM files as input.
I have read the various threads on these forums and googled the topic, but I have not really found a working solution. I have tried using the gradient anisotropic diffusion filter and unsharp mask, but the effect was barely noticeable.
Does anyone have a process they use that they would like to share?
This is a very large topic. To narrow down it a little you would need to provide more information.
What kind of noise or artifacts you would like to address? Streak artifacts (due to dental filling, etc), partial volume effects (thin bones not discernible from soft tissues), low contrast to noise ratio (due to scattering, low dose, detector noise, etc)?
What is the surgical procedure(s) that you are interested in? What would you need to segment (teeth, bones,…)? What are the clinical requirements and constraints (accuracy, computation time, clinical expert’s time,…)?
Thank you for asking clarification. I now see that my question was too general.
In short I would like to make the CBCT scans look more like CT scans.
So the issue is mostly about clearly differentiating bone and soft tissue, meaning low contrast to noise ratio.
The streaks are not such a big issue.
The procedures include orthognatic and reconstructive surgeries. My main interest is to have good models of the bones for creating surgical guides. Also, sometimes it’s very difficult to tell if there’s really a hole in the bone or it just seems this way because of the low contrast to noise ratio.
I would like to both save time and increase accuracy.
Here’s an example, the maxilla has some large holes that don’t really exist:
CBCT uses a cone beam (as opposed to pencil beams on CT), which means that there is significant amount of scattered radiation getting into each detector pixel from surrounding regions. Therefore, CBCT will be always inherently worse in distinguishing soft tissues than CT. It is not just noise, but you actually have less information in a CBCT than in a CT, which cannot be undone by reducing noise. Although you cannot generate CT-quality images, it should be possible to create specialized image segmentation workflows, which can create the bone surface you need for surgical planning.
So far, what you have tried seem to be volume rendering, which is essentially global thresholding. It is the simplest possible segmentation method, which works well if you have perfect images, but you often need to use more sophisticated segmentation tools - available in Segment Editor module. For example, tools that rely on local intensity changes (for example, Grow from seeds effect) can pick up much subtle, local intensity variations. Or you can use semi-automatic segmentation tools that allow experts to manually delineate structures on a few slices and create a full 3D segmentation from that (for example, Fill between slices effect). If you often need to segment particular bone segments manually then you can develop an image pre-processing method specifically for that purpose (for example, we discussed on this forum several times how to extract thin orbital walls) and/or fill holes in segmentation (for example, using Wrap solidify effect).
Overall, probably with a few days or weeks of experimenting with different segmentation tools, you should be able to come up with a workflow that gives you a good quality bone surface with 5-10 minutes of manual work, without any custom software development. You can probably reduce the manual effort to zero or near-zero with some custom Python scripting, that implements a combination of image pre-processing, automated segmentation, and segmentation post-processing.
Thank you for a comprehensive answer.
I have tried wrap solidify and it’s a very useful tool.
I really haven’t had much success with filters, but I’ll keep experimenting.
The CMF surgery planning software only accepts data in the DICOM format.
Can I export the segmentations back to the DICOM format from Slicer?
The software performs global thresholding to extract the bones and soft tissue.
You can then use the segmentation for blank out a CT volume (e.g., set everything that is outside the segment to a very different voxel value from everything else) and export that CT to DICOM.
You can segment the skin surface and after blanking out everything outside the bone segment with value=0 (corresponding to HU of soft tissues), you blank out everything outside the skin segment with value=-1000 (corresponding to air).