{"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":"# This Python 3 environment comes with many helpful analytics libraries installed\n# It is defined by the kaggle/python Docker image: https://github.com/kaggle/docker-python\n# For example, here's several helpful packages to load\n\nimport numpy as np # linear algebra\nimport pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)\n\n# Input data files are available in the read-only \"../input/\" directory\n# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory\n\nimport os\nfor dirname, _, filenames in os.walk('/kaggle/input'):\n    for filename in filenames:\n        print(os.path.join(dirname, filename))\n\n# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using \"Save & Run All\" \n# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","execution":{"iopub.status.busy":"2024-09-22T18:17:16.668637Z","iopub.execute_input":"2024-09-22T18:17:16.669170Z","iopub.status.idle":"2024-09-22T18:17:28.910974Z","shell.execute_reply.started":"2024-09-22T18:17:16.669114Z","shell.execute_reply":"2024-09-22T18:17:28.909719Z"},"collapsed":true,"jupyter":{"outputs_hidden":true},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"import os\nimport cv2\nimport numpy as np\nimport pydicom\nimport pandas as pd\nfrom tqdm import tqdm\nfrom glob import glob\nimport shutil","metadata":{"execution":{"iopub.status.busy":"2024-09-22T18:19:11.380954Z","iopub.execute_input":"2024-09-22T18:19:11.381388Z","iopub.status.idle":"2024-09-22T18:19:11.387259Z","shell.execute_reply.started":"2024-09-22T18:19:11.381331Z","shell.execute_reply":"2024-09-22T18:19:11.386155Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"df_test_series = pd.read_csv(\"/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_series_descriptions.csv\")\n","metadata":{"execution":{"iopub.status.busy":"2024-09-22T18:19:20.231320Z","iopub.execute_input":"2024-09-22T18:19:20.231740Z","iopub.status.idle":"2024-09-22T18:19:20.240670Z","shell.execute_reply.started":"2024-09-22T18:19:20.231705Z","shell.execute_reply":"2024-09-22T18:19:20.239606Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"def readdcm_writepng_image(src_dicom_pixelarray, dest_path_png):\n    '''\n    Convert DICOM pixel array to PNG with standardized pixel intensity.\n    '''\n    standardized_image_data = ((src_dicom_pixelarray - src_dicom_pixelarray.min()) / \n                               (src_dicom_pixelarray.max() - src_dicom_pixelarray.min() + 1e-10)) * 255\n    final_image_to_png = cv2.resize(standardized_image_data, (512, 512), interpolation=cv2.INTER_CUBIC)\n    cv2.imwrite(dest_path_png, final_image_to_png)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T18:19:21.389030Z","iopub.execute_input":"2024-09-22T18:19:21.389479Z","iopub.status.idle":"2024-09-22T18:19:21.395790Z","shell.execute_reply.started":"2024-09-22T18:19:21.389439Z","shell.execute_reply":"2024-09-22T18:19:21.394661Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"# Define paths\ntest_images_path = '/kaggle/input/rsna-2024-lumbar-spine-degenerative-classification/test_images'\noutput_path = '/kaggle/working/RSNA_test_images_png/'\n\n# Remove the output directory if it exists (for fresh conversion)\nif os.path.isdir(output_path):\n    shutil.rmtree(output_path)\n\n# Iterate over the test data\nfor idx, row in tqdm(df_test_series.iterrows(), total=len(df_test_series)):\n    study_id = row['study_id']\n    series_id = row['series_id']\n    series_desc = row['series_description'].replace(' ', '_').replace('/', '_')\n    \n    # Define the new directory structure for PNGs\n    series_output_dir = f'{output_path}/{study_id}/{series_desc}'\n    os.makedirs(series_output_dir, exist_ok=True)\n    \n    # Get all DICOM files in this series\n    series_dicom_dir = f'{test_images_path}/{study_id}/{series_id}'\n    dicom_files = glob(f'{series_dicom_dir}/*.dcm')\n    \n    # Convert each DICOM file to PNG\n    for dicom_file in dicom_files:\n        dicom_image = pydicom.dcmread(dicom_file)\n        image_filename = os.path.splitext(os.path.basename(dicom_file))[0]  # Use SOPInstanceUID for naming\n        image_dicom_pixelarray = dicom_image.pixel_array\n        \n        dest_path = f'{series_output_dir}/{image_filename}.png'\n        readdcm_writepng_image(image_dicom_pixelarray, dest_path)","metadata":{"execution":{"iopub.status.busy":"2024-09-22T18:19:23.228932Z","iopub.execute_input":"2024-09-22T18:19:23.229403Z","iopub.status.idle":"2024-09-22T18:19:25.744512Z","shell.execute_reply.started":"2024-09-22T18:19:23.229363Z","shell.execute_reply":"2024-09-22T18:19:25.743317Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"from PIL import Image\nimport matplotlib.pyplot as plt\n\n# Example of how to display images\nfor study_id in df_test_series['study_id'].unique():\n    study_dir = f'{output_path}/{study_id}'\n    \n    for series_desc in os.listdir(study_dir):\n        print(f'Series description: {series_desc}')\n        png_files = glob(f'{study_dir}/{series_desc}/*.png')\n        \n        for png_file in png_files[:5]:  # Display first 5 images\n            img = Image.open(png_file)\n            plt.imshow(img, cmap='gray')\n            plt.title(f'{series_desc} - {os.path.basename(png_file)}')\n            plt.axis('off')\n            plt.show()\n","metadata":{"execution":{"iopub.status.busy":"2024-09-22T18:19:27.939749Z","iopub.execute_input":"2024-09-22T18:19:27.940246Z","iopub.status.idle":"2024-09-22T18:19:30.947303Z","shell.execute_reply.started":"2024-09-22T18:19:27.940203Z","shell.execute_reply":"2024-09-22T18:19:30.946202Z"},"trusted":true},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]},{"cell_type":"code","source":"","metadata":{},"execution_count":null,"outputs":[]}]}