{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import warnings\nwarnings.simplefilter('ignore')\n\nimport pandas as pd\n\npd.set_option('display.max_columns', None)","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:25.340494Z","iopub.execute_input":"2023-09-03T10:28:25.340838Z","iopub.status.idle":"2023-09-03T10:28:25.377014Z","shell.execute_reply.started":"2023-09-03T10:28:25.340801Z","shell.execute_reply":"2023-09-03T10:28:25.375615Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"train_dicom_tags = pd.read_parquet('/kaggle/input/rsna-2023-abdominal-trauma-detection/train_dicom_tags.parquet')\ntrain_images_path = '/kaggle/input/rsna-2023-abdominal-trauma-detection/train_images'","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:25.379238Z","iopub.execute_input":"2023-09-03T10:28:25.379662Z","iopub.status.idle":"2023-09-03T10:28:30.66187Z","shell.execute_reply.started":"2023-09-03T10:28:25.379632Z","shell.execute_reply":"2023-09-03T10:28:30.6611Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\n\npatient_ids = os.listdir(train_images_path)","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:30.662673Z","iopub.execute_input":"2023-09-03T10:28:30.662925Z","iopub.status.idle":"2023-09-03T10:28:30.81819Z","shell.execute_reply.started":"2023-09-03T10:28:30.662891Z","shell.execute_reply":"2023-09-03T10:28:30.817471Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"patient_ids_500_1000 = patient_ids[500:1000]","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:30.820379Z","iopub.execute_input":"2023-09-03T10:28:30.820673Z","iopub.status.idle":"2023-09-03T10:28:30.826648Z","shell.execute_reply.started":"2023-09-03T10:28:30.820646Z","shell.execute_reply":"2023-09-03T10:28:30.82557Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# patient_ids_1600 = patient_ids[:1600]\n# patient_ids_1600_3147 = patient_ids[1600:3147]\n# train_dicom_tags.loc[train_dicom_tags.PatientID == '26501', ['SeriesInstanceUID', 'SliceThickness']].value_counts()","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:30.828244Z","iopub.execute_input":"2023-09-03T10:28:30.828744Z","iopub.status.idle":"2023-09-03T10:28:30.837911Z","shell.execute_reply.started":"2023-09-03T10:28:30.82871Z","shell.execute_reply":"2023-09-03T10:28:30.836655Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pydicom as dcm\nimport numpy as np\nimport matplotlib.pyplot as plt\n\ndef load_CT_slice(dcm_image):\n    \n    pixel_array = dcm_image.pixel_array\n    \n    if dcm_image.PixelRepresentation == 1:\n        \n        bit_shift = dcm_image.BitsAllocated - dcm_image.BitsStored\n        dtype = pixel_array.dtype \n        new_array = (pixel_array << bit_shift).astype(dtype) >>  bit_shift\n        pixel_array = pydicom.pixel_data_handlers.util.apply_modality_lut(new_array, dcm_image)\n    \n    if dcm_image.PhotometricInterpretation == \"MONOCHROME1\":\n        \n        pixel_array = 1 - pixel_array\n\n    intercept = dcm_image.RescaleIntercept\n    slope = dcm_image.RescaleSlope\n    pixel_array = pixel_array * slope + intercept\n    \n    window_center = int(dcm_image.WindowCenter)\n    window_width = int(dcm_image.WindowWidth)\n    \n    img_min = window_center - window_width // 2\n    img_max = window_center + window_width // 2\n    \n    pixel_array = pixel_array.copy()\n    pixel_array[pixel_array < img_min] = img_min\n    pixel_array[pixel_array > img_max] = img_max\n    \n    pixel_array = (pixel_array - pixel_array.min())/(pixel_array.max() - pixel_array.min())\n    \n    return (pixel_array * 255).astype(np.uint8)","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:30.839084Z","iopub.execute_input":"2023-09-03T10:28:30.839477Z","iopub.status.idle":"2023-09-03T10:28:30.98044Z","shell.execute_reply.started":"2023-09-03T10:28:30.839446Z","shell.execute_reply":"2023-09-03T10:28:30.978576Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import pydicom\nfrom joblib import Parallel, delayed\nimport cv2\n\nSIZE = 256\n\ndef process(dcm_path, patient_id, series_id):\n    \n    dcm_image = pydicom.read_file(dcm_path)\n    dcm_file = os.path.basename(dcm_path)\n    \n    img = load_CT_slice(dcm_image)\n    img = cv2.resize(img, (SIZE, SIZE))\n\n    output_path = os.path.join('rsna-2023-500-1000', patient_id, series_id, dcm_file.replace('.dcm', '.jpeg'))\n    \n    cv2.imwrite(output_path, img)","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:30.98216Z","iopub.execute_input":"2023-09-03T10:28:30.983655Z","iopub.status.idle":"2023-09-03T10:28:31.249604Z","shell.execute_reply.started":"2023-09-03T10:28:30.983613Z","shell.execute_reply":"2023-09-03T10:28:31.248612Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"THICKNESS_COEF = 5\nN_JOBS = 2\n\nfor patient_id in patient_ids_500_1000:\n        \n    df_temp = pd.DataFrame(\n        train_dicom_tags.loc[train_dicom_tags.PatientID == patient_id, ['SeriesInstanceUID', 'SliceThickness']].value_counts()\n    ).reset_index()\n\n    series_ids = [series_id.split('.')[-1] for series_id in df_temp.SeriesInstanceUID]\n    slice_thicknesses = [slice_thickness for slice_thickness in df_temp.SliceThickness]\n\n    for i, series_id in enumerate(series_ids):\n        \n        if series_id in [se_id for se_id in os.listdir(os.path.join(train_images_path, patient_id))]:\n\n            step = round(THICKNESS_COEF / slice_thicknesses[i])\n\n            series_id_path = os.path.join(train_images_path, patient_id, series_id)\n            os.makedirs(os.path.join('rsna-2023-500-1000', patient_id, series_id), exist_ok=True)\n\n            dcms = os.listdir(series_id_path)\n\n            dcms_temp = {int(x.replace('.dcm', '')): x for x in dcms}\n            dcms = sorted(dcms_temp)\n            dcms = [str(x) + '.dcm' for x in dcms]\n\n            dcms_len = len(dcms)\n\n            dcm_paths = []\n\n            for j in range(0, dcms_len, step):\n                dcm_paths.append(os.path.join(series_id_path, dcms[j]))\n\n            parallel = Parallel(n_jobs=N_JOBS)(delayed(process)(dcm_path, patient_id, series_id) for dcm_path in dcm_paths)","metadata":{"execution":{"iopub.status.busy":"2023-09-03T10:28:31.250985Z","iopub.execute_input":"2023-09-03T10:28:31.25136Z","iopub.status.idle":"2023-09-03T10:43:40.539955Z","shell.execute_reply.started":"2023-09-03T10:28:31.251329Z","shell.execute_reply":"2023-09-03T10:43:40.538631Z"},"trusted":true},"execution_count":null,"outputs":[]}],"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"}}