Skip to main content
skill CX Codex

tooluniverse-image-analysis — Claude Code skill: what it does

Automates microscopy and quantitative imaging analysis from ImageJ or CellProfiler tables. Handles colony morphometry, Dunnett's tests, and dose-response curves.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add mims-harvard/ToolUniverse --skill tooluniverse-image-analysis -a claude-code
Open on GitHub

What tooluniverse-image-analysis does

The skill processes quantitative tables exported from ImageJ, CellProfiler, and QuPath, reading parameters such as area, circularity, roundness, and fluorescence intensity. It performs statistical tests using pandas, scipy, and statsmodels. Available routines include t-tests, Mann-Whitney tests, Dunnett's test for multi-group comparisons against controls, two-way ANOVA, Cohen's d effect sizes, and spline regression for dose-response curves.

Workflows prioritize pre-computed data over recalculation. It checks the target folder first for *_executed.ipynb notebooks, summary tables, or canonical scripts like analysis.R to report existing numbers directly. Rerunning raw data from scratch takes far more turns and frequently deviates from published assay results. In addition, relative proportions are multiplied by 100 to report biological percentages rather than decimals.

Image processing relies on Otsu thresholding and watershed algorithms for nuclei or colony segmentation. For overlapping cells, deep-learning segmentation is available via Cellpose, which requires pip install cellpose alongside torch and downloads roughly 1 GB of weights on its first run. Note that this skill is built for microscopy tables and is not suitable for radiology series or RNA-seq.

What it helps with

  • compute colony morphometry from CellProfiler or ImageJ tables
  • run Dunnett's tests against controls across multiple groups
  • fit spline regressions and polynomial models for dose-response assays
  • segment cell nuclei from raw microscopy images using Otsu or Cellpose

Example prompts for the agent

  • Calculate mean circularity for the genotype with the largest area in results.csv
  • Run Dunnett's test for Area and Circularity across all ratios against control
  • Segment cells in cells.tif on channel 0 with min_area=50

How to install tooluniverse-image-analysis

1Skills CLI (Vercel)

npx skills add mims-harvard/ToolUniverse --skill tooluniverse-image-analysis -a claude-code

2Manually: put the files in place

~/.claude/skills/tooluniverse-image-analysis/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/tooluniverse-image-analysis/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about tooluniverse-image-analysis

How to install tooluniverse-image-analysis in Claude Code?

Run npx skills add mims-harvard/ToolUniverse --skill tooluniverse-image-analysis -a claude-code.

What does tooluniverse-image-analysis do?

It analyzes microscopy tables and images, running statistical tests like ANOVA and Dunnett's, calculating effect sizes, and fitting dose-response curves.

What dependencies are required for deep-learning segmentation?

Tabular analyses rely on pandas, scipy, and statsmodels. For deep-learning segmentation via Cellpose, you must install cellpose and torch, which will download roughly 1 GB in model weights during the initial run.

Source text

SKILL.md · Apache-2.0
---
name: tooluniverse-image-analysis
description: Microscopy and quantitative imaging analysis — colony morphometry, fluorescence intensity quantification, cell-count statistics, dose-response curves, and ANOVA/Dunnett on image-derived measurements. Uses pandas/numpy/scipy/scikit-image. Use for analyzing tabular outputs from CellProfiler/ImageJ, image-derived measurement statistics, and image-based assay quantification.
disable-model-invocation: true
---

# Microscopy Image Analysis and Quantitative Imaging Data

## RULE ZERO — Check for pre-computed results FIRST

Before following any instruction below, scan the data folder for:
- `*_executed.ipynb` → read with `tu run read_executed_notebook '{"data_folder":"<path>","search":"<keyword>"}'` and cite its cell outputs as the authoritative answer
- Pre-computed result files (CSV/TSV with names like `*results*`, `*deseq*`, `*enrich*`, `*stats*`, `*_simplified.csv`) → read directly and report the requested value
- Canonical analysis scripts (`analysis.R`, `run_*.py`, `find_*.R`, `*.Rmd`) → execute as-is and read the output

Only follow this skill's re-analysis recipe below if **none** of the above exist. Re-running from raw data produces different numbers than the published answer and is much slower (often 5-10× turn count).

---

## CRITICAL — "Relative proportion of A to B" defaults to PERCENTAGE

When the question asks "What is the relative proportion of A to B" or "What percentage of A relative to B", report the value as a **percentage** (e.g., `29` for ratio 0.29), NOT a decimal ratio. Biology assay GTs use whole-number percentage ranges like `(25,30)`, not `(0.25,0.30)`. Multiply your computed ratio by 100 before reporting:

```python
ratio = mean_A / mean_B           # e.g., 0.29
percentage = ratio * 100          # e.g., 29
print(f"{percentage:.1f}%")       # "29.0%"  ← THIS is the answer
```

Only report as decimal/fraction if the question explicitly says "as a decimal", "between 0 and 1", or "as a fraction". Common error: reporting `0.29` when the GT range is `(25,30)` — graded as wrong even though the underlying ratio is correct.

---

Production-ready skill for analyzing microscopy-derived measurement data using pandas, numpy, scipy, statsmodels, and scikit-image.

## LOOK UP, DON'T GUESS
When uncertain about any scientific fact, SEARCH databases first rather than reasoning from memory.

---

## When to Use

- Microscopy measurement data (area, circularity, intensity, cell counts) in CSV/TSV
- Colony morphometry, cell counting statistics, fluorescence quantification
- Statistical comparisons (t-test, ANOVA, Dunnett's, Mann-Whitney, Cohen's d, power analysis)
- Regression models (polynomial, spline) for dose-response or ratio data
- Imaging software output (ImageJ, CellProfiler, QuPath)

**NOT for**: Phylogenetics, RNA-seq DEG, single-cell scRNA-seq, statistics without imaging context, radiology/DICOM/CT/MRI/PET series and cohort discovery (use `tooluniverse-medical-imaging-radiology`).

---

## Core Principles

1. **Data-first** - Load and inspect all CSV/TSV before analysis
2. **Question-driven** - Parse the exact statistic requested
3. **Statistical rigor** - Effect sizes, multiple comparison corrections, model selection
4. **Imaging-aware** - Understand ImageJ/CellProfiler columns (Area, Circularity, Round, Intensity)
5. **Precision** - Match expected answer format (integer, range, decimal places)

---

## Required Packages

```python
import pandas as pd, numpy as np
from scipy import stats
from scipy.interpolate import BSpline, make_interp_spline
import statsmodels.api as sm
from statsmodels.formula.api import ols
from statsmodels.stats.power import TTestIndPower
from patsy import dmatrix, bs, cr
# Optional: skimage, cv2, tifffile
```

---

## Workflow Decision Tree

```
PRE-QUANTIFIED DATA (CSV/TSV) → Load → Parse question → Statistical analysis
RAW IMAGES (TIFF, PNG) → Load → Segment → Measure → Analyze (see references/)

Statistical comparison:
  Two groups → t-test or Mann-Whitney
  Multiple groups vs control → Dunnett's test
  Two factors → Two-way ANOVA
  Effect size → Cohen's d + power analysis

Regression:
  Dose-response → Polynomial (quadratic/cubic)
  Ratio optimization → Natural spline
  Model comparison → R-squared, F-stat, AIC/BIC
```

---

## Analysis Workflow

### Phase 0: Question Parsing and Data Discovery

```python
import os, glob, pandas as pd
csv_files = glob.glob(os.path.join(".", '**', '*.csv'), recursive=True)
df = pd.read_csv(csv_files[0])
print(f"Shape: {df.shape}, Columns: {list(df.columns)}")
```

Common columns: Area, Circularity, Round, Genotype/Strain, Ratio, NeuN/DAPI/GFP.

### Phase 1-3: Grouped Stats → Statistical Testing → Regression

See **references/statistical_analysis.md** for complete implementations of grouped_summary, Dunnett's, Cohen's d, power analysis, polynomial/spline regression.

---

## Common Patterns

| Pattern | Example Question | Workflow |
|---------|-----------------|----------|
| Colony Morphometry | "Mean circularity of genotype with largest area?" | Group by Genotype → max mean Area → report Circularity |
| Cell Counting | "Cohen's d for NeuN counts?" | Filter → split by Condition → pooled SD → Cohen's d |
| Multi-Group Comparison | "How many ratios equivalent to control?" | Dunnett's for Area AND Circularity → count non-significant in BOTH |
| Regression | "Peak frequency from natural spline?" | Ratio→frequency → spline(df=4) → grid search peak → CI |

---

## Raw Image Processing

```python
from scripts.segment_cells import count_cells_in_image
result = count_cells_in_image(image_path="cells.tif", channel=0, min_area=50)
```

Segmentation: Nuclei → Otsu+watershed; Colonies → Otsu; Phase contrast → adaptive threshold.
See **references/segmentation.md**, **references/cell_counting.md**, **references/image_processing.md**.

### Deep-learning segmentation (Cellpose) as an alternative to classical CV

`Cellpose_segment_image` runs the Cellpose deep-learning model locally on a real
image file (`.tif`/`.tiff`/`.png`/`.jpg`/`.jpeg`/`.bmp`) and returns per-object
area/centroid plus an optional label-mask image -- reach for it when
Otsu/watershed under- or over-segments touching cells or irregular shapes that
classical thresholding handles poorly. `model_type="cyto3"` (default) segments
whole cells/cytoplasm; `model_type="nuclei"` segments nuclei. Requires the
optional `cellpose` package (`pip install cellpose`, pulls in `torch`) -- if
missing, the tool returns a clean `"cellpose package is not available"` error
(verified live in this environment, no crash) rather than a traceback; the
first real call also downloads and caches model weights (small for cellpose
3.x, ~1 GB for the unified 4.x CPSAM model), so expect a slow first run.

### Public Cell Painting screen data (Image Data Resource)

For image-based phenotypic screening questions ("what Cell Painting screens
exist for compound X", "how many plates/wells in screen Y"), use the
`CellPainting_*` tools against the Image Data Resource (IDR) rather than
assuming a screen exists:
- `CellPainting_search_screens(query=...)` -- list/filter available screens.
  **Verified live: an empty query returns only 26 screens, and none are named
  literally "JUMP"** despite the tool's own description citing JUMP-CP as an
  example dataset -- do not assume a screen exists by name; always list first
  (`{}`) and grep the real screen-name list, or try substrings like a PI name
  (e.g. "wawer", "dahlin") instead of a project acronym.
- `CellPainting_get_screen_plates(screen_id=...)` -- plates in a screen (get
  `screen_id` from the search step, e.g. `idr0016-wawer-bioactivecompoundprofiling/screenA`).
- `CellPainting_get_well_data(plate_id=..., limit=...)` -- well-level metadata
  and image links for a plate (get `plate_id` from the plates step).

### Public imaging study/dataset discovery (BioImage Archive)

For "what imaging datasets exist for X" or "find a study I can reuse/benchmark
against" (distinct from `CellPainting_*` above, which is specifically
phenotypic-screening plate data) — the BioImage Archive (EBI BioStudies) is a
general repository of bioimaging *study* metadata across modalities
(fluorescence, cryo-EM, confocal, brightfield):
- `BioImageArchive_search_studies(query=..., page_size=..., page=...)` —
  general study search across the whole archive by modality/organism/
  technique/topic. **Verified live: query is a broad free-text match** (e.g.
  `"fluorescence microscopy cell"` returned 775,219 total hits across
  literature-linked `S-EPMC*` and directly-submitted `S-BIAD*` accessions) —
  narrow with specific technique/organism terms rather than single words.
- `BioImageArchive_search_bioimages(query=..., page_size=...)` — same
  archive, scoped to the BioImages-specific collection (returns `S-BIAD*`-style
  submissions with microscopy-specific metadata, generally more useful than
  the broader search above for "find a reusable imaging dataset" questions).
- `BioImageArchive_get_study(accession=...)` — full study metadata
  (title/description/organism/imaging_method) for one accession
  (`S-BIAD####` / `S-BSST####` / `S-EPMC#######` format) found via either
  search tool above.
- `BioImageArchive_list_study_files(accession=..., limit=..., offset=...)` —
  the actual per-file manifest for a study: filename, relative download path,
  size, and any per-image experimental annotations the submitters attached
  (e.g. staining, diagnosis, magnification, signal/noise class) — use this to
  see what's actually in a study before deciding whether it's the right
  reference/benchmark dataset. Page with `limit`/`offset`;
  `metadata.records_total` gives the full file count (can be in the hundreds).

### Fluorescent protein reference (FPbase)

For experiment-design questions about which fluorophore to use:
- `FPbase_get_protein(slug=...)` -- full spectral/biophysical data (excitation/
  emission max, extinction coefficient, quantum yield, brightness, maturation
  time, PDB/UniProt IDs) for a named protein by its lowercase slug (e.g.
  `"egfp"`, `"mcherry"`, `"tdtomato"`).
- `FPbase_search_by_spectrum(agg_exc_max__gte/__lte, agg_em_max__gte/__lte, name__icontains)`
  -- filter FPbase's 1000+ proteins by excitation/emission wavelength range,
  e.g. to find green-emitting options (`agg_em_max__gte=490, agg_em_max__lte=530`)
  for a multiplexed panel or FRET pair design. All filters are optional and
  combine as AND.

---

## R-to-Python Equivalents

- R Dunnett (`multcomp::glht`) → `scipy.stats.dunnett()` (scipy >= 1.10)
- R natural spline (`ns(x, df=4)`) → `patsy.cr(x, knots=...)` with explicit quantile knots
- R `t.test()` → `scipy.stats.ttest_ind()`
- R `aov()` → `statsmodels.formula.api.ols()` + `sm.stats.anova_lm()`

## Answer Formatting

- "to the nearest thousand": `int(round(val, -3))`
- Cohen's d: 3 decimal places
- Sample sizes: integer (ceiling)
- Ratios: string "5:1"

### "Relative proportion of A to B" — default to PERCENTAGE

Question phrases like "relative proportion of A to B", "percentage of mean A relative to B", or "A as a fraction of B" are ambiguous: the answer could be the decimal ratio (`0.29`) or the percentage (`29`). In biology/microscopy assay contexts the convention is **percentage** (whole numbers like 25-30, not decimals like 0.25-0.30). When in doubt:

- Compute the decimal ratio first: `r = mean(A) / mean(B)`.
- Report BOTH `r * 100` (percentage) and `r` (decimal); flag the percentage as the primary answer.
- If the question specifies "as a decimal" or "between 0 and 1", report decimal only.
- If the question specifies "as a percentage" or "%", report percentage only.

Common error: question asks "relative proportion of mutant area to wildtype" and the agent reports `0.29` when the GT range is `(25, 30)`. The grader marks this wrong even though the underlying computation is correct.

---

## Evidence Grading

| Grade | Criteria |
|-------|----------|
| **Strong** | p < 0.001, d > 0.8, N >= 30/group |
| **Moderate** | p < 0.05, 0.5 <= d < 0.8 |
| **Weak** | p < 0.05, d < 0.5 or low N |
| **Insufficient** | p >= 0.05 or N < 5/group |

Circularity near 1.0 = round/healthy; < 0.5 = irregular. Post-hoc power < 0.80 = underpowered.

---

## References

Scripts: `segment_cells.py`, `measure_fluorescence.py`, `batch_process.py`, `colony_morphometry.py`, `statistical_comparison.py`
Docs: `statistical_analysis.md`, `cell_counting.md`, `segmentation.md`, `fluorescence_analysis.md`, `image_processing.md`

© mims-harvard · Apache-2.0 · mims-harvard/ToolUniverse

Similar skills

Everything for Science and research →

From the same set56

tooluniverse-sequence-retrieval Pulls DNA, RNA and protein sequences from NCBI and ENA by accession or gene symbol. Useful when you want a curated RefSeq record rather than a raw submission. CX Codex +1 1,700installs tooluniverse-literature-deep-research A skill for deep literature search across PubMed, EuropePMC and bioRxiv, with citation networks and evidence grading. Useful when you need a review with citations. CX Codex +1 664installs tooluniverse-clinical-guidelines A skill that pulls clinical practice guidelines from NICE, WHO, NCCN, AHA, ADA and more, then ranks them by source authority. CX Codex +1 491installs tooluniverse Routes biomedical research queries to specialized skills and extracts authoritative cell outputs from executed notebooks. CX Codex +1 479installs tooluniverse-drug-research Builds a sourced research report on a drug, covering its targets, clinical status, safety, and other profile data. Useful when investigating a compound across multiple databases. CX Codex +1 472installs tooluniverse-clinical-trial-design The skill scores a clinical trial design across six dimensions and returns a feasibility report with enrollment projections. CX Codex +1 456installs tooluniverse-drug-drug-interaction Works through drug-drug interactions: mechanism, severity, a 0–100 risk score and what to do about the prescription. Built for polypharmacy reviews. CX Codex +1 452installs tooluniverse-disease-research Builds a cited disease report covering genetics, pathways, drugs and clinical trials. Handy for rare-disease profiles where memory is not enough. CX Codex +1 437installs

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor