-
-
Notifications
You must be signed in to change notification settings - Fork 706
BUG: Fix case where DICOM series order has negative spacing #5357
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
BUG: Fix case where DICOM series order has negative spacing #5357
Conversation
relates to SimpleITK/SimpleITK#2292 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Looks good after a quick look.
0ba9197
to
cb4f83f
Compare
I update the test case to use the sample MRI series in ITK test data, and use the ReverseOrder flag. The test is compare the pixel values at the physical locations match. |
Maybe we could have both of those tests? |
The DICOM tags were not correct in the prior example test case where the DICOM files were manually created. And oddly the X,Y spacing was being swapped for some reason likely related to the TAGs. Also this test case for the file has a non identify cosine matrix, which helps verifies the correct column was multiplied and not a row by -1. |
Thanks @blowekamp I'm just trying to understand the issue. It reminds me of an ITKElastix issue reported by @thewtex: Which appeared related to ITK/Modules/IO/ImageBase/include/itkImageFileReader.hxx Lines 222 to 235 in b375cef
|
The original issue was reported in SimpleITK here: The cause appeared to be that the z-slice direction was negative. This was more easily reproduce by enabling the "ReverseOrder" flag. It may very well be likely related to this change too: ITK/Modules/IO/ImageBase/include/itkImageFileReader.hxx Lines 222 to 235 in b375cef
It's not clear to me if the original DICOM reported in SimpleITK had negative spacing. The "ReverseOrder" reproduction of the issue, has negative inter-slice distance. There is certainly areas that need further investigation. The principle used in the test, that for DICOM if the "reverse order" flag is set then the physical location of the voxel should be maintained, should be correct. But DICOM is complicated. |
cb4f83f
to
d46d322
Compare
This patch does not directly deal with the DICOM tags, and specific DICOM information. It only correct a sign change in the DirectionCosine matrix when detected to maintain consistent physical spacing when the order is reversed. The specifics of multi-frame DICOM are not handled here. If there is a specific DICOM series that should be tested, we can manually do that to ensure consistency. Otherwise, I think this patch should be good? |
@thewtex @hjmjohnson is there any update on this PR? Would be great to get this issue resolved as it's affect pre-processing pipelines! |
d46d322
to
6aba916
Compare
I just tries this patch with this dataset referenced. I used the file names in the order presented by
When read in this order with the patch the direction(2,2) == -1.0, same as reported in the issue. When ReverseOrder is enable then direction(2,2,) == 1.0 and the physical geometry is the same. For both cases the space is This behavior is consistent and follow the expectations of the patch. |
84e2a15
to
eec7c09
Compare
If the spacing between slices is negative, then direction cosine matrix was not correct with reguards to the sign. This can be easily created with the "ReverseOrder" flag with the series reader and DICOM data. With the correction, a DICOM series mantains its correct physical location when this flag is enabled.
eec7c09
to
25ee357
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Please see the inline comments.
Please also add a test where the image is not orthogonal to the z-plane, i.e. the third direction component is neither [0,0,1] or [0,0,-1].
{ | ||
for (unsigned int j = 0; j < TOutputImage::ImageDimension; ++j) | ||
{ | ||
direction[j][this->m_NumberOfDimensionsInImage] *= -1.0; |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This assumes that the image orientation is orthogonal to the z-plane. This is not always the case, e.g. some DICOMs. The solution should look more like:
ITK/Modules/IO/ImageBase/include/itkImageSeriesReader.hxx
Lines 194 to 197 in 31744be
for (unsigned int j = 0; j < TOutputImage::ImageDimension; ++j) | |
{ | |
direction[j][this->m_NumberOfDimensionsInImage] = dirN[j] / dirNnorm; | |
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The "direction" matrix helps transform index-space to xyz space. The third column by construction in GDCM is one of the orthogonal directions to the imaging planes:
https://github.com/InsightSoftwareConsortium/ITK/blob/main/Modules/IO/GDCM/src/itkGDCMImageIO.cxx#L734-L743
This is the case where the wrong direction was computed due to the spacing sign, or the order of the images, and its is being corrected. The non-orthogonal imaging is a separate case.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I understand that the third direction is orthogonal to the first two. That was not my point. And I was not referring to non-orthogonal imaging.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The axis that needs flipping might not be the third, but rather second or first. Is that your point Matt?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is not necessarily a simple flip of one value.
The "ReadSlicesReverseOrder" has a no-trivial third direction component. The output of the test include the direction matrix without and with the reverse order flag:
|
When loaded in ITK-SNAP and Slicer, does this look correct? Is it LPS? |
I am not certain what your request is here. When ReverseOrder is off ( the default ) this image is the same as before. The test checks that the physical location of the pixels values remains. If there are additions to the gtest requested please be specific. It is not reasonable to compile of ITK-SNAP and/or 3D slicer with this patch. I do understand that effecting the location of DICOM images could have serious impact and this change needs careful review and testing. |
To help ensure we are getting correct behavior with DICOM's ,please add a test where the input does not have any 0's and 1's in the direction matrix. And add a check in the test that the resulting direction matrix's third vector equals the cross product of the first two. |
If the spacing between slices is negative, then direction cosine matrix was not correct with reguards to the sign.
PR Checklist
Refer to the ITK Software Guide for
further development details if necessary.