Skip to content
Data
Skill

/histolab

Extracts and preprocesses whole-slide histology image tiles with Histolab. Use for WSI inspection, tissue masks, random/grid/score-based tile extraction, H&E stain normalization, and tile dataset preparation. For multiplexed imaging or deep learning inference pipelines, use

From plugin
scientific-agent-skills
56k177 skills

Claude Code

$ npx -y skills add K-Dense-AI/scientific-agent-skills --skill histolab --agent claude-code

SKILL.md

histolab.SKILL.md
name: histolab
description: Extracts and preprocesses whole-slide histology image tiles with Histolab. Use for WSI inspection, tissue masks, random/grid/score-based tile extraction, H&E stain normalization, and tile dataset preparation. For multiplexed imaging or deep learning inference pipelines, use pathml.
license: Apache-2.0 license
compatibility: Requires Python 3.8โ€“3.11 and histolab 0.7.0 on Linux or macOS, plus native OpenSlide. Python 3.10 avoids scikit-image 0.19 source builds on macOS ARM. Optional pooch downloads samples; matplotlib plots results; large-image plus a tile source enables MPP extraction.
metadata:
  version: "1.5"
  skill-author: K-Dense Inc.
  last-reviewed: "2026-10-01"
  upstream-version: "0.7.0"

Histolab

When to use

Use Histolab to inspect WSI metadata, identify tissue, extract image tiles, and standardize H&E staining. Its masks and scores are image-processing heuristics; they do not diagnose cancer, count individual cells, or establish image quality.

Installation

Histolab 0.7.0 remains the latest published release as of the review date. Its [release constraints](https://github.com/histolab/histolab/blob/v0.7.0/pyproject.toml) require Python <3.12, NumPy <=1.24.4, scikit-image <0.19.4, SciPy <1.10.1, Pillow <11, and openslide-python 1.3.1. Keep this stack isolated from modern scientific environments. Windows is not supported by this Histolab release.

Install [native OpenSlide](https://openslide.org/download/) for your system, then create a dedicated environment (Python 3.10 was tested):

uv venv --python 3.10 .venv-histolab
uv pip install --python .venv-histolab/bin/python 'histolab==0.7.0' pooch matplotlib
.venv-histolab/bin/python -c 'import openslide; print(openslide.__library_version__)'

On macOS with Homebrew, `brew install openslide` installs the native library. If the older Python binding cannot find it, launch Python with the library path set immediately before Python starts:

env DYLD_FALLBACK_LIBRARY_PATH="$(brew --prefix openslide)/lib" .venv-histolab/bin/python -c 'import openslide; print(openslide.__library_version__)'

`pooch` is optional for remote examples. Start with a local slide or the tiny bundled `cmu_small_region` sample; other sample functions may download hundreds of megabytes. Exact `mpp` extraction also needs `large-image` and a matching source plugin; see [slide management](references/slide_management.md).

Workflow

1. Inspect `slide.dimensions`, `slide.levels` (a list), and `slide.level_dimensions(level)` (a method). Check both MPP axes in metadata. 2. Select physical field of view and pixel resolution; level numbers are not interchangeable across scanners. Preserve level-0 coordinate bounds. 3. Choose `TissueMask` for all tissue sections or `BiggestTissueBoxMask` for the largest section's bounding box. Inspect the mask at its actual resolution. 4. Configure a tiler and preview with the **same mask** passed to extraction. Preview methods return a Pillow image; save or display that return value. 5. Extract into a distinct per-slide/per-strategy directory. Count saved files, inspect representative tiles, and retain parameters, source IDs and QC flags. 6. Split datasets by patient before training/validation/test tile assignment. Fit stain normalization targets on training data only and validate on held-out scanners. A seed reproduces sampling; it does not prevent patient leakage.

Quick start

Illustrative for a user-provided slide; the same API path is tested with small local fixtures. `n_tiles` is an upper bound, not a promise of 100 valid tiles.

from pathlib import Path
from histolab.slide import Slide
from histolab.masks import TissueMask
from histolab.tiler import RandomTiler

output = Path("output/random_tiles")
output.mkdir(parents=True, exist_ok=True)
slide = Slide("slide.svs", processed_path=output)
mask = TissueMask()
slide.locate_mask(mask).save(output / "mask_preview.png")

tiler = RandomTiler(
    tile_size=(512, 512), n_tiles=100, level=0, seed=42,
    check_tissue=True, tissue_percent=80.0, prefix="random_",
)
tiler.locate_tiles(slide, extraction_mask=mask).save(output / "tile_preview.png")
tiler.extract(slide, extraction_mask=mask)
print("[OK] Saved tiles:", len(list(output.glob("random_tile_*.png"))))

`extraction_mask` belongs to `extract()` and `locate_tiles()`, not to the tiler constructor. `locate_tiles()` has no `n_tiles` argument. Previewing runs tile selection again, so it may be expensive; use a separate small tiler for initial exploration, then preview the final configuration before committing a large run.

Choose a strategy

| Tiler | Selection | Important limitation | | --- | --- | --- | | `RandomTiler` | Seeded sampling, at most `n_tiles`, up to `max_iter` attempts | May overlap, repeat, or miss rare structures | | `GridTiler` | Grid within the extraction mask | Boundary tiles and tissue checks can leave gaps | | `ScoreTiler` | Scores all eligible grid candidates; saves top `n_tiles` | Lower output count does not avoid scoring all candidates |

For grids, stride in each axis is tile size minus `pixel_overlap`; positive values must be smaller than both tile dimensions. Negative overlap leaves gaps. `ScoreTiler(n_tiles=0)` saves all eligible ranked tiles.

Nuclei and cellularity scores estimate stain-derived area fractions. They are not calibrated tumor probabilities or blur/focus scores. Score reports contain exactly `filename,score,scaled_score`; record coordinate bounds and physical resolution separately. Equal raw scores can make `scaled_score` undefined in 0.7.0, so inspect raw scores and finiteness before plotting or comparing them.

Troubleshooting and scientific checks

  • **No/few tiles:** inspect mask and output counts, dimensions, level, and

`max_iter`. Lowering `tissue_percent` relaxes QC; validate the added tiles.

  • **Missing sections:** the default biggest-region box excludes other sections.

Pass

Read more
@k-dense-ai
Ships withscientific-agent-skills

๐Ÿ”” Claude Scientific Skills is now Scientific Agent Skills. Same skills, broader compatibility โ€” now works with any AI agent that supports the open Agent Skills standard, not just Claude.

Stars on GitHub

Momentum

stars in total
55.6k
Star history of K-Dense-AI/scientific-agent-skills on GitHub, a chart by star-history.com

Other skills on scientific-agent-skills.

aeon

aeon

This skill should be used for time series machine learning tasks including classification, regression, clustering, forecasting,โ€ฆ

More skills from other plugins.

paddleocr-doc-parsing

paddleocr-doc-parsing

Use this skill to extract structured Markdown/JSON from PDFs and document imagesโ€”tables with cell-level precision, formulas asโ€ฆ

@paddlepaddle@paddlepaddleInstall Skill
context-loader
Auto-invoked

context-loader

Search memories from earlier Pi sessions in this repository. Use it when earlier work may already explain the code, error,โ€ฆ

mem04d69k
@mem0ai@mem0aiInstall Skill
analyzing-ai-citations

analyzing-ai-citations

Answer AI citation and answer engine optimization (AEO) questions in PostHog: whether AI answer engines (ChatGPT, Claude, and anโ€ฆ

posthog10d41k
@posthog@posthogInstall Skill
qmd

qmd

Search local markdown knowledge bases, notes, docs, and wikis with QMD. Use when users ask to find notes, retrieve documents,โ€ฆ

qmd3w31k
@tobi@tobiInstall Skill

Questions about histolab.

Which coding agents can use histolab?
histolab installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.