{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"pygments_lexer":"ipython3","nbconvert_exporter":"python","version":"3.6.4","file_extension":".py","codemirror_mode":{"name":"ipython","version":3},"name":"python","mimetype":"text/x-python"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"# Install dicom2nifti, intensity-nornmalization and ANTsPy\n\n! pip install ../input/libraries/libEnv/dicom2nifti-2.3.0\n! pip install ../input/libraries/libEnv/scikit-fuzzy-0.4.2\n! pip install ../input/libraries/libEnv/intensity_normalization-1.4.5-py3-none-any.whl\n! pip install ../input/libraries/libEnv/dipy-1.4.1-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl\n","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2021-07-25T13:38:44.005525Z","iopub.execute_input":"2021-07-25T13:38:44.006019Z","iopub.status.idle":"2021-07-25T13:39:14.299189Z","shell.execute_reply.started":"2021-07-25T13:38:44.005957Z","shell.execute_reply":"2021-07-25T13:39:14.298024Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import numpy as np \nimport pandas as pd \nimport nibabel as nib\nimport SimpleITK as sitk\nimport nibabel.processing as nibproc\nfrom dipy.io.image import load_nifti, save_nifti\n# from intensity_normalization.normalize import zscore \nfrom dipy.align.imaffine import transform_centers_of_mass, AffineMap, MutualInformationMetric, AffineRegistration\nfrom dipy.align.transforms import TranslationTransform3D, RigidTransform3D, AffineTransform3D\n\n# Preprocessing fucntions \n\ndef resampling_reorientation(img, output):    \n    # resampling to 240x240x155 1mm3\n    resampledIm = nibproc.conform(img, out_shape=(240, 240, 155), voxel_size=(1.0, 1.0, 1.0), order=1, cval=0.0)\n    \n    # Modify metadata for reorientation\n    n1_header = img.header\n    # print(n1_header)  \n    n1_header.set_sform(np.diag([0, 0, 0, 0]), code='unknown')\n    qform = np.array(\n           [[ 1. ,   0. ,   0. , -120. ],\n           [  0. ,   1. ,   0. , -129. ],\n           [  0. ,   0. ,   1, -68.],\n           [  0. ,   0. ,   0. ,   1. ]])\n\n    n1_header.set_qform(qform, code='scanner')\n    # print('--------------------------')\n    # print(n1_header) \n\n    # Reoriented to SRI24 t1 Atlas \n    new_img = nib.nifti1.Nifti1Image(resampledIm.get_fdata(), None, header=n1_header)\n    nib.save(new_img, output)\n\n# Bias Correction\ndef N4BiasCorrection(imDir, output):\n    # Read image define corrector\n    image = sitk.ReadImage(imDir, sitk.sitkFloat32)\n    print(type(image))\n    corrector = sitk.N4BiasFieldCorrectionImageFilter()\n    \n    # Create mask\n    mask = (image > 0)\n    \n    # Execute corrector\n    corrector.SetMaximumNumberOfIterations(np.array([200], dtype='int').tolist())\n    corrected_image = corrector.Execute(image, mask)\n    print(type(corrected_image))\n\n    sitk.WriteImage(corrected_image, output)\n \n\ndef rigidRegistration(static, moving, output):\n    # Load static image\n    static_data, static_affine, static_img = load_nifti(\n                                                        static, \n                                                        return_img=True)\n    static = static_data\n    static_grid2world = static_affine\n\n    # load moving image\n    moving_data, moving_affine, moving_img = load_nifti(\n                                                moving,\n                                                return_img=True)\n    moving = moving_data\n    moving_grid2world = moving_affine\n\n    # traslattion mass center\n    c_of_mass = transform_centers_of_mass(static, static_grid2world,\n                                           moving, moving_grid2world)\n    transformed = c_of_mass.transform(moving)\n    starting_affine = c_of_mass.affine\n\n    # elements for registration\n    nbins = 32\n    sampling_prop = 5\n    metric = MutualInformationMetric(nbins, sampling_prop)\n\n    level_iters = [1]\n    sigmas = [0.0]\n    factors = [1]\n\n    # Rigid registration \n    affreg = AffineRegistration(metric=metric,\n                                level_iters=level_iters,\n                                sigmas=sigmas,\n                                factors=factors)\n\n    transform = RigidTransform3D()\n    params0 = None\n    rigid = affreg.optimize(static, moving, transform, params0,\n                            static_grid2world, moving_grid2world,\n                            starting_affine = starting_affine)\n\n    transformed = rigid.transform(moving)\n    transformed = transformed.astype(np.uint16)\n    save_nifti(output, transformed, static_affine)\n    \n    return rigid\n\n# def z_norm(img, output):\n#    zscore_normalize(img, mask=None)","metadata":{"execution":{"iopub.status.busy":"2021-07-25T13:49:48.781094Z","iopub.execute_input":"2021-07-25T13:49:48.7815Z","iopub.status.idle":"2021-07-25T13:49:48.801753Z","shell.execute_reply.started":"2021-07-25T13:49:48.781462Z","shell.execute_reply":"2021-07-25T13:49:48.800963Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import dicom2nifti as dcmnii\nimport time\nimport os \n\nstart_time = time.time()\n\n# Conversion to nifti\npdata = '/kaggle/input/rsna-miccai-brain-tumor-radiogenomic-classification/test/'\ncasesList = os.listdir(pdata)\n#casesList.sort()\ncaseTest = casesList[0]\n\npcase = pdata + caseTest\n\nmodalities = [\"T2w\", \"T1wCE\", \"T1w\", \"FLAIR\"]\n\npcaseo = '/kaggle/working/'+caseTest\nos.mkdir(pcaseo) \n\nfor modality in modalities: \n    pcaseMod = pcase+'/'+modality\n    dcmnii.convert_directory(pcaseMod, pcaseo, compression=True)\n    print('built '+pcaseo+'/'+modality)\n    \n# !tar -zcvf case.tar.gz /kaggle/working/00114","metadata":{"execution":{"iopub.status.busy":"2021-07-25T13:49:54.736854Z","iopub.execute_input":"2021-07-25T13:49:54.737223Z","iopub.status.idle":"2021-07-25T13:49:54.772891Z","shell.execute_reply.started":"2021-07-25T13:49:54.737191Z","shell.execute_reply":"2021-07-25T13:49:54.771475Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Preprocessing\n\nmodalities = ['T1C', 'T1', 'FLAIR', 'T2']\n\nfolder='/kaggle/working/00114/'\nlistFiles = os.listdir(folder)\nlistFiles.sort(reverse=True)\nfor modality in modalities:\n    folderMod=folder+modality\n    os.mkdir(folderMod)\n\nfor i in range(4):\n\n    # Load image\n    pdata = '/kaggle/working/00114/'+listFiles[i]\n    img = nib.load(pdata)\n\n    os.chdir('/kaggle/working/00114/'+modalities[i])\n\n    # resampling to 240x240x155 1mm3\n    resampling_reorientation(img, modalities[i]+'_resam&reor.nii.gz')\n\n    # Bias correction\n    N4BiasCorrection(modalities[i]+'_resam&reor.nii.gz', modalities[i]+'_bias.nii.gz')\n\n    # Registration dipy\n    if modalities[i] == 'T1C':\n        static = '/kaggle/input/template/Template/T1_brain.nii'\n        moving = modalities[i]+'_bias.nii.gz'\n        output = modalities[i]+'_registered_SRI.nii.gz'\n        rigid = rigidRegistration(static, moving, output)\n    else:\n        static = '/kaggle/working/00114/T1C/T1C_resam&reor.nii.gz'\n        moving = modalities[i]+'_bias.nii.gz'\n        output = modalities[i]+'_registered.nii.gz'\n        rigidRegistration(static, moving, output)\n \nmodalities = ['T2', 'FLAIR', 'T1']\n\n # Load static image\nstatic = '/kaggle/input/template/Template/T1_brain.nii'\nstatic_data, static_affine, static_img = load_nifti(static, return_img=True)\n\nfor i in range(3):\n   \n    # load moving image\n    os.chdir('/kaggle/working/00114/'+modalities[i])                                                          \n    moving = modalities[i]+'_registered.nii.gz'\n    moving_data, moving_affine, moving_img = load_nifti(moving, return_img=True)\n    \n    output = modalities[i]+'_registered_SRI.nii.gz'\n    transformed = rigid.transform(moving_data)\n    transformed = transformed.astype(np.uint16)\n\n    save_nifti(output, transformed, static_affine)   \n    \nprint(\"--- %s seconds ---\" % (time.time() - start_time))\n\nprint('############ End Preprocessing ############')","metadata":{"execution":{"iopub.status.busy":"2021-07-25T13:50:08.634577Z","iopub.execute_input":"2021-07-25T13:50:08.634948Z","iopub.status.idle":"2021-07-25T13:54:25.447968Z","shell.execute_reply.started":"2021-07-25T13:50:08.634914Z","shell.execute_reply":"2021-07-25T13:54:25.447056Z"},"trusted":true},"execution_count":null,"outputs":[]}]}