Histolab
Aperçu
Histolab est une bibliothèque Python pour traiter les images de lames entières (WSI) en pathologie numérique. Elle automatise la détection des tissus, extrait des tuiles informatives à partir d'images gigapixel et prépare les ensembles de données pour les pipelines d'apprentissage profond. La bibliothèque gère plusieurs formats WSI, implémente une segmentation tissulaire sophistiquée et fournit des stratégies d'extraction de tuiles flexibles.
Installation
uv pip install histolab
Démarrage rapide
Flux de travail de base pour extraire des tuiles à partir d'une image de lame entière :
from histolab.slide import Slide
from histolab.tiler import RandomTiler
# Charger la lame
slide = Slide("slide.svs", processed_path="output/")
# Configurer le tiler
tiler = RandomTiler(
tile_size=(512, 512),
n_tiles=100,
level=0,
seed=42
)
# Aperçu des emplacements de tuiles
tiler.locate_tiles(slide, n_tiles=20)
# Extraire les tuiles
tiler.extract(slide)
Capacités principales
1. Gestion des lames
Charger, inspecter et travailler avec des images de lames entières dans divers formats.
Opérations courantes :
- Chargement de fichiers WSI (SVS, TIFF, NDPI, etc.)
- Accès aux métadonnées de la lame (dimensions, grossissement, propriétés)
- Génération de vignettes pour la visualisation
- Travail avec des structures d'images pyramidales
- Extraction de régions à des coordonnées spécifiques
Classes principales : Slide
Référence : references/slide_management.md contient une documentation complète sur :
- Initialisation et configuration des lames
- Ensembles de données d'exemple intégrés (tissus prostatique, ovarien, mammaire, cardiaque, rénal)
- Accès aux propriétés et métadonnées des lames
- Génération et visualisation de vignettes
- Travail avec les niveaux pyramidaux
- Flux de traitement multi-lames
Flux de travail exemple :
from histolab.slide import Slide
from histolab.data import prostate_tissue
# Charger les données d'exemple
prostate_svs, prostate_path = prostate_tissue()
# Initialiser la lame
slide = Slide(prostate_path, processed_path="output/")
# Inspecter les propriétés
print(f"Dimensions: {slide.dimensions}")
print(f"Niveaux: {slide.levels}")
print(f"Grossissement: {slide.properties.get('openslide.objective-power')}")
# Enregistrer la vignette
slide.save_thumbnail()
2. Détection des tissus et masques
Identifier automatiquement les régions tissulaires et filtrer le fond/les artefacts.
Opérations courantes :
- Création de masques tissulaires binaires
- Détection de la plus grande région tissulaire
- Exclusion du fond et des artefacts
- Segmentation tissulaire personnalisée
- Suppression des annotations au stylo
Classes principales : TissueMask, BiggestTissueBoxMask, BinaryMask
Référence : references/tissue_masks.md contient une documentation complète sur :
- TissueMask : Segmente toutes les régions tissulaires en utilisant des filtres automatisés
- BiggestTissueBoxMask : Retourne le rectangle englobant de la plus grande région tissulaire (par défaut)
- BinaryMask : Classe de base pour les implémentations de masque personnalisé
- Visualisation des masques avec
locate_mask() - Création de masques rectangulaires personnalisés et d'exclusion d'annotations
- Intégration des masques avec l'extraction de tuiles
- Bonnes pratiques et dépannage
Flux de travail exemple :
from histolab.masks import TissueMask, BiggestTissueBoxMask
# Créer un masque tissulaire pour toutes les régions tissulaires
tissue_mask = TissueMask()
# Visualiser le masque sur la lame
slide.locate_mask(tissue_mask)
# Obtenir le tableau de masque
mask_array = tissue_mask(slide)
# Utiliser la plus grande région tissulaire (par défaut pour la plupart des extracteurs)
biggest_mask = BiggestTissueBoxMask()
Quand utiliser chaque masque :
TissueMask: Sections tissulaires multiples, analyse complèteBiggestTissueBoxMask: Principale section tissulaire unique, exclure les artefacts (par défaut)BinaryMaskpersonnalisé : ROI spécifique, exclure les annotations, segmentation personnalisée
3. Extraction de tuiles
Extraire des régions plus petites à partir de grandes WSI en utilisant différentes stratégies.
Trois stratégies d'extraction :
RandomTiler : Extraire un nombre fixe de tuiles positionnées aléatoirement
- Optimal pour : Échantillonnage de régions diversifiées, analyse exploratoire, données d'entraînement
- Paramètres clés :
n_tiles,seedpour la reproductibilité
GridTiler : Extraire systématiquement les tuiles à travers le tissu selon un motif en grille
- Optimal pour : Couverture complète, analyse spatiale, reconstruction
- Paramètres clés :
pixel_overlappour les fenêtres glissantes
ScoreTiler : Extraire les tuiles les mieux classées en fonction de fonctions de notation
- Optimal pour : Régions les plus informatives, sélection axée sur la qualité
- Paramètres clés :
scorer(NucleiScorer, CellularityScorer, personnalisé)
Paramètres courants :
tile_size: Dimensions de tuile (p. ex., (512, 512))level: Niveau pyramidal pour l'extraction (0 = résolution la plus élevée)check_tissue: Filtrer les tuiles par contenu tissulairetissue_percent: Couverture tissulaire minimale (par défaut 80%)extraction_mask: Masque définissant la région d'extraction
Référence : references/tile_extraction.md contient une documentation complète sur :
- Explication détaillée de chaque stratégie de tiler
- Notateurs disponibles (NucleiScorer, CellularityScorer, personnalisé)
- Aperçu des tuiles avec
locate_tiles() - Flux de travail d'extraction et rapports
- Motifs avancés (extraction multi-niveaux, hiérarchique)
- Optimisation des performances et dépannage
Flux de travail exemples :
from histolab.tiler import RandomTiler, GridTiler, ScoreTiler
from histolab.scorer import NucleiScorer
# Échantillonnage aléatoire (rapide, diversifié)
random_tiler = RandomTiler(
tile_size=(512, 512),
n_tiles=100,
level=0,
seed=42,
check_tissue=True,
tissue_percent=80.0
)
random_tiler.extract(slide)
# Couverture en grille (complète)
grid_tiler = GridTiler(
tile_size=(512, 512),
level=0,
pixel_overlap=0,
check_tissue=True
)
grid_tiler.extract(slide)
# Sélection basée sur la notation (la plus informative)
score_tiler = ScoreTiler(
tile_size=(512, 512),
n_tiles=50,
scorer=NucleiScorer(),
level=0
)
score_tiler.extract(slide, report_path="tiles_report.csv")
Toujours prévisualiser avant extraction :
# Aperçu des emplacements de tuiles sur la vignette
tiler.locate_tiles(slide, n_tiles=20)
4. Filtres et prétraitement
Appliquer des filtres de traitement d'images pour la détection tissulaire, le contrôle de qualité et le prétraitement.
Catégories de filtres :
Filtres d'image : Conversions d'espace colorimétrique, seuillage, amélioration du contraste
RgbToGrayscale,RgbToHsv,RgbToHedOtsuThreshold,AdaptiveThresholdStretchContrast,HistogramEqualization
Filtres morphologiques : Opérations structurelles sur images binaires
BinaryDilation,BinaryErosionBinaryOpening,BinaryClosingRemoveSmallObjects,RemoveSmallHoles
Composition : Enchaîner plusieurs filtres
Compose: Créer des pipelines de filtres
Référence : references/filters_preprocessing.md contient une documentation complète sur :
- Explication détaillée de chaque type de filtre
- Composition et enchaînement de filtres
- Pipelines de prétraitement courants (détection tissulaire, suppression de stylo, amélioration de noyaux)
- Application de filtres aux tuiles
- Filtres de masque personnalisés
- Filtres de contrôle de qualité (détection de flou, couverture tissulaire)
- Bonnes pratiques et dépannage
Flux de travail exemples :
from histolab.filters.compositions import Compose
from histolab.filters.image_filters import RgbToGrayscale, OtsuThreshold
from histolab.filters.morphological_filters import (
BinaryDilation, RemoveSmallHoles, RemoveSmallObjects
)
# Pipeline standard de détection tissulaire
tissue_detection = Compose([
RgbToGrayscale(),
OtsuThreshold(),
BinaryDilation(disk_size=5),
RemoveSmallHoles(area_threshold=1000),
RemoveSmallObjects(area_threshold=500)
])
# Utiliser avec un masque personnalisé
from histolab.masks import TissueMask
custom_mask = TissueMask(filters=tissue_detection)
# Appliquer les filtres à la tuile
from histolab.tile import Tile
filtered_tile = tile.apply_filters(tissue_detection)
5. Visualisation
Visualiser les lames, masques, emplacements de tuiles et qualité d'extraction.
Tâches de visualisation courantes :
- Affichage de vignettes de lames
- Visualisation de masques tissulaires
- Aperçu des emplacements de tuiles
- Évaluation de la qualité des tuiles
- Création de rapports et figures
Référence : references/visualization.md contient une documentation complète sur :
- Affichage et enregistrement de vignettes de lames
- Visualisation de masques avec
locate_mask() - Aperçu des emplacements de tuiles avec
locate_tiles() - Affichage des tuiles extraites et mosaïques
- Évaluation de la qualité (distributions de scores, tuiles supérieures vs inférieures)
- Visualisation multi-lames
- Visualisation des effets de filtre
- Export de figures haute résolution et rapports PDF
- Visualisation interactive dans les notebooks Jupyter
Flux de travail exemples :
import matplotlib.pyplot as plt
from histolab.masks import TissueMask
# Afficher la vignette de la lame
plt.figure(figsize=(10, 10))
plt.imshow(slide.thumbnail)
plt.title(f"Lame: {slide.name}")
plt.axis('off')
plt.show()
# Visualiser le masque tissulaire
tissue_mask = TissueMask()
slide.locate_mask(tissue_mask)
# Aperçu des emplacements de tuiles
tiler = RandomTiler(tile_size=(512, 512), n_tiles=50)
tiler.locate_tiles(slide, n_tiles=20)
# Afficher les tuiles extraites en grille
from pathlib import Path
from PIL import Image
tile_paths = list(Path("output/tiles/").glob("*.png"))[:16]
fig, axes = plt.subplots(4, 4, figsize=(12, 12))
axes = axes.ravel()
for idx, tile_path in enumerate(tile_paths):
tile_img = Image.open(tile_path)
axes[idx].imshow(tile_img)
axes[idx].set_title(tile_path.stem, fontsize=8)
axes[idx].axis('off')
plt.tight_layout()
plt.show()
Flux de travail typiques
Flux de travail 1 : Extraction de tuiles exploratoire
Échantillonnage rapide de régions tissulaires diversifiées pour l'analyse initiale.
from histolab.slide import Slide
from histolab.tiler import RandomTiler
import logging
# Activer la journalisation pour le suivi de la progression
logging.basicConfig(level=logging.INFO)
# Charger la lame
slide = Slide("slide.svs", processed_path="output/random_tiles/")
# Inspecter la lame
print(f"Dimensions: {slide.dimensions}")
print(f"Niveaux: {slide.levels}")
slide.save_thumbnail()
# Configurer le tiler aléatoire
random_tiler = RandomTiler(
tile_size=(512, 512),
n_tiles=100,
level=0,
seed=42,
check_tissue=True,
tissue_percent=80.0
)
# Aperçu des emplacements
random_tiler.locate_tiles(slide, n_tiles=20)
# Extraire les tuiles
random_tiler.extract(slide)
Flux de travail 2 : Extraction complète en grille
Couverture tissulaire complète pour l'analyse de lame entière.
from histolab.slide import Slide
from histolab.tiler import GridTiler
from histolab.masks import TissueMask
# Charger la lame
slide = Slide("slide.svs", processed_path="output/grid_tiles/")
# Utiliser TissueMask pour toutes les sections tissulaires
tissue_mask = TissueMask()
slide.locate_mask(tissue_mask)
# Configurer le tiler en grille
grid_tiler = GridTiler(
tile_size=(512, 512),
level=1, # Utiliser le niveau 1 pour une extraction plus rapide
pixel_overlap=0,
check_tissue=True,
tissue_percent=70.0
)
# Aperçu de la grille
grid_tiler.locate_tiles(slide)
# Extraire toutes les tuiles
grid_tiler.extract(slide, extraction_mask=tissue_mask)
Flux de travail 3 : Sélection de tuiles axée sur la qualité
Extraire les tuiles les plus informatives en fonction de la densité de noyaux.
from histolab.slide import Slide
from histolab.tiler import ScoreTiler
from histolab.scorer import NucleiScorer
import pandas as pd
import matplotlib.pyplot as plt
# Charger la lame
slide = Slide("slide.svs", processed_path="output/scored_tiles/")
# Configurer le score tiler
score_tiler = ScoreTiler(
tile_size=(512, 512),
n_tiles=50,
level=0,
scorer=NucleiScorer(),
check_tissue=True
)
# Aperçu des meilleures tuiles
score_tiler.locate_tiles(slide, n_tiles=15)
# Extraire avec rapport
score_tiler.extract(slide, report_path="tiles_report.csv")
# Analyser les scores
report_df = pd.read_csv("tiles_report.csv")
plt.hist(report_df['score'], bins=20, edgecolor='black')
plt.xlabel('Score de tuile')
plt.ylabel('Fréquence')
plt.title('Distribution des scores de tuiles')
plt.show()
Flux de travail 4 : Pipeline de traitement multi-lames
Traiter une collection entière de lames avec des paramètres cohérents.
from pathlib import Path
from histolab.slide import Slide
from histolab.tiler import RandomTiler
import logging
logging.basicConfig(level=logging.INFO)
# Configurer le tiler une fois
tiler = RandomTiler(
tile_size=(512, 512),
n_tiles=50,
level=0,
seed=42,
check_tissue=True
)
# Traiter toutes les lames
slide_dir = Path("slides/")
output_base = Path("output/")
for slide_path in slide_dir.glob("*.svs"):
print(f"\nTraitement: {slide_path.name}")
# Créer un répertoire de sortie spécifique à la lame
output_dir = output_base / slide_path.stem
output_dir.mkdir(parents=True, exist_ok=True)
# Charger et traiter la lame
slide = Slide(slide_path, processed_path=output_dir)
# Enregistrer la vignette pour la révision
slide.save_thumbnail()
# Extraire les tuiles
tiler.extract(slide)
print(f"Terminé: {slide_path.name}")
Flux de travail 5 : Détection de tissus personnalisée et filtrage
Gérer les lames avec artefacts, annotations ou coloration inhabituelle.
from histolab.slide import Slide
from histolab.masks import TissueMask
from histolab.tiler import RandomTiler
from histolab.filters.compositions import Compose
from histolab.filters.image_filters import RgbToGrayscale, OtsuThreshold
from histolab.filters.morphological_filters import (
BinaryDilation, RemoveSmallObjects, RemoveSmallHoles
)
# Définir un pipeline de filtre personnalisé pour la suppression agressive d'artefacts
aggressive_filters = Compose([
RgbToGrayscale(),
OtsuThreshold(),
BinaryDilation(disk_size=10),
RemoveSmallHoles(area_threshold=5000),
RemoveSmallObjects(area_threshold=3000) # Supprimer les artefacts plus grands
])
# Créer un masque personnalisé
custom_mask = TissueMask(filters=aggressive_filters)
# Charger la lame et visualiser le masque
slide = Slide("slide.svs", processed_path="output/")
slide.locate_mask(custom_mask)
# Extraire avec masque personnalisé
tiler = RandomTiler(tile_size=(512, 512), n_tiles=100)
tiler.extract(slide, extraction_mask=custom_mask)
Bonnes pratiques
Chargement et inspection des lames
- Toujours inspecter les propriétés des lames avant le traitement
- Enregistrer les vignettes pour la révision visuelle rapide
- Vérifier les niveaux pyramidaux et les dimensions
- Vérifier la présence de tissu en utilisant les vignettes
Détection tissulaire
- Prévisualiser les masques avec
locate_mask()avant l'extraction - Utiliser
TissueMaskpour les sections multiples,BiggestTissueBoxMaskpour les sections uniques - Personnaliser les filtres pour des colorations spécifiques (H&E vs IHC)
- Gérer les annotations au stylo avec des masques personnalisés
- Tester les masques sur des lames diversifiées
Extraction de tuiles
- Toujours prévisualiser avec
locate_tiles()avant extraction - Choisir le tiler approprié :
- RandomTiler : Échantillonnage et exploration
- GridTiler : Couverture complète
- ScoreTiler : Sélection axée sur la qualité
- Définir un seuil
tissue_percentapproprié (70-90% typique) - Utiliser des graines pour la reproductibilité dans RandomTiler
- Extraire au niveau pyramidal approprié pour la résolution d'analyse
- Activer la journalisation pour les grands ensembles de données
Performance
- Extraire à des niveaux inférieurs (1, 2) pour un traitement plus rapide
- Utiliser
BiggestTissueBoxMaskplutôt queTissueMaskquand approprié - Ajuster
tissue_percentpour réduire les tentatives de tuiles invalides - Limiter
n_tilespour l'exploration initiale - Utiliser
pixel_overlap=0pour les grilles sans chevauchement
Contrôle de qualité
- Valider la qualité des tuiles (vérifier le flou, les artefacts, la mise au point)
- Examiner les distributions de scores pour ScoreTiler
- Inspecter les tuiles avec les meilleurs et pires scores
- Surveiller les statistiques de couverture tissulaire
- Filtrer les tuiles extraites par des métriques de qualité supplémentaires si nécessaire
Cas d'usage courants
Entraînement de modèles d'apprentissage profond
- Extraire des ensembles de données équilibrés à l'aide de RandomTiler sur plusieurs lames
- Utiliser ScoreTiler avec NucleiScorer pour se concentrer sur les régions riches en cellules
- Extraire à une résolution cohérente (niveau 0 ou niveau 1)
- Générer des rapports CSV pour le suivi des métadonnées de tuiles
Analyse de lame entière
- Utiliser GridTiler pour une couverture tissulaire complète
- Extraire à plusieurs niveaux pyramidaux pour l'analyse hiérarchique
- Maintenir les relations spatiales avec les positions de grille
- Utiliser
pixel_overlappour les approches par fenêtres glissantes
Caractérisation tissulaire
- Échantillonner des régions diversifiées avec RandomTiler
- Quantifier la couverture tissulaire avec des masques
- Extraire des informations spécifiques à la coloration avec la décomposition HED
- Comparer les motifs tissulaires entre les lames
Évaluation de la qualité
- Identifier les régions optimales de mise au point avec ScoreTiler
- Détecter les artefacts en utilisant des masques et filtres personnalisés
- Évaluer la qualité de coloration dans la collection de lames
- Signaler les lames problématiques pour révision manuelle
Curation d'ensembles de données
- Utiliser ScoreTiler pour prioriser les tuiles informatives
- Filtrer les tuiles par pourcentage tissulaire
- Générer des rapports avec scores de tuiles et métadonnées
- Créer des ensembles de données stratifiés entre les lames et les types de tissus
Dépannage
Aucune tuile extraite
- Abaisser le seuil
tissue_percent - Vérifier que la lame contient du tissu (vérifier la vignette)
- S'assurer que extraction_mask capture les régions tissulaires
- Vérifier que tile_size est approprié pour la résolution de la lame
Beaucoup de tuiles de fond
- Activer
check_tissue=True - Augmenter le seuil
tissue_percent - Utiliser le masque approprié (TissueMask vs BiggestTissueBoxMask)
- Personnaliser les filtres de masque pour mieux détecter le tissu
Extraction très lente
- Extraire à un niveau pyramidal inférieur (level=1 ou 2)
- Réduire
n_tilespour RandomTiler/ScoreTiler - Utiliser RandomTiler à la place de GridTiler pour l'échantillonnage
- Utiliser BiggestTissueBoxMask à la place de TissueMask
Les tuiles ont des artefacts
- Implémenter des masques personnalisés d'exclusion d'annotations
- Ajuster les paramètres de filtre pour la suppression d'artefacts
- Augmenter le seuil de suppression des petits objets
- Appliquer le filtrage de qualité post-extraction
Résultats incohérents entre les lames
- Utiliser la même graine pour RandomTiler
- Normaliser la coloration avec des filtres de prétraitement
- Ajuster
tissue_percentpar qualité de coloration - Implémenter la personnalisation de masques spécifiques à la lame
Ressources
Cette compétence comprend une documentation de référence détaillée dans le répertoire references/ :
references/slide_management.md
Guide complet pour charger, inspecter et travailler avec des images de lames entières :
- Initialisation et configuration des lames
- Ensembles de données d'exemple intégrés
- Propriétés et métadonnées des lames
- Génération et visualisation de vignettes
- Travail avec les niveaux pyramidaux
- Flux de traitement multi-lames
- Bonnes pratiques et motifs courants
references/tissue_masks.md
Documentation complète sur la détection tissulaire et le masquage :
- Classes TissueMask, BiggestTissueBoxMask, BinaryMask
- Fonctionnement des filtres de détection tissulaire
- Personnalisation des masques avec des chaînes de filtre
- Visualisation des masques
- Création de masques rectangulaires personnalisés et d'exclusion d'annotations
- Intégration avec l'extraction de tuiles
- Bonnes pratiques et dépannage
references/tile_extraction.md
Explication détaillée des stratégies d'extraction de tuiles :
- Comparaison RandomTiler, GridTiler, ScoreTiler
- Notateurs disponibles (NucleiScorer, CellularityScorer, personnalisé)
- Paramètres courants et spécifiques à la stratégie
- Aperçu des tuiles avec locate_tiles()
- Flux de travail d'extraction et rapports CSV
- Motifs avancés (multi-niveaux, hiérarchique)
- Optimisation des performances
- Dépannage des problèmes courants
references/filters_preprocessing.md
Référence complète des filtres et guide de prétraitement :
- Filtres d'image (conversion colorimétrique, seuillage, contraste)
- Filtres morphologiques (dilatation, érosion, ouverture, fermeture)
- Composition et enchaînement de filtres
- Pipelines de prétraitement courants
- Application de filtres aux tuiles
- Filtres de masque personnalisés
- Filtres de contrôle de qualité
- Bonnes pratiques et dépannage
references/visualization.md
Guide de visualisation complet :
- Affichage et enregistrement de vignettes de lames
- Techniques de visualisation de masques
- Aperçu des emplacements de tuiles
- Affichage des tuiles extraites et création de mosaïques
- Visualisations d'évaluation de qualité
- Comparaison multi-lames
- Visualisation des effets de filtre
- Export de figures haute résolution et PDF
- Visualisation interactive dans les notebooks Jupyter
Motif d'utilisation : Les fichiers de référence contiennent des informations détaillées pour soutenir les flux de travail décrits dans ce document de compétence principal. Charger les fichiers de référence spécifiques selon les besoins pour des conseils d'implémentation détaillés, du dépannage ou des fonctionnalités avancées.