From 9022c2c6acfe53f59c91f5f79ae5bef5ffa8652e Mon Sep 17 00:00:00 2001 From: ANIL KUMAR MONDRU Date: Thu, 4 Dec 2025 23:48:42 +0530 Subject: [PATCH 1/5] Fix Colin27 example: index dataset instead of using .subject --- visualize_denoise.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 visualize_denoise.py diff --git a/visualize_denoise.py b/visualize_denoise.py new file mode 100644 index 00000000..cf88dbb5 --- /dev/null +++ b/visualize_denoise.py @@ -0,0 +1,34 @@ +import torchio as tio +import matplotlib.pyplot as plt + +# ---- Load example MRI ---- +subject = tio.datasets.Colin27() + +# Get full 3D volume +image_3d = subject.t1.data.squeeze().numpy() + +# Pick center slice (axial) +slice_idx = image_3d.shape[2] // 2 +image = image_3d[:, :, slice_idx] + +# ---- Apply custom transform ---- +transform = tio.RandomBiasFieldDenoise(noise_reduction_factor=0.3) +denoised_subject = transform(subject) + +# Extract denoised slice +denoised_3d = denoised_subject.t1.data.squeeze().numpy() +denoised_image = denoised_3d[:, :, slice_idx] + +# ---- Plot ---- +fig, axes = plt.subplots(1, 2, figsize=(10, 5)) + +axes[0].imshow(image, cmap='gray') +axes[0].set_title("Original") +axes[0].axis("off") + +axes[1].imshow(denoised_image, cmap='gray') +axes[1].set_title("After Denoise") +axes[1].axis("off") + +plt.tight_layout() +plt.show() From f0bead8aa04b01ef83e92b105cad61fad03227b3 Mon Sep 17 00:00:00 2001 From: ANIL KUMAR MONDRU Date: Thu, 4 Dec 2025 23:58:39 +0530 Subject: [PATCH 2/5] Add RandomBiasFieldDenoise transform and register imports --- src/torchio/transforms/__init__.py | 3 ++ .../augmentation/intensity/__init__.py | 3 ++ .../intensity/random_biasfield_denoise.py | 33 +++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py diff --git a/src/torchio/transforms/__init__.py b/src/torchio/transforms/__init__.py index 5ecaf147..71daf2c1 100644 --- a/src/torchio/transforms/__init__.py +++ b/src/torchio/transforms/__init__.py @@ -58,6 +58,8 @@ from .preprocessing.label.label_transform import LabelTransform from .spatial_transform import SpatialTransform from .transform import Transform +from .augmentation.intensity import RandomBiasFieldDenoise + __all__ = [ 'Transform', @@ -120,4 +122,5 @@ 'RemoveLabels', 'SequentialLabels', 'KeepLargestComponent', + 'RandomBiasFieldDenoise', ] diff --git a/src/torchio/transforms/augmentation/intensity/__init__.py b/src/torchio/transforms/augmentation/intensity/__init__.py index 343a8359..7f4a165d 100644 --- a/src/torchio/transforms/augmentation/intensity/__init__.py +++ b/src/torchio/transforms/augmentation/intensity/__init__.py @@ -16,6 +16,8 @@ from .random_spike import Spike from .random_swap import RandomSwap from .random_swap import Swap +from .random_biasfield_denoise import RandomBiasFieldDenoise + __all__ = [ 'RandomSwap', @@ -36,4 +38,5 @@ 'BiasField', 'RandomLabelsToImage', 'LabelsToImage', + 'RandomBiasFieldDenoise', ] diff --git a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py new file mode 100644 index 00000000..77194b21 --- /dev/null +++ b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py @@ -0,0 +1,33 @@ +import torch +from ...transform import Transform +from torchio.data.subject import Subject + +class RandomBiasFieldDenoise(Transform): + """ + Simple placeholder transform that simulates denoising after bias field + correction by blending voxel intensities toward the mean value. + + Parameters: + noise_reduction_factor (float): Strength of denoising (0-1). + """ + + def __init__(self, noise_reduction_factor: float = 0.1, **kwargs): + super().__init__(**kwargs) + self.noise_reduction_factor = noise_reduction_factor + + def apply_transform(self, subject: Subject) -> Subject: + for _, image in subject.get_images_dict(intensity_only=True).items(): + tensor = image.data.float() + + # Basic denoising by shifting toward mean intensity + mean_val = tensor.mean() + tensor = (tensor * (1 - self.noise_reduction_factor)) + ( + mean_val * self.noise_reduction_factor + ) + + image.set_data(tensor) + + return subject + + def __repr__(self): + return f"{self.__class__.__name__}(noise_reduction_factor={self.noise_reduction_factor})" From 74ac568206131042fbd4c00c439bad6a05305ac8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Thu, 4 Dec 2025 18:34:44 +0000 Subject: [PATCH 3/5] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- .../augmentation/intensity/random_biasfield_denoise.py | 5 +++-- visualize_denoise.py | 8 ++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py index 77194b21..6e89a61e 100644 --- a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py +++ b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py @@ -2,11 +2,12 @@ from ...transform import Transform from torchio.data.subject import Subject + class RandomBiasFieldDenoise(Transform): """ Simple placeholder transform that simulates denoising after bias field correction by blending voxel intensities toward the mean value. - + Parameters: noise_reduction_factor (float): Strength of denoising (0-1). """ @@ -30,4 +31,4 @@ def apply_transform(self, subject: Subject) -> Subject: return subject def __repr__(self): - return f"{self.__class__.__name__}(noise_reduction_factor={self.noise_reduction_factor})" + return f'{self.__class__.__name__}(noise_reduction_factor={self.noise_reduction_factor})' diff --git a/visualize_denoise.py b/visualize_denoise.py index cf88dbb5..24d4d0b0 100644 --- a/visualize_denoise.py +++ b/visualize_denoise.py @@ -23,12 +23,12 @@ fig, axes = plt.subplots(1, 2, figsize=(10, 5)) axes[0].imshow(image, cmap='gray') -axes[0].set_title("Original") -axes[0].axis("off") +axes[0].set_title('Original') +axes[0].axis('off') axes[1].imshow(denoised_image, cmap='gray') -axes[1].set_title("After Denoise") -axes[1].axis("off") +axes[1].set_title('After Denoise') +axes[1].axis('off') plt.tight_layout() plt.show() From d743fa73bdc0092cf5eebdf698e5525a63f05eab Mon Sep 17 00:00:00 2001 From: ANIL KUMAR MONDRU Date: Fri, 5 Dec 2025 08:48:51 +0530 Subject: [PATCH 4/5] Apply Ruff autofix and sort imports --- src/torchio/transforms/__init__.py | 3 +-- src/torchio/transforms/augmentation/intensity/__init__.py | 3 +-- .../augmentation/intensity/random_biasfield_denoise.py | 7 +++++-- visualize_denoise.py | 4 ++-- 4 files changed, 9 insertions(+), 8 deletions(-) diff --git a/src/torchio/transforms/__init__.py b/src/torchio/transforms/__init__.py index 71daf2c1..518d25b8 100644 --- a/src/torchio/transforms/__init__.py +++ b/src/torchio/transforms/__init__.py @@ -8,6 +8,7 @@ from .augmentation.intensity import Motion from .augmentation.intensity import Noise from .augmentation.intensity import RandomBiasField +from .augmentation.intensity import RandomBiasFieldDenoise from .augmentation.intensity import RandomBlur from .augmentation.intensity import RandomGamma from .augmentation.intensity import RandomGhosting @@ -58,8 +59,6 @@ from .preprocessing.label.label_transform import LabelTransform from .spatial_transform import SpatialTransform from .transform import Transform -from .augmentation.intensity import RandomBiasFieldDenoise - __all__ = [ 'Transform', diff --git a/src/torchio/transforms/augmentation/intensity/__init__.py b/src/torchio/transforms/augmentation/intensity/__init__.py index 7f4a165d..8fb65e59 100644 --- a/src/torchio/transforms/augmentation/intensity/__init__.py +++ b/src/torchio/transforms/augmentation/intensity/__init__.py @@ -1,5 +1,6 @@ from .random_bias_field import BiasField from .random_bias_field import RandomBiasField +from .random_biasfield_denoise import RandomBiasFieldDenoise from .random_blur import Blur from .random_blur import RandomBlur from .random_gamma import Gamma @@ -16,8 +17,6 @@ from .random_spike import Spike from .random_swap import RandomSwap from .random_swap import Swap -from .random_biasfield_denoise import RandomBiasFieldDenoise - __all__ = [ 'RandomSwap', diff --git a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py index 6e89a61e..dd50cd2e 100644 --- a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py +++ b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py @@ -1,7 +1,10 @@ -import torch -from ...transform import Transform from torchio.data.subject import Subject +<<<<<<< HEAD +======= +from ...transform import Transform + +>>>>>>> e8e8035 (Apply Ruff autofix and sort imports) class RandomBiasFieldDenoise(Transform): """ diff --git a/visualize_denoise.py b/visualize_denoise.py index 24d4d0b0..8187b4cd 100644 --- a/visualize_denoise.py +++ b/visualize_denoise.py @@ -1,7 +1,7 @@ -import torchio as tio import matplotlib.pyplot as plt -# ---- Load example MRI ---- +import torchio as tio + subject = tio.datasets.Colin27() # Get full 3D volume From e1174f2fb0556fe6b406873c5d23f366665a2ae4 Mon Sep 17 00:00:00 2001 From: ANIL KUMAR MONDRU Date: Fri, 5 Dec 2025 12:12:25 +0530 Subject: [PATCH 5/5] Add RandomBiasFieldDenoise transform and fix pre-commit issues --- .../augmentation/intensity/random_biasfield_denoise.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py index dd50cd2e..d87045b1 100644 --- a/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py +++ b/src/torchio/transforms/augmentation/intensity/random_biasfield_denoise.py @@ -1,10 +1,7 @@ from torchio.data.subject import Subject -<<<<<<< HEAD -======= from ...transform import Transform ->>>>>>> e8e8035 (Apply Ruff autofix and sort imports) class RandomBiasFieldDenoise(Transform): """