# Typical Workflows Five end-to-end workflows: exploratory tile extraction, comprehensive grid extraction, quality-driven tile selection, multi-slide processing pipelines, and custom tissue detection and filtering. ## Typical Workflows ### Workflow 1: Exploratory Tile Extraction Quick sampling of diverse tissue regions for initial analysis. ```python from histolab.slide import Slide from histolab.tiler import RandomTiler from pathlib import Path import logging # Enable logging for progress tracking logging.basicConfig(level=logging.INFO) # Load slide slide = Slide("slide.svs", processed_path="output/random_tiles/") # Inspect slide print(f"Dimensions: {slide.dimensions}") print(f"Levels: {slide.levels}") Path(slide.processed_path).mkdir(parents=True, exist_ok=True) slide.thumbnail.save(Path(slide.processed_path) / f"{slide.name}_thumbnail.png") # Configure random tiler random_tiler = RandomTiler( tile_size=(512, 512), n_tiles=100, level=0, seed=42, check_tissue=True, tissue_percent=80.0 ) # Preview locations random_tiler.locate_tiles(slide, n_tiles=20) # Extract tiles random_tiler.extract(slide) ``` ### Workflow 2: Comprehensive Grid Extraction Complete tissue coverage for whole-slide analysis. ```python from histolab.slide import Slide from histolab.tiler import GridTiler from histolab.masks import TissueMask # Load slide slide = Slide("slide.svs", processed_path="output/grid_tiles/") # Use TissueMask for all tissue sections tissue_mask = TissueMask() slide.locate_mask(tissue_mask) # Configure grid tiler grid_tiler = GridTiler( tile_size=(512, 512), level=1, # Use level 1 for faster extraction pixel_overlap=0, check_tissue=True, tissue_percent=70.0 ) # Preview grid grid_tiler.locate_tiles(slide) # Extract all tiles grid_tiler.extract(slide, extraction_mask=tissue_mask) ``` ### Workflow 3: Quality-Driven Tile Selection Extract most informative tiles based on nuclei density. ```python from histolab.slide import Slide from histolab.tiler import ScoreTiler from histolab.scorer import NucleiScorer import pandas as pd import matplotlib.pyplot as plt # Load slide slide = Slide("slide.svs", processed_path="output/scored_tiles/") # Configure score tiler score_tiler = ScoreTiler( tile_size=(512, 512), n_tiles=50, level=0, scorer=NucleiScorer(), check_tissue=True ) # Preview top tiles score_tiler.locate_tiles(slide, n_tiles=15) # Extract with report score_tiler.extract(slide, report_path="tiles_report.csv") # Analyze scores report_df = pd.read_csv("tiles_report.csv") plt.hist(report_df['score'], bins=20, edgecolor='black') plt.xlabel('Tile Score') plt.ylabel('Frequency') plt.title('Distribution of Tile Scores') plt.show() ``` ### Workflow 4: Multi-Slide Processing Pipeline Process entire slide collection with consistent parameters. ```python from pathlib import Path from histolab.slide import Slide from histolab.tiler import RandomTiler import logging logging.basicConfig(level=logging.INFO) # Configure tiler once tiler = RandomTiler( tile_size=(512, 512), n_tiles=50, level=0, seed=42, check_tissue=True ) # Process all slides slide_dir = Path("slides/") output_base = Path("output/") for slide_path in slide_dir.glob("*.svs"): print(f"\nProcessing: {slide_path.name}") # Create slide-specific output directory output_dir = output_base / slide_path.stem output_dir.mkdir(parents=True, exist_ok=True) # Load and process slide slide = Slide(slide_path, processed_path=output_dir) # Save thumbnail for review Path(slide.processed_path).mkdir(parents=True, exist_ok=True) slide.thumbnail.save(Path(slide.processed_path) / f"{slide.name}_thumbnail.png") # Extract tiles tiler.extract(slide) print(f"Completed: {slide_path.name}") ``` ### Workflow 5: Custom Tissue Detection and Filtering Handle slides with artifacts, annotations, or unusual staining. ```python 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 ) # Define custom filter pipeline for aggressive artifact removal aggressive_filters = Compose([ RgbToGrayscale(), OtsuThreshold(), BinaryDilation(disk_size=10), RemoveSmallHoles(area_threshold=5000), RemoveSmallObjects(area_threshold=3000) # Remove larger artifacts ]) # Create custom mask custom_mask = TissueMask(filters=aggressive_filters) # Load slide and visualize mask slide = Slide("slide.svs", processed_path="output/") slide.locate_mask(custom_mask) # Extract with custom mask tiler = RandomTiler(tile_size=(512, 512), n_tiles=100) tiler.extract(slide, extraction_mask=custom_mask) ```