Skip to content

Commit cdb8391

Browse files
slicepasteeinsyang723IamTingTing
committed
According to the issue, this PR addresses on the meta dictionary `data['pixdim']` of NIfTI images does not update after applying the `spacing` or `spacingd`. To align with `affine`, we update `data['pixdim']` and keep the original metainfo in `data['original_pixdim']`. Additionally, this PR also update the metainfo `key_{meta_key_postfix}['pixdim']` in NIfTI images, consistent with `spaced_data_dict['image_meta_dict']['pixdim']` in issue Project-MONAI#6832. Signed-off-by: Wei_Chuan, Chiang <[email protected]> Co-authored-by: einsyang723 <[email protected]> Co-authored-by: IamTingTing <[email protected]>
1 parent d36f0c8 commit cdb8391

File tree

5 files changed

+16
-0
lines changed

5 files changed

+16
-0
lines changed

monai/data/image_reader.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -989,6 +989,8 @@ def get_data(self, img) -> tuple[np.ndarray, dict]:
989989

990990
for i, filename in zip(ensure_tuple(img), self.filenames):
991991
header = self._get_meta_dict(i)
992+
if MetaKeys.PIXDIM in header:
993+
header[MetaKeys.ORIGINAL_PIXDIM] = np.array(header[MetaKeys.PIXDIM], copy=True)
992994
header[MetaKeys.AFFINE] = self._get_affine(i)
993995
header[MetaKeys.ORIGINAL_AFFINE] = self._get_affine(i)
994996
header["as_closest_canonical"] = self.as_closest_canonical

monai/data/meta_tensor.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,10 @@ def pixdim(self):
477477
return [affine_to_spacing(a) for a in self.affine]
478478
return affine_to_spacing(self.affine)
479479

480+
def set_pixdim(self) -> None:
481+
"""Update pixdim based on current affine."""
482+
self.meta[MetaKeys.PIXDIM][1 : 1 + len(self.pixdim)] = affine_to_spacing(self.affine)
483+
480484
def peek_pending_shape(self):
481485
"""
482486
Get the currently expected spatial shape as if all the pending operations are executed.

monai/transforms/spatial/array.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,9 @@ def __call__(
535535
dtype=dtype,
536536
lazy=lazy_,
537537
)
538+
if isinstance(data_array, MetaTensor) and "pixdim" in data_array.meta:
539+
data_array = data_array.clone()
540+
data_array.set_pixdim()
538541
if self.recompute_affine and isinstance(data_array, MetaTensor):
539542
if lazy_:
540543
raise NotImplementedError("recompute_affine is not supported with lazy evaluation.")

monai/transforms/spatial/dictionary.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,11 +24,13 @@
2424
import numpy as np
2525
import torch
2626

27+
import monai.transforms as transforms
2728
from monai.config import DtypeLike, KeysCollection, SequenceStr
2829
from monai.config.type_definitions import NdarrayOrTensor
2930
from monai.data.box_utils import BoxMode, StandardMode
3031
from monai.data.meta_obj import get_track_meta
3132
from monai.data.meta_tensor import MetaTensor
33+
from monai.data.utils import is_supported_format
3234
from monai.networks.layers.simplelayers import GaussianFilter
3335
from monai.transforms.croppad.array import CenterSpatialCrop
3436
from monai.transforms.inverse import InvertibleTransform
@@ -520,6 +522,9 @@ def __call__(self, data: Mapping[Hashable, torch.Tensor], lazy: bool | None = No
520522
output_spatial_shape=output_shape_k if should_match else None,
521523
lazy=lazy_,
522524
)
525+
if isinstance(d[key], MetaTensor) and "filename_or_obj" in d[key].meta:
526+
if is_supported_format(d[key].meta["filename_or_obj"], ["nii", "nii.gz"]):
527+
d = transforms.sync_meta_info(key, d)
523528
if output_shape_k is None:
524529
output_shape_k = d[key].peek_pending_shape() if isinstance(d[key], MetaTensor) else d[key].shape[1:]
525530
return d

monai/utils/enums.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,8 @@ class MetaKeys(StrEnum):
528528
Typical keys for MetaObj.meta
529529
"""
530530

531+
PIXDIM = "pixdim" # MetaTensor.pixdim
532+
ORIGINAL_PIXDIM = "original_pixdim" # the pixdim after image loading before any data processing
531533
AFFINE = "affine" # MetaTensor.affine
532534
ORIGINAL_AFFINE = "original_affine" # the affine after image loading before any data processing
533535
SPATIAL_SHAPE = "spatial_shape" # optional key for the length in each spatial dimension

0 commit comments

Comments
 (0)