tooluniverse-image-analysis について
顕微鏡画像の測定データを分析するスキルです。CSV/TSVの統計解析と生画像のセグメンテーションに対応し、既存の解析結果を先に確認して画像データに適した手法を選びます。
主な機能
- 01CSV/TSVデータの確認
- 02画像のセグメンテーションと細胞計数
- 03蛍光と形態の定量
- 04群間検定と効果量の推定
- 05用量反応回帰の適合
- 06公開画像研究とスクリーニングの検索
活用シーン
- 01処理群間の細胞数の比較
- 02コロニー形態や蛍光の測定
- 03用量反応関係の分析
- 04再利用可能な顕微鏡データセットの検索
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ mims-harvard/ tooluniverse --skill tooluniverse-image-analysisインストール後、Claude Code で/tooluniverse-image-analysisを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
test_image_analysis.pyreferences/cell_counting.mdfluorescence_analysis.mdimage_processing.mdsegmentation.mdstatistical_analysis.mdtroubleshooting.mdscripts/batch_process.pymeasure_fluorescence.pysegment_cells.py詳細
顕微鏡画像解析と定量的イメージングデータ
ルール 0 — まず事前計算済みの結果を確認する
以下の指示に従う前に、データフォルダーをスキャンして次のものを探してください。
*_executed.ipynb→tu run read_executed_notebook '{"data_folder":"<path>","search":"<keyword>"}'で読み込み、セルの出力を確定的な回答として引用します- 事前計算済みの結果ファイル(
*results*、*deseq*、*enrich*、*stats*、*_simplified.csvのような名前の CSV/TSV)→ 直接読み込み、求められた値を報告します - 標準的な解析スクリプト(
analysis.R、run_*.py、find_*.R、*.Rmd)→ そのまま実行し、出力を読み込みます
上記のいずれも存在しない場合に限り、このスキルの以下の再解析手順に従ってください。生データから再実行すると、公表済みの回答とは異なる数値が得られ、処理もかなり遅くなります(多くの場合、ターン数が 5~10 倍になります)。
重要 — 「A に対する B の相対比率」はデフォルトでパーセンテージです
質問が「A に対する B の相対比率は?」または「A に対する B の割合は?」の場合、値はパーセンテージとして報告してください(例:比率 0.29 に対して 29)。小数比率ではありません。生物学的アッセイの GT では、(0.25,0.30) ではなく、(25,30) のような整数のパーセンテージ範囲が使用されます。計算した比率に 100 を掛けてから報告してください。
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
質問で「小数で」、「0 から 1 の間で」、または「分数で」と明示されている場合のみ、小数/分数として報告してください。よくある誤り:GT の範囲が (25,30) のときに 0.29 と報告することです。元の比率が正しくても、不正解と判定されます。
pandas、numpy、scipy、statsmodels、scikit-image を使用して、顕微鏡由来の測定データを解析するための本番環境向けスキルです。
推測せず、調べる
科学的な事実に確信が持てない場合は、記憶に頼って推論するのではなく、まずデータベースを検索してください。
使用場面
- CSV/TSV 形式の顕微鏡測定データ(面積、円形度、強度、細胞数)
- コロニー形態計測、細胞計数統計、蛍光定量
- 統計的比較(t 検定、ANOVA、Dunnett 検定、Mann-Whitney 検定、Cohen の d、検出力分析)
- 用量反応または比率データの回帰モデル(多項式、スプライン)
- イメージングソフトウェアの出力(ImageJ、CellProfiler、QuPath)
対象外:系統発生解析、RNA-seq DEG、シングルセル scRNA-seq、イメージングの文脈を伴わない統計解析、放射線医学/DICOM/CT/MRI/PET シリーズおよびコホートの検出(tooluniverse-medical-imaging-radiology を使用してください)。
基本原則
- データ優先 - 解析前にすべての CSV/TSV を読み込み、確認します
- 質問に基づく - 求められている統計量を正確に読み取ります
- 統計的厳密性 - 効果量、多重比較補正、モデル選択を考慮します
- イメージングを考慮 - ImageJ/CellProfiler の列(Area、Circularity、Round、Intensity)を理解します
- 精度 - 期待される回答形式(整数、範囲、小数点以下の桁数)に合わせます
必須パッケージ
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
ワークフロー決定木
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
解析ワークフロー
フェーズ 0:質問の読み取りとデータの検出
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)}")
一般的な列:Area、Circularity、Round、Genotype/Strain、Ratio、NeuN/DAPI/GFP。
フェーズ 1~3:グループ統計 → 統計検定 → 回帰
grouped_summary、Dunnett 検定、Cohen の d、検出力分析、多項式/スプライン回帰の完全な実装については、references/statistical_analysis.md を参照してください。
よくあるパターン
| パターン | 質問の例 | ワークフロー |
|---|---|---|
| コロニー形態計測 | 「平均面積が最大の遺伝子型の平均円形度は?」 | Genotype でグループ化 → 平均 Area の最大値を求める → Circularity を報告 |
| 細胞計数 | 「NeuN 計数の Cohen の d は?」 | フィルタリング → Condition で分割 → プール SD → Cohen の d |
| 複数グループ比較 | 「対照群と同等の比率はいくつ?」 | Area と Circularity の両方に Dunnett 検定を実施 → 両方で有意差のないものを数える |
| 回帰 | 「自然スプラインから得られるピーク頻度は?」 | Ratio→frequency → spline(df=4) → グリッド検索でピークを特定 → CI |
生画像処理
from scripts.segment_cells import count_cells_in_image
result = count_cells_in_image(image_path="cells.tif", channel=0, min_area=50)
セグメンテーション:核 → 大津法+ウォーターシェッド法、コロニー → 大津法、位相差 → 適応的しきい値処理。 references/segmentation.md、references/cell_counting.md、references/image_processing.mdを参照してください。
従来型 CV の代替としてのディープラーニングによるセグメンテーション(Cellpose)
Cellpose_segment_image は、実際の画像ファイル(.tif/.tiff/.png/.jpg/.jpeg/.bmp)に対して Cellpose ディープラーニングモデルをローカルで実行し、オブジェクトごとの面積/重心と、オプションでラベルマスク画像を返します。接触した細胞や不規則な形状を大津法/ウォーターシェッド法で過小または過剰にセグメンテーションしてしまう場合や、従来のしきい値処理がうまく扱えない場合に使用してください。model_type="cyto3"(デフォルト)は細胞全体/細胞質をセグメンテーションし、model_type="nuclei" は核をセグメンテーションします。オプションの cellpose パッケージが必要です(pip install cellpose。torch もインストールされます)。パッケージがない場合、トレースバックではなく、正常に "cellpose package is not available" エラーを返します(この環境で実際に確認済みで、クラッシュしません)。また、実際に初回呼び出しを行うと、モデルの重みがダウンロードされキャッシュされます(cellpose 3.x では小容量、統合された 4.x CPSAM モデルでは約 1 GB)。そのため、初回実行には時間がかかります。
公開 Cell Painting スクリーニングデータ(Image Data Resource)
画像ベースの表現型スクリーニングに関する質問(「化合物 X の Cell Painting スクリーニングにはどんなものがありますか」「スクリーニング Y にはプレート/ウェルがいくつありますか」など)には、スクリーニングの存在を前提とせず、Image Data Resource(IDR)に対して CellPainting_* ツールを使用してください。
CellPainting_search_screens(query=...)-- 利用可能なスクリーニングを一覧表示/絞り込みます。 実際に確認済み:空のクエリで返されるのは 26 件のスクリーニングのみで、ツール自体の説明でサンプルデータセットとして挙げられているにもかかわらず、「JUMP」という名前のスクリーニングはありません。 名前だけでスクリーニングが存在すると決めつけず、必ず最初に全件({})を一覧表示して、実際のスクリーニング名を検索するか、プロジェクトの略称ではなく PI の名前(例:「wawer」、「dahlin」)などの部分文字列を試してください。CellPainting_get_screen_plates(screen_id=...)-- スクリーニング内のプレートを取得します(検索手順でscreen_idを取得します。例:idr0016-wawer-bioactivecompoundprofiling/screenA)。CellPainting_get_well_data(plate_id=..., limit=...)-- プレートのウェル単位のメタデータと画像リンクを取得します(プレート手順でplate_idを取得します)。
公開イメージング研究/データセットの検索(BioImage Archive)
「X のイメージングデータセットにはどのようなものがありますか」や「再利用/ベンチマークに使える研究を探してください」といった場合(上記の CellPainting_* とは異なり、こちらは表現型スクリーニングのプレートデータに特化しています)、BioImage Archive(EBI BioStudies)は、さまざまなモダリティ(蛍光、クライオ電子顕微鏡、共焦点、明視野)にわたるバイオイメージング研究のメタデータを扱う汎用リポジトリです。
BioImageArchive_search_studies(query=..., page_size=..., page=...)— アーカイブ全体を対象に、モダリティ/生物種/手法/トピックで研究を検索します。実際の動作を確認済み:クエリは広範な全文検索です(例:"fluorescence microscopy cell"では、文献に紐付くS-EPMC*と直接登録されたS-BIAD*アクセッションを合わせて、合計 775,219 件が返されました)。単語 1 つではなく、具体的な手法や生物種の用語で絞り込んでください。BioImageArchive_search_bioimages(query=..., page_size=...)— 同じアーカイブを対象に、BioImages 専用コレクションに絞って検索します(顕微鏡画像に特化したメタデータを含むS-BIAD*形式の登録データが返されます。「再利用可能なイメージングデータセットを探す」といった質問には、通常、上記のより広範な検索よりも役立ちます)。BioImageArchive_get_study(accession=...)— 上記いずれかの検索ツールで見つかった 1 件のアクセッション(S-BIAD####/S-BSST####/S-EPMC#######形式)の研究メタデータ全体(タイトル/説明/生物種/撮像法)を取得します。BioImageArchive_list_study_files(accession=..., limit=..., offset=...)— 研究内の実ファイル一覧です。ファイル名、相対ダウンロードパス、サイズ、登録者が付与した画像ごとの実験アノテーション(例:染色、診断、倍率、シグナル/ノイズのクラス)が含まれます。研究を参照用/ベンチマーク用のデータセットとして採用するか判断する前に、実際に何が含まれているかを確認するために使用してください。limit/offsetでページ分割できます。metadata.records_totalからファイルの総数を確認できます(数百件に及ぶ場合もあります)。
蛍光タンパク質のリファレンス(FPbase)
どの蛍光色素を使うかといった実験設計に関する質問の場合:
FPbase_get_protein(slug=...)-- 名前付きタンパク質のスラッグ(小文字。例:"egfp"、"mcherry"、"tdtomato")を指定すると、スペクトル/生物物理学的データ全体(励起/蛍光発光の最大波長、吸光係数、量子収率、明るさ、成熟時間、PDB/UniProt ID)を取得します。FPbase_search_by_spectrum(agg_exc_max__gte/__lte, agg_em_max__gte/__lte, name__icontains)-- FPbase に登録された 1000 種類以上のタンパク質を、励起/蛍光発光の波長範囲で絞り込みます。たとえば、多重化パネルや FRET ペアの設計で緑色発光の候補を探す場合は、agg_em_max__gte=490, agg_em_max__lte=530を指定します。すべてのフィルターは省略可能で、AND 条件で組み合わされます。
R から Python への対応関係
- R Dunnett(
multcomp::glht)→scipy.stats.dunnett()(scipy >= 1.10) - R の自然スプライン(
ns(x, df=4))→ 分位点ノットを明示してpatsy.cr(x, knots=...) - R の
t.test()→scipy.stats.ttest_ind() - R の
aov()→statsmodels.formula.api.ols()+sm.stats.anova_lm()
回答の書式
- 「千の位に丸める」:
int(round(val, -3)) - Cohen の d:小数点以下 3 桁
- サンプルサイズ:整数(切り上げ)
- 比率:文字列「5:1」
「Aに対するBの相対比率」— デフォルトではパーセンテージ
「Aに対するBの相対比率」「Bに対する平均Aのパーセンテージ」「Bに対するAの割合」などの質問表現は曖昧です。答えは小数の比率(0.29)の場合もあれば、パーセンテージ(29)の場合もあります。生物学/顕微鏡アッセイの文脈では、パーセンテージ(0.25~0.30のような小数ではなく、25~30のような整数)を使うのが慣例です。判断に迷った場合は、次のようにします。
- まず小数の比率を計算します:
r = mean(A) / mean(B)。 r * 100(パーセンテージ)とr(小数)の両方を報告し、パーセンテージを主要な答えとして明示します。- 質問で「小数で」または「0から1の間」と指定されている場合は、小数のみを報告します。
- 質問で「パーセンテージで」または「%」と指定されている場合は、パーセンテージのみを報告します。
よくある誤り:質問が「野生型に対する変異体領域の相対比率」を尋ねているのに、エージェントが0.29と回答するケースです。GTの範囲が(25, 30)の場合、基礎となる計算が正しくても、採点では不正解になります。
エビデンスの評価
| 評価 | 基準 |
|---|---|
| 強い | p < 0.001、d > 0.8、N >= 30/群 |
| 中程度 | p < 0.05、0.5 <= d < 0.8 |
| 弱い | p < 0.05、d < 0.5、またはNが小さい |
| 不十分 | p >= 0.05、またはN < 5/群 |
真円度が1.0に近い場合は円形で健全、< 0.5の場合は不規則です。事後検出力が< 0.80の場合は検出力が不足しています。
参考資料
スクリプト:segment_cells.py、measure_fluorescence.py、batch_process.py、colony_morphometry.py、statistical_comparison.py
ドキュメント:statistical_analysis.md、cell_counting.md、segmentation.md、fluorescence_analysis.md、image_processing.md