{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.11.13","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":99552,"databundleVersionId":13190393,"sourceType":"competition"}],"dockerImageVersionId":31089,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"import pandas as pd\nimport pydicom\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\n\n# Load CSV\ntrain_df = pd.read_csv(\"/kaggle/input/rsna-intracranial-aneurysm-detection/train.csv\")\nseries_id = train_df.SeriesInstanceUID.iloc[0]\n\n# Full path to series folder\nseries_path = Path(f\"/kaggle/input/rsna-intracranial-aneurysm-detection/series/{series_id}\")\n\n# Get sorted DICOM files\ndicom_paths = sorted(series_path.glob(\"*.dcm\"),\n                     key=lambda x: pydicom.dcmread(str(x)).InstanceNumber)\n\nif not dicom_paths:\n    raise FileNotFoundError(f\"No DICOM files found for {series_id}\")\n\n# Read middle slice\nmid_idx = len(dicom_paths) // 2\nds = pydicom.dcmread(str(dicom_paths[mid_idx]))\n\n# Display\nplt.imshow(ds.pixel_array, cmap=\"gray\")\nplt.title(f\"Series: {series_id}\")\nplt.axis(\"off\")\nplt.show()\n","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:43:42.492315Z","iopub.execute_input":"2025-08-13T16:43:42.492641Z","iopub.status.idle":"2025-08-13T16:43:47.479985Z","shell.execute_reply.started":"2025-08-13T16:43:42.492611Z","shell.execute_reply":"2025-08-13T16:43:47.479067Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nimport pydicom\nimport matplotlib.pyplot as plt\nfrom pathlib import Path\nimport SimpleITK as sitk\nimport ipywidgets as widgets","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:47:24.4825Z","iopub.execute_input":"2025-08-13T16:47:24.482811Z","iopub.status.idle":"2025-08-13T16:47:24.726202Z","shell.execute_reply.started":"2025-08-13T16:47:24.482789Z","shell.execute_reply":"2025-08-13T16:47:24.725332Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def preprocess_volume(series_path):\n    \"\"\"Read DICOM series, resample to 1mm³, clip & normalize.\"\"\"\n    reader = sitk.ImageSeriesReader()\n    dicom_names = reader.GetGDCMSeriesFileNames(series_path)\n    reader.SetFileNames(dicom_names)\n    image = reader.Execute()\n\n    # Resample to isotropic 1mm spacing\n    resample = sitk.ResampleImageFilter()\n    resample.SetOutputSpacing((1.0, 1.0, 1.0))\n    resample.SetInterpolator(sitk.sitkLinear)\n    resample.SetSize([int(sz * sp / 1.0) \n                      for sz, sp in zip(image.GetSize(), image.GetSpacing())])\n    resample.SetOutputDirection(image.GetDirection())\n    resample.SetOutputOrigin(image.GetOrigin())\n    image = resample.Execute(image)\n\n    # Convert to NumPy array\n    arr = sitk.GetArrayFromImage(image).astype(np.float32)\n\n    # Clip to [-100, 400] HU and normalize to [0, 1]\n    arr = np.clip(arr, -100, 400)\n    arr = (arr - arr.min()) / (arr.max() - arr.min())\n\n    return arr","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:47:38.963666Z","iopub.execute_input":"2025-08-13T16:47:38.964019Z","iopub.status.idle":"2025-08-13T16:47:38.972204Z","shell.execute_reply.started":"2025-08-13T16:47:38.963991Z","shell.execute_reply":"2025-08-13T16:47:38.971161Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"train_df = pd.read_csv(\"/kaggle/input/rsna-intracranial-aneurysm-detection/train.csv\")\nseries_id = train_df.SeriesInstanceUID.iloc[0]  # pick first series\nseries_path = Path(f\"/kaggle/input/rsna-intracranial-aneurysm-detection/series/{series_id}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:47:53.981416Z","iopub.execute_input":"2025-08-13T16:47:53.981732Z","iopub.status.idle":"2025-08-13T16:47:54.007253Z","shell.execute_reply.started":"2025-08-13T16:47:53.98171Z","shell.execute_reply":"2025-08-13T16:47:54.00636Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"dicom_paths = sorted(series_path.glob(\"*.dcm\"),\n                     key=lambda x: pydicom.dcmread(str(x)).InstanceNumber)\n\nif not dicom_paths:\n    raise FileNotFoundError(f\"No DICOM files found for {series_id}\")\n\nmid_idx = len(dicom_paths) // 2\nds = pydicom.dcmread(str(dicom_paths[mid_idx]))\n\nplt.imshow(ds.pixel_array, cmap=\"gray\")\nplt.title(f\"Series: {series_id} (Raw)\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:48:06.614234Z","iopub.execute_input":"2025-08-13T16:48:06.614563Z","iopub.status.idle":"2025-08-13T16:48:07.159679Z","shell.execute_reply.started":"2025-08-13T16:48:06.614539Z","shell.execute_reply":"2025-08-13T16:48:07.158768Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"arr = preprocess_volume(str(series_path))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:48:19.109157Z","iopub.execute_input":"2025-08-13T16:48:19.109508Z","iopub.status.idle":"2025-08-13T16:48:29.0397Z","shell.execute_reply.started":"2025-08-13T16:48:19.109485Z","shell.execute_reply":"2025-08-13T16:48:29.03881Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"mid_idx = arr.shape[0] // 2\nplt.imshow(arr[mid_idx], cmap=\"gray\")\nplt.title(f\"Series: {series_id} (Preprocessed)\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:48:55.395024Z","iopub.execute_input":"2025-08-13T16:48:55.39534Z","iopub.status.idle":"2025-08-13T16:48:55.556355Z","shell.execute_reply.started":"2025-08-13T16:48:55.395314Z","shell.execute_reply":"2025-08-13T16:48:55.555449Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"@widgets.interact(slice_idx=(0, arr.shape[0]-1))\ndef view_slice(slice_idx=0):\n    plt.imshow(arr[slice_idx], cmap=\"gray\")\n    plt.axis(\"off\")\n    plt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2025-08-13T16:48:59.424804Z","iopub.execute_input":"2025-08-13T16:48:59.425119Z","iopub.status.idle":"2025-08-13T16:48:59.533901Z","shell.execute_reply.started":"2025-08-13T16:48:59.425095Z","shell.execute_reply":"2025-08-13T16:48:59.533205Z"}},"outputs":[],"execution_count":null}]}