--- a +++ b/Preprocessing Medical Data Pipeline/preparingTestInstance.py @@ -0,0 +1,92 @@ +# from preprocessing import ReadIn_MRIScans_Masks +# from writeout_dataset import Export2CompressedNifiti +import numpy as np +import os +import pydicom +import pandas as pd +import nibabel as nib + +# cutoffSlice = 400 +# seg_scan_dir = 'D:/MRI - Tairawhiti (User POV)' +# folders = ['10_AutoBindWATER_450_13A'] +# output_seg_scan_dir = ('{}/Patient Segmentation Tasks (Google Colab)').format(seg_scan_dir) + +def preprocessTestScans(cutoffSlice, seg_scan_dir, folders): + output_seg_scan_dir = ('{}/Patient Segmentation Tasks (Google Colab)').format(seg_scan_dir) + def read_dicom_files(directory): + dicom_files = [] + files = os.listdir(directory) + sorted_files = sorted(files) + for filename in sorted_files: + filepath = os.path.join(directory, filename) + if os.path.isfile(filepath) and filename.endswith('.dcm'): + try: + dicom_file = pydicom.dcmread(filepath) + dicom_files.append(dicom_file) + except pydicom.errors.InvalidDicomError: + print(f"Skipping file: {filename}. It is not a valid DICOM file.") + return dicom_files + + def flatten_2d_array(arr): + flattened = [] + for row in arr: + flattened.extend(row) + return flattened + + def ReadIn_MRIScans_Masks(scans_path, folders): + print('Patient Scan Data: ', folders) + scan_pixel_data = [] + scan_coordinate_data = [] + single_scan_pixel_data = [] + scan_coordinate_data = [] + scan_orientation_data = [] + scan_pixelspacing_data = [] + + + single_paitent_scans_path = scans_path + ('/Raw DICOM MRI Scans/{}').format(folders) + dicom_files = read_dicom_files(single_paitent_scans_path) + + # Extracting pixel data + for i in range (len(dicom_files)): + single_scan_pixel_data.append(dicom_files[i].pixel_array) + scan_pixel_data.append(single_scan_pixel_data) + + training_scans = flatten_2d_array(scan_pixel_data) + training_scans = np.array(training_scans) + + # Coordinate Data + single_paitent_scans_path = scans_path + '/{}'.format(folders) + for i in range (len(dicom_files)): + scan_coordinate_data.append(dicom_files[i].ImagePositionPatient) + scan_orientation_data.append(dicom_files[i].ImageOrientationPatient) + scan_pixelspacing_data.append(dicom_files[i].PixelSpacing) + + coord_data = pd.DataFrame(scan_coordinate_data, columns=["x", "y", "z"]) + return training_scans + + def Export2CompressedNifiti(imgs_train, scans_path, colab_fname): + nii_img_train = nib.Nifti1Image(imgs_train, affine=np.eye(4)) + output_file_path = ('{}/msk_{}.nii.gz').format(scans_path, colab_fname) + nib.save(nii_img_train, output_file_path) + + print("Conversion to NIfTI complete with shape: ", nii_img_train.shape) + print(('Successfully Exported Preprocessed Data! -> {}').format(output_file_path)) + print('\n') + + + for patient in folders: + patient_scan_data = ReadIn_MRIScans_Masks(seg_scan_dir, patient) + + patient_scan_data = patient_scan_data[(int(cutoffSlice)):-1] + + patient_scan_data = np.array(patient_scan_data) + patient_scan_data = patient_scan_data.astype('float32') + patient_scan_data /= 255. # scale scans to [0, 1] + + patient_scan_data = np.expand_dims(patient_scan_data, axis=-1) + print('Prediction Input Scan Shape: ', patient_scan_data.shape) + + + scan_idx_fnamecolab = (patient.split('_'))[0] + scan_idx_fnamecolab = '{:03d}'.format(int(scan_idx_fnamecolab)) + Export2CompressedNifiti(patient_scan_data, output_seg_scan_dir, scan_idx_fnamecolab) \ No newline at end of file