Module qute.transforms
Custom transforms.
Sub-modules
qute.transforms.debug
-
Debugging transforms.
qute.transforms.geom
-
Geometric transforms.
qute.transforms.io
-
Input/output transforms.
qute.transforms.norm
-
Normalization and scaling transforms.
qute.transforms.objects
-
Object-related transforms.
qute.transforms.util
-
Utility functions for transforms.
Classes
class AddFFT2 (mean_real: Optional[float] = None, std_real: Optional[float] = None, mean_imag: Optional[float] = None, std_imag: Optional[float] = None, in_place: bool = True)
-
Calculates the Fourier transform of the selected single-channel image and adds its z-normalized real and imaginary parts as two additional planes.
Constructor
Expand source code
class AddFFT2(Transform): """Calculates the Fourier transform of the selected single-channel image and adds its z-normalized real and imaginary parts as two additional planes.""" def __init__( self, mean_real: Optional[float] = None, std_real: Optional[float] = None, mean_imag: Optional[float] = None, std_imag: Optional[float] = None, in_place: bool = True, ) -> None: """Constructor""" super().__init__() self.mean_real = mean_real self.std_real = std_real self.mean_imag = mean_imag self.std_imag = std_imag self.in_place = in_place def __call__(self, data: torch.Tensor) -> torch.Tensor: """ Apply the transform to the "image" tensor in the data dictionary. Returns ------- data: torch.Tensor Image with added normalized power spectrum as second plane. """ # Make sure that the dimensions of the data are correct if not (data.dim() == 3 and data.shape[0] == 1): raise ValueError( "The image tensor must be of dimensions (1 x height x width)!" ) # Calculate the Fourier transform of the image f = torch.fft.fftshift(torch.fft.fft2(data)) # Normalize if self.mean_real is not None and self.std_real is not None: f.real = (f.real - self.mean_real) / self.std_real else: f.real = (f.real - f.real.mean()) / f.real.std() if self.mean_imag is not None and self.std_imag is not None: f.imag = (f.imag - self.mean_imag) / self.std_imag else: f.imag = (f.imag - f.imag.mean()) / f.imag.std() # Do we modify the input Tensor in place? if not self.in_place: data = data.clone() # Add it as a new plane data = torch.cat((data, f.real, f.imag), dim=0) # Return the updated tensor return data
Ancestors
- monai.transforms.transform.Transform
- abc.ABC
class AddFFT2d (image_key: str = 'image', mean_real: Optional[float] = None, std_real: Optional[float] = None, mean_imag: Optional[float] = None, std_imag: Optional[float] = None)
-
Calculates the Fourier transform of the selected single-channel image and adds its z-normalized real and imaginary parts as two additional planes.
Constructor
Parameters
image_key
:str
- Key for the image in the data dictionary.
Expand source code
class AddFFT2d(MapTransform): """Calculates the Fourier transform of the selected single-channel image and adds its z-normalized real and imaginary parts as two additional planes.""" def __init__( self, image_key: str = "image", mean_real: Optional[float] = None, std_real: Optional[float] = None, mean_imag: Optional[float] = None, std_imag: Optional[float] = None, ) -> None: """Constructor Parameters ---------- image_key: str Key for the image in the data dictionary. """ super().__init__(keys=[image_key]) self.image_key = image_key self.mean_real = mean_real self.std_real = std_real self.mean_imag = mean_imag self.std_imag = std_imag def __call__(self, data: dict) -> dict: """ Calculates the power spectrum of the selected single-channel image and adds it as a second plane. Returns ------- data: dict Updated dictionary with modified "image" tensor. """ # Make sure that the dimensions of the data are correct if not (data[self.image_key].dim() == 3 and data[self.image_key].shape[0] == 1): raise ValueError( "The image tensor must be of dimensions (1 x height x width)!" ) # Calculate the Fourier transform of the image f = torch.fft.fftshift(torch.fft.fft2(data[self.image_key])) # Normalize if self.mean_real is not None and self.std_real is not None: f.real = (f.real - self.mean_real) / self.std_real else: f.real = (f.real - f.real.mean()) / f.real.std() if self.mean_imag is not None and self.std_imag is not None: f.imag = (f.imag - self.mean_imag) / self.std_imag else: f.imag = (f.imag - f.imag.mean()) / f.imag.std() # Make a copy of the original dictionary d = dict(data) # Add it as a new plane d[self.image_key] = torch.cat((d[self.image_key], f.real, f.imag), dim=0) # Return the updated data dictionary return d
Ancestors
- monai.transforms.transform.MapTransform
- monai.transforms.transform.Transform
- abc.ABC
class ToPyTorchLightningOutputd (image_key: str = 'image', image_dtype: torch.dtype = torch.float32, label_key: str = 'label', label_dtype: torch.dtype = torch.int32)
-
Simple converter to pass from the dictionary output of Monai transforms to the expected (image, label) tuple used by PyTorch Lightning.
Expand source code
class ToPyTorchLightningOutputd(MapTransform): """ Simple converter to pass from the dictionary output of Monai transforms to the expected (image, label) tuple used by PyTorch Lightning. """ def __init__( self, image_key: str = "image", image_dtype: torch.dtype = torch.float32, label_key: str = "label", label_dtype: torch.dtype = torch.int32, ): super().__init__(keys=[image_key, label_key]) self.image_key = image_key self.label_key = label_key self.image_dtype = image_dtype self.label_dtype = label_dtype def __call__(self, data: dict) -> tuple: """Unwrap the dictionary.""" # Work on a copy of the input dictionary data d = dict(data) return d[self.image_key].type(self.image_dtype), d[self.label_key].type( self.label_dtype )
Ancestors
- monai.transforms.transform.MapTransform
- monai.transforms.transform.Transform
- abc.ABC