Thresholding for DICOM images

I’m trying to render an isoSurface with a series of dicom images. However I’d like to threshold this surface because some of the data isn’t good. Is there a way to threshold? In VTK I do something like this:

  vtkSmartPointer<vtkMarchingCubes> surface =  vtkSmartPointer<vtkMarchingCubes>::New();
  surface->SetInputData(volume);
  surface->ComputeNormalsOn();
  surface->SetValue(0, isoValue);

Where isoValue is some number thresholding I set. is there something like this in ITK?
Thanks,
~Shane

Yes. Use BinaryThreshold followed by BinaryMask3DMeshSource or CuberilleImageToMeshFilter (Cuberille is a remote module which needs to be turned on during ITK’s configure step).

2 Likes

Simple global thresholding is always a good start but except extreme cases (e.g., segmenting bone on very high quality CT), segmentation is more complicated than that. What would you like to segment on what kind of images? Can you post a few screenshots?

1 Like

I’m taking CT scans of a left ventricle (of course this is a non-human heart):
image This is with the isoValue = 150 (correct result)

This is with the isoValue=10
image

In general, you cannot segment the left ventricle from cardiac CT using simple global thresholding because there are several structures that has the same intensity range. You can combine a few simple steps, such as thresholding or cutting, or competing region growing methods - see for example this complete heart segmentation workflow using 3D Slicer:

With some more effort, you can create fully automated segmentation methods either using classic or deep learning based methods - there are lots of papers about this topic that you can get inspiration from.

1 Like

@lassoan Thanks for the info. It was my hope our customer would provide this for us :slight_smile: but for my first dataset they did not. We’ll just do some simple cutting for now so they can see this work and move forward from there.
~Shane