{"metadata":{"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"},"kaggle":{"accelerator":"none","dataSources":[{"sourceId":117682,"databundleVersionId":14443416,"sourceType":"competition"},{"sourceId":13784990,"sourceType":"datasetVersion","datasetId":8775318}],"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":false}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"code","source":"!pip install /kaggle/input/imagedecodecs-whl/imagecodecs-2025.11.11-cp311-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"!pip install imageio","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import imageio.v3 as iio\nfrom PIL import Image\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\n\n# --- Définition des RACINES ---\nPATH_VOLUME_ROOT = \"/kaggle/input/vesuvius-challenge-surface-detection/train_images/\"\n\ndef inspect_and_plot_volume(image_id):\n    \"\"\"\n    Lit le volume entier, affiche sa taille et plotte les tranches de début et de fin.\n    \"\"\"\n    volume_path = f\"{PATH_VOLUME_ROOT}{image_id}.tif\"\n    \n    try:\n        # 1. Lire le volume entier dans une liste (cela confirme que imageio peut décoder LZW)\n        print(f\"Lecture complète du volume {image_id} pour inspection...\")\n        \n        # On lit toutes les tranches sans spécifier d'index\n        volume = iio.imread(volume_path) \n        \n        # 2. Vérifier la taille\n        num_slices = len(volume)\n        print(f\"SUCCÈS ! Le volume {image_id} contient {num_slices} tranches.\")\n        \n        if num_slices == 0:\n            print(\"Erreur critique : Le volume est vide.\")\n            return\n\n        # 3. Définir les indices de visualisation (Première, Milieu, Dernière)\n        first_slice_index = 0\n        middle_slice_index = num_slices // 2\n        last_slice_index = num_slices - 1\n        \n        # 4. Préparer les plots pour vérification\n        fig, ax = plt.subplots(1, 3, figsize=(20, 7))\n\n        # Tranche 1: Début\n        ax[0].imshow(volume[first_slice_index], cmap='gray')\n        ax[0].set_title(f\"Tranche {first_slice_index} (Début)\")\n        ax[0].axis('off')\n\n        # Tranche 2: Milieu\n        ax[1].imshow(volume[middle_slice_index], cmap='gray')\n        ax[1].set_title(f\"Tranche {middle_slice_index} (Milieu)\")\n        ax[1].axis('off')\n\n        # Tranche 3: Fin\n        ax[2].imshow(volume[last_slice_index], cmap='gray')\n        ax[2].set_title(f\"Tranche {last_slice_index} (Fin)\")\n        ax[2].axis('off')\n\n        plt.suptitle(f\"Inspection du Volume {image_id} (Taille Totale : {num_slices})\")\n        plt.tight_layout()\n        plt.show()\n\n    except Exception as e:\n        print(f\"ÉCHEC CRITIQUE lors de la lecture/du plot pour {image_id}: {e}\")\n\n# --- Exécution ---\n\ntrain_ids = [\"1004283650\", \"1006462223\", \"1013184726\"]\n\nprint(\"--- Démarrage de l'Inspection Complète du Volume avec imageio ---\")\nfor image_id in train_ids:\n    print(f\"\\nInspection de l'ID {image_id}...\")\n    inspect_and_plot_volume(image_id)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import imageio.v3 as iio\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\n\n# --- Définition des RACINES ---\nPATH_LABEL_ROOT = \"/kaggle/input/vesuvius-challenge-surface-detection/train_labels/\" \n\ndef plot_label_slice(image_id, slice_index=50):\n    \"\"\"\n    Lit le masque de volume 3D et affiche une tranche 2D au milieu.\n    \"\"\"\n    label_path = f\"{PATH_LABEL_ROOT}{image_id}.tif\" \n    \n    try:\n        # 1. Lire le Masque de Volume 3D\n        print(f\"Tentative de lecture du masque de volume 3D {image_id}...\")\n        label_volume = iio.imread(label_path)\n        \n        # 2. Déterminer la tranche à afficher (Milieu)\n        num_slices = len(label_volume) # Devrait être 320\n        slice_idx = num_slices // 2\n        \n        # 3. Extraire la tranche 2D du Masque\n        label_slice = label_volume[slice_idx] \n\n        # 4. Préparation pour l'affichage (Isoler Encre et Non-étiqueté)\n        # 1 = Foreground (Encre), 2 = Unlabeled\n        mask_ink = (label_slice == 1).astype(np.float32)\n        mask_unlabeled = (label_slice == 2).astype(np.float32)\n\n        # 5. Visualisation\n        fig, ax = plt.subplots(1, 2, figsize=(15, 7))\n\n        ax[0].imshow(mask_ink, cmap='hot')\n        ax[0].set_title(f\"Masque: Encre (1) Tranche {slice_idx}\")\n        ax[0].axis('off')\n\n        ax[1].imshow(mask_unlabeled, cmap='magma')\n        ax[1].set_title(f\"Masque: Non Étiqueté (2) Tranche {slice_idx}\")\n        ax[1].axis('off')\n        \n        plt.suptitle(f\"Inspection du Masque de Volume {image_id} (Taille : {label_volume.shape})\")\n        plt.tight_layout()\n        plt.show()\n\n    except Exception as e:\n        print(f\"ÉCHEC CRITIQUE lors de la lecture/du plot pour {image_id}: {e}\")\n\n# --- Exécution ---\n\ntrain_ids = [\"1004283650\", \"1006462223\", \"1013184726\"]\n\nprint(\"--- Démarrage de l'Inspection des Tranches du Masque 3D ---\")\nfor image_id in train_ids:\n    plot_label_slice(image_id)","metadata":{"trusted":true},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import imageio.v3 as iio\nimport numpy as np\nimport matplotlib.pyplot as plt\nimport os\n\n# --- Définition des RACINES ---\nPATH_VOLUME_ROOT = \"/kaggle/input/vesuvius-challenge-surface-detection/train_images/\"\nPATH_LABEL_ROOT = \"/kaggle/input/vesuvius-challenge-surface-detection/train_labels/\" \n\ndef plot_overlay_ct_label(image_id):\n    \"\"\"\n    Lit une tranche CT et la tranche correspondante du masque d'étiquette, \n    puis superpose le masque d'encre sur l'image CT.\n    \"\"\"\n    volume_path = f\"{PATH_VOLUME_ROOT}{image_id}.tif\"\n    label_path = f\"{PATH_LABEL_ROOT}{image_id}.tif\" \n    \n    try:\n        # 1. Lire le Volume CT\n        print(f\"Lecture du volume CT {image_id}...\")\n        ct_volume = iio.imread(volume_path)\n        \n        # 2. Lire le Masque de Volume 3D\n        print(f\"Lecture du masque de volume {image_id}...\")\n        label_volume = iio.imread(label_path)\n        \n        # S'assurer que les deux volumes ont la même dimension en profondeur\n        if len(ct_volume) != len(label_volume):\n            print(f\"Avertissement : Les volumes CT et Label ont des nombres de tranches différents pour {image_id}.\")\n            # On prend la plus petite taille pour éviter les erreurs d'index\n            num_slices = min(len(ct_volume), len(label_volume))\n        else:\n            num_slices = len(ct_volume)\n        \n        # 3. Choisir une tranche à visualiser (au milieu)\n        slice_idx = num_slices // 2\n        \n        # 4. Extraire la tranche CT et la tranche de masque correspondante\n        ct_slice = ct_volume[slice_idx]\n        label_slice = label_volume[slice_idx]\n        \n        # 5. Créer un masque binaire pour l'encre (où la valeur est 1)\n        # On peut aussi ajouter les zones non étiquetées si désiré\n        ink_mask = (label_slice == 1).astype(np.float32)\n\n        # 6. Visualisation\n        fig, ax = plt.subplots(1, 3, figsize=(20, 7))\n\n        # Tranche CT Brute\n        ax[0].imshow(ct_slice, cmap='gray')\n        ax[0].set_title(f\"Tranche CT {slice_idx} - {image_id}\")\n        ax[0].axis('off')\n\n        # Masque d'Encre Seul\n        ax[1].imshow(ink_mask, cmap='hot')\n        ax[1].set_title(f\"Masque d'Encre (Label == 1)\")\n        ax[1].axis('off')\n        \n        # Superposition du Masque sur la Tranche CT\n        ax[2].imshow(ct_slice, cmap='gray')\n        # On superpose le masque en rouge avec une transparence\n        ax[2].imshow(ink_mask, cmap='Reds', alpha=0.6, interpolation='none')\n        ax[2].set_title(f\"Superposition CT + Encre (Tranche {slice_idx})\")\n        ax[2].axis('off')\n        \n        plt.suptitle(f\"Superposition Label sur CT pour {image_id}\")\n        plt.tight_layout()\n        plt.show()\n\n    except Exception as e:\n        print(f\"ÉCHEC CRITIQUE lors de la superposition pour {image_id}: {e}\")\n\n# --- Exécution ---\n\ntrain_ids = [\"1004283650\", \"1006462223\", \"1013184726\"]\n\nprint(\"--- Démarrage de la Superposition CT et Labels ---\")\nfor image_id in train_ids:\n    plot_overlay_ct_label(image_id)","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}