{"metadata":{"kernelspec":{"name":"python3","display_name":"Python 3","language":"python"},"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":"gpu","dataSources":[{"sourceType":"competition","sourceId":99552,"databundleVersionId":13441085},{"sourceType":"datasetVersion","sourceId":12638707,"datasetId":2725849,"databundleVersionId":13241519},{"sourceType":"modelInstanceVersion","sourceId":507313,"databundleVersionId":13282028,"modelInstanceId":402614},{"sourceType":"kernelVersion","sourceId":255036297}],"dockerImageVersionId":31089,"isInternetEnabled":false,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install nibabel pydicom opencv-python matplotlib pandas seaborn scikit-image","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport pandas as pd\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport seaborn as sns\nimport nibabel as nib\nimport pydicom\nimport cv2\nfrom skimage import exposure","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# path \ndata_root = \"/kaggle/input/rsna-intracranial-aneurysm-detection/\"\n\ntrain_df = pd.read_csv(os.path.join(data_root, \"train.csv\"))\ntrain_localizers_df = pd.read_csv(os.path.join(data_root, \"train_localizers.csv\"))\n\nprint(train_df.head())\nprint(train_localizers_df.head())","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import os\nimport nibabel as nib\nimport matplotlib.pyplot as plt\n\n# Paths\nSERIES_DIR = os.path.join(data_root, \"series\")\nSEG_DIR = os.path.join(data_root, \"segmentations\")\n\n# List all .nii or .nii.gz files\nnii_files = [f for f in os.listdir(SEG_DIR) if f.endswith((\".nii\", \".nii.gz\"))]\n\nprint(\"Found\", len(nii_files), \"NIfTI files\")\n\n# Loop through the first few files and visualize\nfor i, nii_file in enumerate(nii_files[:3]):  # change 3 → number of patients you want to preview\n    nii_path = os.path.join(SEG_DIR, nii_file)\n    img = nib.load(nii_path)\n    img_data = img.get_fdata()\n\n    print(f\"{i+1}. File: {nii_file} | Shape: {img_data.shape}\")\n\n    # Show middle slice\n    slice_idx = img_data.shape[2] // 2\n    plt.imshow(img_data[:, :, slice_idx], cmap=\"gray\")\n    plt.title(f\"{nii_file} - Middle Slice\")\n    plt.axis(\"off\")\n    plt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"def load_dicom_series(series_folder):\n    files = [pydicom.dcmread(os.path.join(series_folder, f)) \n             for f in os.listdir(series_folder) if f.endswith(\".dcm\")]\n    files.sort(key=lambda x: int(x.InstanceNumber))  # sort slices\n    \n    volume = np.stack([f.pixel_array for f in files], axis=0)\n    return volume\n\n# Example: pick first SeriesInstanceUID\nseries_id = train_df.iloc[0][\"SeriesInstanceUID\"]\nseries_path = os.path.join(SERIES_DIR, series_id)\n\nvolume = load_dicom_series(series_path)\nprint(\"Volume shape:\", volume.shape)\n\n# Show middle slice\nplt.imshow(volume[volume.shape[0]//2], cmap=\"gray\")\nplt.title(f\"Series {series_id}\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import glob\n\n# Find all DICOM files recursively\ndcm_files = glob.glob(os.path.join(SERIES_DIR, \"**\", \"*.dcm\"), recursive=True)\n\nprint(\"Found\", len(dcm_files), \"DICOM files\")\nprint(\"Example:\", dcm_files[:5])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pydicom\nimport numpy as np\nimport matplotlib.pyplot as plt\n\n# Example: pick first 1 series (all slices inside same folder)\none_series = sorted(dcm_files[:50])  # change number depending on your dataset\nvolume = []\n\nfor dcm_path in one_series:\n    dcm = pydicom.dcmread(dcm_path)\n    volume.append(dcm.pixel_array)\n\nvolume = np.stack(volume, axis=-1)  # shape: (H, W, num_slices)\nprint(\"3D Volume shape:\", volume.shape)\n\n# Show middle slice\nslice_idx = volume.shape[2] // 2\nplt.imshow(volume[:, :, slice_idx], cmap=\"gray\")\nplt.title(\"Middle Slice of 3D CTA Volume\")\nplt.axis(\"off\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from skimage import exposure\nimport numpy as np\nimport matplotlib.pyplot as plt\n\nimg_data = dcm.pixel_array\n\ndef preprocess_image(img):\n    \"\"\"Normalize (0–1) and enhance contrast of a slice or volume.\"\"\"\n    img = img.astype(np.float32)\n\n    # Avoid divide by zero\n    if np.max(img) > np.min(img):\n        img = (img - np.min(img)) / (np.max(img) - np.min(img))\n    else:\n        img = np.zeros_like(img, dtype=np.float32)\n\n    # Contrast Limited Adaptive Histogram Equalization (CLAHE)\n    img = exposure.equalize_adapthist(img, clip_limit=0.03)\n\n    return img\n\n# Example: pick a middle slice from 3D volume\nif img_data.ndim == 3:   # for NIfTI or stacked DICOMs\n    slice_idx = img_data.shape[2] // 2\n    slice_img = img_data[:, :, slice_idx]\nelse:  # single 2D DICOM\n    slice_img = img_data\n\n# Apply preprocessing\nslice_img_prep = preprocess_image(slice_img)\n\n# Show result\nplt.figure(figsize=(8,4))\n\nplt.subplot(1,2,1)\nplt.imshow(slice_img, cmap=\"gray\")\nplt.title(\"Original Slice\")\nplt.axis(\"off\")\n\nplt.subplot(1,2,2)\nplt.imshow(slice_img_prep, cmap=\"gray\")\nplt.title(\"Preprocessed Slice\")\nplt.axis(\"off\")\n\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import glob, os\n\nseries_folder = os.path.join(data_root, \"series\")\nseg_folder = os.path.join(data_root, \"segmentations\")\n\nseries_files = sorted(glob.glob(os.path.join(series_folder, \"**\", \"*.dcm\"), recursive=True))\nseg_files = sorted(glob.glob(os.path.join(seg_folder, \"**\", \"*.dcm\"), recursive=True))\n\nprint(\"Series files found:\", len(series_files))\nprint(\"Segmentation files found:\", len(seg_files))\n\n# Print a few examples\nprint(\"Example series:\", series_files[:3])\nprint(\"Example segmentation:\", seg_files[:3])","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"series_files = sorted(glob.glob(os.path.join(series_folder, \"**\", \"*\"), recursive=True))\nseries_files = [f for f in series_files if os.path.isfile(f)]\n\nseg_files = sorted(glob.glob(os.path.join(seg_folder, \"**\", \"*\"), recursive=True))\nseg_files = [f for f in seg_files if os.path.isfile(f)]\n\nprint(\"Series files found:\", len(series_files))\nprint(\"Segmentation files found:\", len(seg_files))","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pydicom\n\ndcm = pydicom.dcmread(series_files[0])\nprint(dcm)\nplt.imshow(dcm.pixel_array, cmap=\"gray\")\nplt.show()","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}