pyplati / platipy

Processing Library and Analysis Toolkit for Medical Imaging in Python
https://pyplati.github.io/platipy/
Apache License 2.0
110 stars 27 forks source link

Possible bug in `transform_point_set_from_dicom_struct` #278

Open brendan-whelan-seetreat opened 1 month ago

brendan-whelan-seetreat commented 1 month ago

In transform_point_set_from_dicom_struct, each contour slice is associated with some location in the input dicom_image using the sitk function TransformPhysicalPointToIndex.

The issue arises if the z coordinates of the input sitk.Image are not well aligned with the contour z spacing. This happens commonly with an RT-STRUCT and an RT-DOSE file. I believe that TransformPhysicalPointToIndex will find the closest index. This index is not the same location as the contour z coordinate if the strucuture set and image have different z spacing, hence the returned structure will have incorrect z coordinates.

Possible fixes

  1. (recommended). Since the input image is only used as a template to generate the structure mask, you can just update the image such that the z-spacing exactly matches the contour z-spacing. You then need to update the relevant metadata - spacing, origin, size etc.
  2. Just check whether the z coordinates are within some tolerance and raise an error if not
pchlap commented 1 month ago

Thanks for reporting this @brendan-whelan-seetreat. Yeah think is definitely something we should resolve. @rnfinnegan and I have had a few discussions on how we could improve this function. One idea was to actually ignore the paired image or RTDOSE entirely, and just generate a structure mask which would cover the bounds of the structure at a predefined resolution (e.g. 1x1xSliceThickness but this could also be configurable)... Then you can just resample the resulting binary mask to the target space as needed (whether thats the image or dose space).

I think it would be good to keep the current function compatible with how it is currently used though, since most users probably just want to a binary mask that matches their image. But I will discuss with Rob to see if we can build in some flexibility and ensure a correct structure mask is returned including the use case you described.

brendan-whelan-seetreat commented 1 month ago

Actually, the functionality is nearly already there with the spacing_override - just that the default use will not detect any problems