{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.10.14","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":71549,"databundleVersionId":8561470,"sourceType":"competition"}],"dockerImageVersionId":30761,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nfrom pathlib import Path\nfrom PIL import Image\nimport pydicom\nimport os\nfrom tqdm import tqdm\nimport glob\nimport re\nimport numpy as np\nimport cv2\n\n\nrd = Path('/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification')\n\n\n# Function to convert the DICOM files to PNG\ndef convert_to_png(src_path, dest_path):\n    # Convert the DICOM files to PNG\n    image = pydicom.dcmread(src_path)\n    image = image.pixel_array\n    image = (image - image.min()) / (image.max() - image.min() + 1e-6) * 255\n    image = cv2.resize(image, (512, 512), interpolation=cv2.INTER_CUBIC)\n    assert image.shape == (512, 512)\n    cv2.imwrite(dest_path, image)\n\n\n# Text to Integer\ndef atoi(text):\n    '''Converts text to integer\n    example 1: atoi('123') -> 123\n    example 2: atoi('abc') -> 'abc'\n    '''\n    return int(text) if text.isdigit() else text\n\n\n# Natural Sorting\ndef natural_keys(text):\n    '''Sorts the text in human order\n    example: ['a1', 'a10', 'a2'] -> ['a1', 'a2', 'a10']\n    '''\n    return [atoi(c) for c in re.split(r'(\\d+)', text)]\n\n\n# Series description\n\n# This file contains the \"study_id\", \"series_id\" and \"series_description\" of the images\ndf = pd.read_csv(\n    rd / \"train_series_descriptions.csv\")\n\nunique_series_description = df[\"series_description\"].unique()\n# ['Sagittal T2/STIR', 'Sagittal T1', 'Axial T2']\n\nunique_study_id = df[\"study_id\"].unique()\n# 1975 unique study_id\n\n\nfor idx, si in enumerate(tqdm(unique_study_id, total=len(unique_study_id))):\n    pdf = df[df['study_id'] == si]\n    for ds in unique_series_description:\n        ds_ = ds.replace('/', '_')\n        pdf_ = pdf[pdf['series_description'] == ds]\n        os.makedirs(f'cvt_png/{si}/{ds_}', exist_ok=True)\n        allimgs = []\n        for i, row in pdf_.iterrows():\n            pimgs = glob.glob(\n                f'{rd}/train_images/{row[\"study_id\"]}/{row[\"series_id\"]}/*.dcm')\n            pimgs = sorted(pimgs, key=natural_keys)\n            allimgs.extend(pimgs)\n\n        if len(allimgs) == 0:\n            print(si, ds, 'has no images')\n            continue\n\n        if ds == 'Axial T2':\n            for j, impath in enumerate(allimgs):\n                dst = f'cvt_png/{si}/{ds}/{j:03d}.png'\n                convert_to_png(impath, dst)\n\n        elif ds == 'Sagittal T2/STIR':\n\n            step = len(allimgs) / 10.0\n            st = len(allimgs)/2.0 - 4.0*step\n            end = len(allimgs)+0.0001\n            for j, i in enumerate(np.arange(st, end, step)):\n                dst = f'cvt_png/{si}/{ds_}/{j:03d}.png'\n                ind2 = max(0, int((i-0.5001).round()))\n                convert_to_png(allimgs[ind2], dst)\n\n            assert len(glob.glob(f'cvt_png/{si}/{ds_}/*.png')) == 10\n\n        elif ds == 'Sagittal T1':\n            step = len(allimgs) / 10.0\n            st = len(allimgs)/2.0 - 4.0*step\n            end = len(allimgs)+0.0001\n            for j, i in enumerate(np.arange(st, end, step)):\n                dst = f'cvt_png/{si}/{ds}/{j:03d}.png'\n                ind2 = max(0, int((i-0.5001).round()))\n                convert_to_png(allimgs[ind2], dst)\n\n            assert len(glob.glob(f'cvt_png/{si}/{ds}/*.png')) == 10\n","metadata":{"execution":{"iopub.status.busy":"2024-09-01T10:13:04.683268Z","iopub.execute_input":"2024-09-01T10:13:04.683774Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}