Spaces:
Sleeping
Sleeping
File size: 2,229 Bytes
01f75cf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
import os
import nibabel as nib
import SimpleITK as sitk
from nibabel import processing
from nibabel.orientations import aff2axcodes, axcodes2ornt, ornt_transform
def N4_Bias_Field_Correction(input_path, output_path):
"""
Perform N4 Bias Field Correction on an input image and save the corrected image to the specified output path.
Args:
input_path (str): Path to the input image file.
output_path (str): Path to save the corrected image file.
Returns:
None
"""
raw_img_sitk = sitk.ReadImage(input_path, sitk.sitkFloat32)
transformed = sitk.RescaleIntensity(raw_img_sitk, 0, 255)
transformed = sitk.LiThreshold(transformed, 0, 1)
head_mask = transformed
shrinkFactor = 4
inputImage = sitk.Shrink(raw_img_sitk, [shrinkFactor] * raw_img_sitk.GetDimension())
maskImage = sitk.Shrink(head_mask, [shrinkFactor] * raw_img_sitk.GetDimension())
bias_corrector = sitk.N4BiasFieldCorrectionImageFilter()
corrected = bias_corrector.Execute(inputImage, maskImage)
log_bias_field = bias_corrector.GetLogBiasFieldAsImage(raw_img_sitk)
corrected_image_full_resolution = raw_img_sitk / sitk.Exp(log_bias_field)
sitk.WriteImage(corrected_image_full_resolution, output_path)
return
def preprocessing(ipath, output_dir, basename):
"""
Preprocesses a medical image by performing N4 bias field correction and conforming the image to a specified shape and voxel size.
Args:
ipath (str): The input file path of the medical image to be processed.
output_dir (str): The directory where the processed image will be saved.
basename (str): The base name for the output file.
Returns:
tuple: A tuple containing:
- odata (nibabel.Nifti1Image): The N4 bias field corrected image.
- data (nibabel.Nifti1Image): The conformed image with specified shape and voxel size.
"""
opath = os.path.join(output_dir, f"original/{basename}_N4.nii")
N4_Bias_Field_Correction(ipath, opath)
odata = nib.squeeze_image(nib.as_closest_canonical(nib.load(opath)))
data = processing.conform(odata, out_shape=(256, 256, 256), voxel_size=(1.0, 1.0, 1.0), order=1)
return odata, data
|