[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6XF4MHKYRFNGHG3AXVR641T":3,"skill-same:01M6XF4MHKYRFNGHG3AXVR641T":91},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":23,"publishedAt":41,"linkOnly":42,"markdownContent":43,"markdownBody":44,"frontMatter":45,"refName":49,"commitSha":50,"skillDirectory":51,"forksCount":14,"repositoryHtmlUrl":52,"repositoryHomepageUrl":6,"ownerHtmlUrl":53,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":54,"install":55,"resources":68},"01M6XF4MHKYRFNGHG3AXVR641T","bioimage-analysis",null,"Microscopy image analysis for cell biology. Cell segmentation (Cellpose, watershed), object tracking (trackpy), morphology quantification, colony counting, colocalization analysis, and cytoskeleton characterization. For pathology WSI use pathml; for flow cytometry use flow-cytometry-analysis.","fadrienne\u002FMyGitHub","fadrienne","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F197874571?v=4","01M6X64V8VWCRSMFZ4EPS2BWXG","Francesca Adrienne","01M6X64VD5MW4F9PHDWQKS7ZAF",0,"MIT","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002FSKILL.md",[18],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",[24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40],"bioimage analysis","analysis","cell","pathology","for","object","biology","image analysis","counting","quantification","image","cell biology","use","tracking","pathml","segmentation","flow","2026-11-10 10:12:30",false,"---\nname: bioimage-analysis\ndescription: Microscopy image analysis for cell biology. Cell segmentation (Cellpose, watershed), object tracking (trackpy), morphology quantification, colony counting, colocalization analysis, and cytoskeleton characterization. For pathology WSI use pathml; for flow cytometry use flow-cytometry-analysis.\ncategory: biology\nlicense: MIT license\nmetadata:\n    skill-author: InkVell Inc.\n---\n\n# Bioimage Analysis: Microscopy Image Analysis for Cell Biology\n\n## Overview\n\nBioimage Analysis provides computational tools for processing and quantifying microscopy images in cell biology research. From cell segmentation using deep learning (Cellpose) and classical methods (watershed, Otsu thresholding) to object tracking across time-lapse sequences, morphology quantification, colony counting, colocalization analysis, and cytoskeleton characterization. This skill covers the full pipeline from raw microscopy images to quantitative measurements suitable for statistical analysis.\n\n## When to Use This Skill\n\n- Segmenting cells or nuclei from brightfield or fluorescence microscopy images\n- Tracking cell migration or particle movement in time-lapse sequences\n- Quantifying cell morphology (area, eccentricity, circularity, aspect ratio)\n- Counting bacterial or mammalian cell colonies on plates\n- Analyzing colocalization of proteins from multi-channel fluorescence images\n- Characterizing cytoskeleton fiber orientation and alignment\n- Quantifying mitochondrial morphology from JC-1 or TMRM staining\n- Batch processing multiple fields of view or multi-well plate images\n- Preprocessing microscopy images (denoising, background subtraction, contrast enhancement)\n\n**Related Skills:** For whole-slide pathology image analysis use `pathml` or `histolab`. For flow cytometry data use `flow-cytometry-analysis`. For clinical imaging (MRI, CT) use `clinical-imaging`.\n\n## Installation\n\n```bash\nuv pip install cellpose scikit-image opencv-python trackpy tifffile aicsimageio numpy pandas matplotlib\n```\n\n## Quick Start\n\n```python\nfrom cellpose import models\nimport skimage.io\nimport skimage.measure\nimport numpy as np\n\n# Load image\nimage = skimage.io.imread('cells.tif')\n\n# Segment with Cellpose\nmodel = models.Cellpose(model_type='cyto2')\nmasks, flows, styles, diams = model.eval(image, diameter=None, channels=[0, 0])\n\n# Measure properties\nprops = skimage.measure.regionprops_table(masks, image,\n    properties=['label', 'area', 'eccentricity', 'mean_intensity'])\n\nimport pandas as pd\ndf = pd.DataFrame(props)\nprint(f\"Detected {len(df)} cells\")\nprint(df.describe())\n```\n\n## Core Capabilities\n\n### 1. Image Loading & Preprocessing\n\nLoad microscopy images from common formats and prepare them for analysis.\n\n```python\nimport tifffile\nimport skimage.io\nimport skimage.filters\nimport skimage.exposure\nimport numpy as np\n\n# Load multi-channel TIFF\nimage = tifffile.imread('experiment.tif')\nprint(f\"Shape: {image.shape}, dtype: {image.dtype}\")\n\n# For multi-dimensional images (TCZYX)\nfrom aicsimageio import AICSImage\nimg = AICSImage('multi_dim.czi')\ndata = img.get_image_data(\"ZYX\", C=0, T=0)\n\n# Contrast enhancement (CLAHE)\nenhanced = skimage.exposure.equalize_adapthist(image, clip_limit=0.03)\n\n# Gaussian denoising\ndenoised = skimage.filters.gaussian(image, sigma=1.0)\n\n# Background subtraction (rolling ball approximation)\nfrom skimage.morphology import white_tophat, disk\nbackground_removed = white_tophat(image, disk(50))\n\n# Median filter for salt-and-pepper noise\nfrom skimage.filters import median\nfrom skimage.morphology import square\ncleaned = median(image, square(3))\n```\n\n### 2. Cell Segmentation\n\nSegment individual cells using deep learning or classical approaches.\n\n**Cellpose (deep learning):**\n\n```python\nfrom cellpose import models\n\n# Cytoplasm segmentation\nmodel = models.Cellpose(model_type='cyto2')\nmasks, flows, styles, diams = model.eval(\n    image,\n    diameter=None,       # Auto-detect cell diameter\n    channels=[0, 0],     # Grayscale; [2,3] for green cytoplasm + blue nuclei\n    flow_threshold=0.4,\n    cellprob_threshold=0.0\n)\n\n# Nuclei-only segmentation\nnuc_model = models.Cellpose(model_type='nuclei')\nnuc_masks, _, _, _ = nuc_model.eval(image, diameter=None, channels=[0, 0])\n\nprint(f\"Segmented {masks.max()} cells\")\n```\n\n**Classical watershed:**\n\n```python\nimport skimage.segmentation\nimport skimage.feature\nimport skimage.filters\nimport skimage.morphology\nfrom scipy import ndimage\n\n# Threshold\nthresh = skimage.filters.threshold_otsu(image)\nbinary = image > thresh\n\n# Distance transform for watershed seeds\ndistance = ndimage.distance_transform_edt(binary)\nlocal_max = skimage.feature.peak_local_max(distance, min_distance=20, labels=binary)\nmarkers = np.zeros_like(image, dtype=int)\nfor i, (r, c) in enumerate(local_max, start=1):\n    markers[r, c] = i\nmarkers = ndimage.label(markers)[0]\n\n# Watershed\nlabels = skimage.segmentation.watershed(-distance, markers, mask=binary)\nprint(f\"Segmented {labels.max()} objects\")\n```\n\n**Adaptive thresholding:**\n\n```python\n# For uneven illumination\nblock_size = 51\nadaptive_thresh = skimage.filters.threshold_local(image, block_size, offset=10)\nbinary = image > adaptive_thresh\n\n# Connected component labeling\nfrom skimage.measure import label\nlabeled = label(binary)\nprint(f\"Found {labeled.max()} connected components\")\n```\n\n### 3. Object Tracking\n\nTrack cells or particles across time-lapse frames.\n\n```python\nimport trackpy as tp\nimport pandas as pd\n\n# Load time-lapse as 3D array (T, Y, X)\nframes = tifffile.imread('timelapse.tif')\n\n# Locate features in each frame\nall_features = []\nfor t, frame in enumerate(frames):\n    features = tp.locate(frame, diameter=11, minmass=1000)\n    features['frame'] = t\n    all_features.append(features)\n\nfeatures_df = pd.concat(all_features, ignore_index=True)\n\n# Link particles across frames\ntrajectories = tp.link(features_df, search_range=15, memory=3)\n\n# Filter spurious tracks (require minimum length)\ntrajectories = tp.filter_stubs(trajectories, threshold=10)\nprint(f\"Tracked {trajectories['particle'].nunique()} objects over {len(frames)} frames\")\n\n# Calculate mean squared displacement\nmsd = tp.emsd(trajectories, mpp=0.65, fps=1)  # microns per pixel, frames per second\nprint(msd.head())\n```\n\n### 4. Morphology Quantification\n\nExtract shape and intensity measurements from segmented objects.\n\n```python\nimport skimage.measure\nimport pandas as pd\n\n# Measure region properties\nprops = skimage.measure.regionprops_table(masks, intensity_image=image,\n    properties=[\n        'label', 'area', 'perimeter', 'eccentricity', 'solidity',\n        'major_axis_length', 'minor_axis_length', 'mean_intensity',\n        'max_intensity', 'min_intensity', 'centroid'\n    ])\n\ndf = pd.DataFrame(props)\n\n# Calculate derived metrics\ndf['circularity'] = 4 * np.pi * df['area'] \u002F (df['perimeter'] ** 2)\ndf['aspect_ratio'] = df['major_axis_length'] \u002F df['minor_axis_length']\n\nprint(f\"Measured {len(df)} objects\")\nprint(df[['area', 'eccentricity', 'circularity', 'mean_intensity']].describe())\n```\n\n### 5. Colony Counting\n\nCount colonies from plate images.\n\n```python\nimport skimage.io\nimport skimage.filters\nimport skimage.segmentation\nimport skimage.measure\nfrom scipy import ndimage\n\n# Load plate image\nplate = skimage.io.imread('agar_plate.jpg', as_gray=True)\n\n# Preprocessing\nsmoothed = skimage.filters.gaussian(plate, sigma=2)\n\n# Threshold\nthresh = skimage.filters.threshold_otsu(smoothed)\nbinary = smoothed \u003C thresh  # Colonies are darker\n\n# Remove small noise\nfrom skimage.morphology import remove_small_objects\ncleaned = remove_small_objects(binary, min_size=50)\n\n# Separate touching colonies with watershed\ndistance = ndimage.distance_transform_edt(cleaned)\nlocal_max = skimage.feature.peak_local_max(distance, min_distance=10, labels=cleaned)\nmarkers = np.zeros_like(plate, dtype=int)\nfor i, (r, c) in enumerate(local_max, start=1):\n    markers[r, c] = i\nmarkers = ndimage.label(markers)[0]\nseparated = skimage.segmentation.watershed(-distance, markers, mask=cleaned)\n\n# Count and measure\nregions = skimage.measure.regionprops(separated)\ncolony_count = len(regions)\nareas = [r.area for r in regions]\nprint(f\"Colony count: {colony_count}\")\nprint(f\"Mean colony area: {np.mean(areas):.1f} px^2\")\n```\n\n### 6. Colocalization Analysis\n\nQuantify spatial overlap between fluorescence channels.\n\n```python\nimport numpy as np\nfrom scipy.stats import pearsonr\n\n# Load dual-channel image\nch1 = skimage.io.imread('green_channel.tif').astype(float)\nch2 = skimage.io.imread('red_channel.tif').astype(float)\n\n# Mask background (Costes automatic thresholding approximation)\nmask = (ch1 > skimage.filters.threshold_otsu(ch1)) | \\\n       (ch2 > skimage.filters.threshold_otsu(ch2))\n\nch1_masked = ch1[mask]\nch2_masked = ch2[mask]\n\n# Pearson correlation coefficient\npcc, pval = pearsonr(ch1_masked, ch2_masked)\nprint(f\"Pearson correlation: {pcc:.4f} (p={pval:.2e})\")\n\n# Manders overlap coefficients\nch1_coloc = ch1_masked[ch2_masked > 0]\nch2_coloc = ch2_masked[ch1_masked > 0]\nM1 = ch1_coloc.sum() \u002F ch1_masked.sum()  # Fraction of ch1 overlapping with ch2\nM2 = ch2_coloc.sum() \u002F ch2_masked.sum()  # Fraction of ch2 overlapping with ch1\nprint(f\"Manders M1: {M1:.4f}, M2: {M2:.4f}\")\n```\n\n### 7. Cytoskeleton & Fiber Analysis\n\nCharacterize fiber orientation and alignment.\n\n```python\nimport skimage.feature\nimport skimage.transform\nimport numpy as np\n\n# Edge detection\nedges = skimage.feature.canny(image, sigma=2)\n\n# Hough line transform for fiber orientation\ntested_angles = np.linspace(-np.pi \u002F 2, np.pi \u002F 2, 180, endpoint=False)\nh, theta, d = skimage.transform.hough_line(edges, theta=tested_angles)\n\n# Extract peaks (dominant orientations)\npeaks = skimage.transform.hough_line_peaks(h, theta, d, num_peaks=50)\n\n# Orientation distribution\nangles_deg = np.degrees(peaks[1])\nmean_angle = np.mean(angles_deg)\nstd_angle = np.std(angles_deg)\n\n# Order parameter S = 2 * \u003Ccos^2(theta)> - 1 (1=aligned, 0=random)\ncos2 = np.cos(2 * np.radians(angles_deg))\norder_parameter = np.mean(cos2)\nprint(f\"Mean orientation: {mean_angle:.1f} +\u002F- {std_angle:.1f} degrees\")\nprint(f\"Order parameter S: {order_parameter:.3f}\")\n```\n\n### 8. Mitochondrial Morphology\n\nAnalyze mitochondrial shape and membrane potential.\n\n```python\nimport skimage.measure\nimport numpy as np\n\n# JC-1 staining: red=healthy (aggregate), green=depolarized (monomer)\nred_channel = skimage.io.imread('jc1_red.tif').astype(float)\ngreen_channel = skimage.io.imread('jc1_green.tif').astype(float)\n\n# Membrane potential ratio\nratio = red_channel \u002F (green_channel + 1e-6)  # Avoid division by zero\nmean_ratio = np.mean(ratio[ratio > 0])\nprint(f\"Mean red\u002Fgreen ratio: {mean_ratio:.3f}\")\n\n# Segment mitochondria from green channel\nthresh = skimage.filters.threshold_otsu(green_channel)\nmito_mask = green_channel > thresh\nmito_labels = skimage.measure.label(mito_mask)\n\n# Morphology metrics\nprops = skimage.measure.regionprops_table(mito_labels,\n    properties=['label', 'area', 'major_axis_length', 'minor_axis_length',\n                'eccentricity', 'euler_number'])\ndf = pd.DataFrame(props)\ndf['aspect_ratio'] = df['major_axis_length'] \u002F (df['minor_axis_length'] + 1e-6)\n\n# Classify: round (AR\u003C2), intermediate (2-4), elongated (>4)\ndf['morphology'] = pd.cut(df['aspect_ratio'], bins=[0, 2, 4, np.inf],\n                          labels=['round', 'intermediate', 'elongated'])\nprint(df['morphology'].value_counts())\n```\n\n### 9. Batch Processing\n\nProcess multiple fields of view or wells.\n\n```python\nfrom pathlib import Path\nimport pandas as pd\n\nimage_dir = Path('plate_images\u002F')\nall_results = []\n\nfor img_path in sorted(image_dir.glob('*.tif')):\n    image = skimage.io.imread(str(img_path))\n\n    # Segment\n    model = models.Cellpose(model_type='cyto2')\n    masks, _, _, _ = model.eval(image, diameter=None, channels=[0, 0])\n\n    # Measure\n    props = skimage.measure.regionprops_table(masks, image,\n        properties=['label', 'area', 'eccentricity', 'mean_intensity'])\n    df = pd.DataFrame(props)\n    df['image'] = img_path.stem\n\n    all_results.append(df)\n\nresults = pd.concat(all_results, ignore_index=True)\nsummary = results.groupby('image').agg(\n    cell_count=('label', 'count'),\n    mean_area=('area', 'mean'),\n    mean_intensity=('mean_intensity', 'mean')\n).reset_index()\nprint(summary)\n```\n\n## Typical Workflows\n\n### Workflow 1: Segment and Count Cells from Brightfield Microscopy\n\n```python\nfrom cellpose import models\nimport skimage.io, skimage.measure\nimport pandas as pd\n\n# Load\nimage = skimage.io.imread('brightfield_cells.tif')\n\n# Segment\nmodel = models.Cellpose(model_type='cyto2')\nmasks, _, _, diams = model.eval(image, diameter=None, channels=[0, 0])\n\n# Quantify\nprops = skimage.measure.regionprops_table(masks, image,\n    properties=['label', 'area', 'eccentricity', 'mean_intensity', 'centroid'])\ndf = pd.DataFrame(props)\nprint(f\"Cell count: {masks.max()}\")\nprint(f\"Mean area: {df['area'].mean():.1f} px^2\")\nprint(f\"Mean eccentricity: {df['eccentricity'].mean():.3f}\")\n```\n\n### Workflow 2: Track Cell Migration and Compute Velocity\n\n```python\nimport trackpy as tp\nimport tifffile\nimport numpy as np\n\n# Load time-lapse\nframes = tifffile.imread('migration_timelapse.tif')\npixel_size = 0.65  # um\u002Fpx\ndt = 5  # minutes between frames\n\n# Detect and track\nfeatures = tp.batch(frames, diameter=15, minmass=500)\ntracks = tp.link(features, search_range=20, memory=3)\ntracks = tp.filter_stubs(tracks, threshold=10)\n\n# Calculate velocity per track\nvelocities = []\nfor pid, group in tracks.groupby('particle'):\n    group = group.sort_values('frame')\n    dx = np.diff(group['x'].values) * pixel_size\n    dy = np.diff(group['y'].values) * pixel_size\n    speed = np.sqrt(dx**2 + dy**2) \u002F dt  # um\u002Fmin\n    velocities.append({'particle': pid, 'mean_speed': np.mean(speed),\n                       'max_speed': np.max(speed), 'n_frames': len(group)})\n\nvel_df = pd.DataFrame(velocities)\nprint(f\"Mean migration speed: {vel_df['mean_speed'].mean():.3f} um\u002Fmin\")\n```\n\n### Workflow 3: Quantify Protein Colocalization from Dual-Channel Fluorescence\n\n```python\nimport skimage.io\nimport numpy as np\nfrom scipy.stats import pearsonr\n\n# Load channels\ngreen = skimage.io.imread('protein_A_green.tif').astype(float)\nred = skimage.io.imread('protein_B_red.tif').astype(float)\n\n# Background subtraction\ngreen -= np.percentile(green, 5)\nred -= np.percentile(red, 5)\ngreen = np.clip(green, 0, None)\nred = np.clip(red, 0, None)\n\n# Threshold mask\nmask = (green > green.mean()) | (red > red.mean())\ng_masked, r_masked = green[mask], red[mask]\n\n# Pearson\npcc, pval = pearsonr(g_masked, r_masked)\n\n# Manders\nM1 = g_masked[r_masked > 0].sum() \u002F g_masked.sum()\nM2 = r_masked[g_masked > 0].sum() \u002F r_masked.sum()\n\nprint(f\"Pearson r = {pcc:.4f} (p = {pval:.2e})\")\nprint(f\"Manders M1 = {M1:.4f}, M2 = {M2:.4f}\")\n```\n\n### Workflow 4: Count Bacterial Colonies on Agar Plate Image\n\n```python\nimport skimage.io, skimage.filters, skimage.measure\nfrom skimage.morphology import remove_small_objects\nfrom scipy import ndimage\nimport numpy as np\n\nplate = skimage.io.imread('agar_plate.jpg', as_gray=True)\nsmoothed = skimage.filters.gaussian(plate, sigma=2)\nbinary = smoothed \u003C skimage.filters.threshold_otsu(smoothed)\nbinary = remove_small_objects(binary, min_size=30)\n\n# Watershed to split touching colonies\ndistance = ndimage.distance_transform_edt(binary)\nfrom skimage.feature import peak_local_max\nlocal_max = peak_local_max(distance, min_distance=8, labels=binary)\nmarkers = np.zeros_like(binary, dtype=int)\nfor i, (r, c) in enumerate(local_max, start=1):\n    markers[r, c] = i\nmarkers = ndimage.label(markers)[0]\nlabels = skimage.segmentation.watershed(-distance, markers, mask=binary)\n\nregions = skimage.measure.regionprops(labels)\nprint(f\"Colony count: {len(regions)}\")\nprint(f\"Mean area: {np.mean([r.area for r in regions]):.0f} px^2\")\n```\n\n## Best Practices\n\n1. **Always inspect images first** — check bit depth, dimensions, and channel order before processing\n2. **Use appropriate preprocessing** — CLAHE for low contrast, Gaussian blur for noisy images, background subtraction for uneven illumination\n3. **Validate segmentation visually** — overlay masks on original images to verify quality before batch processing\n4. **Cellpose model selection** — use `cyto2` for whole-cell, `nuclei` for nuclear segmentation; adjust `diameter` parameter if auto-detection fails\n5. **Trackpy parameter tuning** — `diameter` must be odd integer; `search_range` should be \u003C typical inter-particle distance; use `memory` for blinking objects\n6. **Colocalization controls** — always include single-stained controls; report both Pearson and Manders coefficients\n7. **Batch consistency** — use identical preprocessing and segmentation parameters across all images in an experiment\n8. **Scale bars** — always record pixel size (um\u002Fpx) from microscope metadata for absolute measurements\n\n## Troubleshooting\n\n**Problem:** Cellpose segments too many or too few cells\n**Solution:** Adjust `diameter` parameter manually instead of auto-detection. Increase `cellprob_threshold` (e.g., 0.5) to reduce false positives, decrease for more detections.\n\n**Problem:** Touching colonies not separated by watershed\n**Solution:** Decrease `min_distance` in `peak_local_max`. Try morphological erosion before distance transform.\n\n**Problem:** Trackpy links wrong particles across frames\n**Solution:** Decrease `search_range` to limit maximum displacement. Increase `minmass` to exclude dim objects that cause mislinks.\n\n**Problem:** TIFF file won't load or has wrong dimensions\n**Solution:** Use `tifffile.imread` for raw loading. Check `image.shape` and `image.dtype`. For multi-series files use `aicsimageio`.\n\n**Problem:** Colocalization values seem artificially high\n**Solution:** Ensure proper background subtraction. Use Costes automatic thresholding. Check for bleed-through between channels.\n\n## Resources\n\n- [Cellpose Documentation](https:\u002F\u002Fcellpose.readthedocs.io\u002F)\n- [scikit-image Documentation](https:\u002F\u002Fscikit-image.org\u002Fdocs\u002Fstable\u002F)\n- [trackpy Documentation](http:\u002F\u002Fsoft-matter.github.io\u002Ftrackpy\u002F)\n- [AICS ImageIO](https:\u002F\u002Fallencellmodeling.github.io\u002Faicsimageio\u002F)\n- [Bio-image Analysis Notebooks](https:\u002F\u002Fhaesleinhuepf.github.io\u002FBioImageAnalysisNotebooks\u002F)\n","# Bioimage Analysis: Microscopy Image Analysis for Cell Biology\n\n## Overview\n\nBioimage Analysis provides computational tools for processing and quantifying microscopy images in cell biology research. From cell segmentation using deep learning (Cellpose) and classical methods (watershed, Otsu thresholding) to object tracking across time-lapse sequences, morphology quantification, colony counting, colocalization analysis, and cytoskeleton characterization. This skill covers the full pipeline from raw microscopy images to quantitative measurements suitable for statistical analysis.\n\n## When to Use This Skill\n\n- Segmenting cells or nuclei from brightfield or fluorescence microscopy images\n- Tracking cell migration or particle movement in time-lapse sequences\n- Quantifying cell morphology (area, eccentricity, circularity, aspect ratio)\n- Counting bacterial or mammalian cell colonies on plates\n- Analyzing colocalization of proteins from multi-channel fluorescence images\n- Characterizing cytoskeleton fiber orientation and alignment\n- Quantifying mitochondrial morphology from JC-1 or TMRM staining\n- Batch processing multiple fields of view or multi-well plate images\n- Preprocessing microscopy images (denoising, background subtraction, contrast enhancement)\n\n**Related Skills:** For whole-slide pathology image analysis use `pathml` or `histolab`. For flow cytometry data use `flow-cytometry-analysis`. For clinical imaging (MRI, CT) use `clinical-imaging`.\n\n## Installation\n\n```bash\nuv pip install cellpose scikit-image opencv-python trackpy tifffile aicsimageio numpy pandas matplotlib\n```\n\n## Quick Start\n\n```python\nfrom cellpose import models\nimport skimage.io\nimport skimage.measure\nimport numpy as np\n\n# Load image\nimage = skimage.io.imread('cells.tif')\n\n# Segment with Cellpose\nmodel = models.Cellpose(model_type='cyto2')\nmasks, flows, styles, diams = model.eval(image, diameter=None, channels=[0, 0])\n\n# Measure properties\nprops = skimage.measure.regionprops_table(masks, image,\n    properties=['label', 'area', 'eccentricity', 'mean_intensity'])\n\nimport pandas as pd\ndf = pd.DataFrame(props)\nprint(f\"Detected {len(df)} cells\")\nprint(df.describe())\n```\n\n## Core Capabilities\n\n### 1. Image Loading & Preprocessing\n\nLoad microscopy images from common formats and prepare them for analysis.\n\n```python\nimport tifffile\nimport skimage.io\nimport skimage.filters\nimport skimage.exposure\nimport numpy as np\n\n# Load multi-channel TIFF\nimage = tifffile.imread('experiment.tif')\nprint(f\"Shape: {image.shape}, dtype: {image.dtype}\")\n\n# For multi-dimensional images (TCZYX)\nfrom aicsimageio import AICSImage\nimg = AICSImage('multi_dim.czi')\ndata = img.get_image_data(\"ZYX\", C=0, T=0)\n\n# Contrast enhancement (CLAHE)\nenhanced = skimage.exposure.equalize_adapthist(image, clip_limit=0.03)\n\n# Gaussian denoising\ndenoised = skimage.filters.gaussian(image, sigma=1.0)\n\n# Background subtraction (rolling ball approximation)\nfrom skimage.morphology import white_tophat, disk\nbackground_removed = white_tophat(image, disk(50))\n\n# Median filter for salt-and-pepper noise\nfrom skimage.filters import median\nfrom skimage.morphology import square\ncleaned = median(image, square(3))\n```\n\n### 2. Cell Segmentation\n\nSegment individual cells using deep learning or classical approaches.\n\n**Cellpose (deep learning):**\n\n```python\nfrom cellpose import models\n\n# Cytoplasm segmentation\nmodel = models.Cellpose(model_type='cyto2')\nmasks, flows, styles, diams = model.eval(\n    image,\n    diameter=None,       # Auto-detect cell diameter\n    channels=[0, 0],     # Grayscale; [2,3] for green cytoplasm + blue nuclei\n    flow_threshold=0.4,\n    cellprob_threshold=0.0\n)\n\n# Nuclei-only segmentation\nnuc_model = models.Cellpose(model_type='nuclei')\nnuc_masks, _, _, _ = nuc_model.eval(image, diameter=None, channels=[0, 0])\n\nprint(f\"Segmented {masks.max()} cells\")\n```\n\n**Classical watershed:**\n\n```python\nimport skimage.segmentation\nimport skimage.feature\nimport skimage.filters\nimport skimage.morphology\nfrom scipy import ndimage\n\n# Threshold\nthresh = skimage.filters.threshold_otsu(image)\nbinary = image > thresh\n\n# Distance transform for watershed seeds\ndistance = ndimage.distance_transform_edt(binary)\nlocal_max = skimage.feature.peak_local_max(distance, min_distance=20, labels=binary)\nmarkers = np.zeros_like(image, dtype=int)\nfor i, (r, c) in enumerate(local_max, start=1):\n    markers[r, c] = i\nmarkers = ndimage.label(markers)[0]\n\n# Watershed\nlabels = skimage.segmentation.watershed(-distance, markers, mask=binary)\nprint(f\"Segmented {labels.max()} objects\")\n```\n\n**Adaptive thresholding:**\n\n```python\n# For uneven illumination\nblock_size = 51\nadaptive_thresh = skimage.filters.threshold_local(image, block_size, offset=10)\nbinary = image > adaptive_thresh\n\n# Connected component labeling\nfrom skimage.measure import label\nlabeled = label(binary)\nprint(f\"Found {labeled.max()} connected components\")\n```\n\n### 3. Object Tracking\n\nTrack cells or particles across time-lapse frames.\n\n```python\nimport trackpy as tp\nimport pandas as pd\n\n# Load time-lapse as 3D array (T, Y, X)\nframes = tifffile.imread('timelapse.tif')\n\n# Locate features in each frame\nall_features = []\nfor t, frame in enumerate(frames):\n    features = tp.locate(frame, diameter=11, minmass=1000)\n    features['frame'] = t\n    all_features.append(features)\n\nfeatures_df = pd.concat(all_features, ignore_index=True)\n\n# Link particles across frames\ntrajectories = tp.link(features_df, search_range=15, memory=3)\n\n# Filter spurious tracks (require minimum length)\ntrajectories = tp.filter_stubs(trajectories, threshold=10)\nprint(f\"Tracked {trajectories['particle'].nunique()} objects over {len(frames)} frames\")\n\n# Calculate mean squared displacement\nmsd = tp.emsd(trajectories, mpp=0.65, fps=1)  # microns per pixel, frames per second\nprint(msd.head())\n```\n\n### 4. Morphology Quantification\n\nExtract shape and intensity measurements from segmented objects.\n\n```python\nimport skimage.measure\nimport pandas as pd\n\n# Measure region properties\nprops = skimage.measure.regionprops_table(masks, intensity_image=image,\n    properties=[\n        'label', 'area', 'perimeter', 'eccentricity', 'solidity',\n        'major_axis_length', 'minor_axis_length', 'mean_intensity',\n        'max_intensity', 'min_intensity', 'centroid'\n    ])\n\ndf = pd.DataFrame(props)\n\n# Calculate derived metrics\ndf['circularity'] = 4 * np.pi * df['area'] \u002F (df['perimeter'] ** 2)\ndf['aspect_ratio'] = df['major_axis_length'] \u002F df['minor_axis_length']\n\nprint(f\"Measured {len(df)} objects\")\nprint(df[['area', 'eccentricity', 'circularity', 'mean_intensity']].describe())\n```\n\n### 5. Colony Counting\n\nCount colonies from plate images.\n\n```python\nimport skimage.io\nimport skimage.filters\nimport skimage.segmentation\nimport skimage.measure\nfrom scipy import ndimage\n\n# Load plate image\nplate = skimage.io.imread('agar_plate.jpg', as_gray=True)\n\n# Preprocessing\nsmoothed = skimage.filters.gaussian(plate, sigma=2)\n\n# Threshold\nthresh = skimage.filters.threshold_otsu(smoothed)\nbinary = smoothed \u003C thresh  # Colonies are darker\n\n# Remove small noise\nfrom skimage.morphology import remove_small_objects\ncleaned = remove_small_objects(binary, min_size=50)\n\n# Separate touching colonies with watershed\ndistance = ndimage.distance_transform_edt(cleaned)\nlocal_max = skimage.feature.peak_local_max(distance, min_distance=10, labels=cleaned)\nmarkers = np.zeros_like(plate, dtype=int)\nfor i, (r, c) in enumerate(local_max, start=1):\n    markers[r, c] = i\nmarkers = ndimage.label(markers)[0]\nseparated = skimage.segmentation.watershed(-distance, markers, mask=cleaned)\n\n# Count and measure\nregions = skimage.measure.regionprops(separated)\ncolony_count = len(regions)\nareas = [r.area for r in regions]\nprint(f\"Colony count: {colony_count}\")\nprint(f\"Mean colony area: {np.mean(areas):.1f} px^2\")\n```\n\n### 6. Colocalization Analysis\n\nQuantify spatial overlap between fluorescence channels.\n\n```python\nimport numpy as np\nfrom scipy.stats import pearsonr\n\n# Load dual-channel image\nch1 = skimage.io.imread('green_channel.tif').astype(float)\nch2 = skimage.io.imread('red_channel.tif').astype(float)\n\n# Mask background (Costes automatic thresholding approximation)\nmask = (ch1 > skimage.filters.threshold_otsu(ch1)) | \\\n       (ch2 > skimage.filters.threshold_otsu(ch2))\n\nch1_masked = ch1[mask]\nch2_masked = ch2[mask]\n\n# Pearson correlation coefficient\npcc, pval = pearsonr(ch1_masked, ch2_masked)\nprint(f\"Pearson correlation: {pcc:.4f} (p={pval:.2e})\")\n\n# Manders overlap coefficients\nch1_coloc = ch1_masked[ch2_masked > 0]\nch2_coloc = ch2_masked[ch1_masked > 0]\nM1 = ch1_coloc.sum() \u002F ch1_masked.sum()  # Fraction of ch1 overlapping with ch2\nM2 = ch2_coloc.sum() \u002F ch2_masked.sum()  # Fraction of ch2 overlapping with ch1\nprint(f\"Manders M1: {M1:.4f}, M2: {M2:.4f}\")\n```\n\n### 7. Cytoskeleton & Fiber Analysis\n\nCharacterize fiber orientation and alignment.\n\n```python\nimport skimage.feature\nimport skimage.transform\nimport numpy as np\n\n# Edge detection\nedges = skimage.feature.canny(image, sigma=2)\n\n# Hough line transform for fiber orientation\ntested_angles = np.linspace(-np.pi \u002F 2, np.pi \u002F 2, 180, endpoint=False)\nh, theta, d = skimage.transform.hough_line(edges, theta=tested_angles)\n\n# Extract peaks (dominant orientations)\npeaks = skimage.transform.hough_line_peaks(h, theta, d, num_peaks=50)\n\n# Orientation distribution\nangles_deg = np.degrees(peaks[1])\nmean_angle = np.mean(angles_deg)\nstd_angle = np.std(angles_deg)\n\n# Order parameter S = 2 * \u003Ccos^2(theta)> - 1 (1=aligned, 0=random)\ncos2 = np.cos(2 * np.radians(angles_deg))\norder_parameter = np.mean(cos2)\nprint(f\"Mean orientation: {mean_angle:.1f} +\u002F- {std_angle:.1f} degrees\")\nprint(f\"Order parameter S: {order_parameter:.3f}\")\n```\n\n### 8. Mitochondrial Morphology\n\nAnalyze mitochondrial shape and membrane potential.\n\n```python\nimport skimage.measure\nimport numpy as np\n\n# JC-1 staining: red=healthy (aggregate), green=depolarized (monomer)\nred_channel = skimage.io.imread('jc1_red.tif').astype(float)\ngreen_channel = skimage.io.imread('jc1_green.tif').astype(float)\n\n# Membrane potential ratio\nratio = red_channel \u002F (green_channel + 1e-6)  # Avoid division by zero\nmean_ratio = np.mean(ratio[ratio > 0])\nprint(f\"Mean red\u002Fgreen ratio: {mean_ratio:.3f}\")\n\n# Segment mitochondria from green channel\nthresh = skimage.filters.threshold_otsu(green_channel)\nmito_mask = green_channel > thresh\nmito_labels = skimage.measure.label(mito_mask)\n\n# Morphology metrics\nprops = skimage.measure.regionprops_table(mito_labels,\n    properties=['label', 'area', 'major_axis_length', 'minor_axis_length',\n                'eccentricity', 'euler_number'])\ndf = pd.DataFrame(props)\ndf['aspect_ratio'] = df['major_axis_length'] \u002F (df['minor_axis_length'] + 1e-6)\n\n# Classify: round (AR\u003C2), intermediate (2-4), elongated (>4)\ndf['morphology'] = pd.cut(df['aspect_ratio'], bins=[0, 2, 4, np.inf],\n                          labels=['round', 'intermediate', 'elongated'])\nprint(df['morphology'].value_counts())\n```\n\n### 9. Batch Processing\n\nProcess multiple fields of view or wells.\n\n```python\nfrom pathlib import Path\nimport pandas as pd\n\nimage_dir = Path('plate_images\u002F')\nall_results = []\n\nfor img_path in sorted(image_dir.glob('*.tif')):\n    image = skimage.io.imread(str(img_path))\n\n    # Segment\n    model = models.Cellpose(model_type='cyto2')\n    masks, _, _, _ = model.eval(image, diameter=None, channels=[0, 0])\n\n    # Measure\n    props = skimage.measure.regionprops_table(masks, image,\n        properties=['label', 'area', 'eccentricity', 'mean_intensity'])\n    df = pd.DataFrame(props)\n    df['image'] = img_path.stem\n\n    all_results.append(df)\n\nresults = pd.concat(all_results, ignore_index=True)\nsummary = results.groupby('image').agg(\n    cell_count=('label', 'count'),\n    mean_area=('area', 'mean'),\n    mean_intensity=('mean_intensity', 'mean')\n).reset_index()\nprint(summary)\n```\n\n## Typical Workflows\n\n### Workflow 1: Segment and Count Cells from Brightfield Microscopy\n\n```python\nfrom cellpose import models\nimport skimage.io, skimage.measure\nimport pandas as pd\n\n# Load\nimage = skimage.io.imread('brightfield_cells.tif')\n\n# Segment\nmodel = models.Cellpose(model_type='cyto2')\nmasks, _, _, diams = model.eval(image, diameter=None, channels=[0, 0])\n\n# Quantify\nprops = skimage.measure.regionprops_table(masks, image,\n    properties=['label', 'area', 'eccentricity', 'mean_intensity', 'centroid'])\ndf = pd.DataFrame(props)\nprint(f\"Cell count: {masks.max()}\")\nprint(f\"Mean area: {df['area'].mean():.1f} px^2\")\nprint(f\"Mean eccentricity: {df['eccentricity'].mean():.3f}\")\n```\n\n### Workflow 2: Track Cell Migration and Compute Velocity\n\n```python\nimport trackpy as tp\nimport tifffile\nimport numpy as np\n\n# Load time-lapse\nframes = tifffile.imread('migration_timelapse.tif')\npixel_size = 0.65  # um\u002Fpx\ndt = 5  # minutes between frames\n\n# Detect and track\nfeatures = tp.batch(frames, diameter=15, minmass=500)\ntracks = tp.link(features, search_range=20, memory=3)\ntracks = tp.filter_stubs(tracks, threshold=10)\n\n# Calculate velocity per track\nvelocities = []\nfor pid, group in tracks.groupby('particle'):\n    group = group.sort_values('frame')\n    dx = np.diff(group['x'].values) * pixel_size\n    dy = np.diff(group['y'].values) * pixel_size\n    speed = np.sqrt(dx**2 + dy**2) \u002F dt  # um\u002Fmin\n    velocities.append({'particle': pid, 'mean_speed': np.mean(speed),\n                       'max_speed': np.max(speed), 'n_frames': len(group)})\n\nvel_df = pd.DataFrame(velocities)\nprint(f\"Mean migration speed: {vel_df['mean_speed'].mean():.3f} um\u002Fmin\")\n```\n\n### Workflow 3: Quantify Protein Colocalization from Dual-Channel Fluorescence\n\n```python\nimport skimage.io\nimport numpy as np\nfrom scipy.stats import pearsonr\n\n# Load channels\ngreen = skimage.io.imread('protein_A_green.tif').astype(float)\nred = skimage.io.imread('protein_B_red.tif').astype(float)\n\n# Background subtraction\ngreen -= np.percentile(green, 5)\nred -= np.percentile(red, 5)\ngreen = np.clip(green, 0, None)\nred = np.clip(red, 0, None)\n\n# Threshold mask\nmask = (green > green.mean()) | (red > red.mean())\ng_masked, r_masked = green[mask], red[mask]\n\n# Pearson\npcc, pval = pearsonr(g_masked, r_masked)\n\n# Manders\nM1 = g_masked[r_masked > 0].sum() \u002F g_masked.sum()\nM2 = r_masked[g_masked > 0].sum() \u002F r_masked.sum()\n\nprint(f\"Pearson r = {pcc:.4f} (p = {pval:.2e})\")\nprint(f\"Manders M1 = {M1:.4f}, M2 = {M2:.4f}\")\n```\n\n### Workflow 4: Count Bacterial Colonies on Agar Plate Image\n\n```python\nimport skimage.io, skimage.filters, skimage.measure\nfrom skimage.morphology import remove_small_objects\nfrom scipy import ndimage\nimport numpy as np\n\nplate = skimage.io.imread('agar_plate.jpg', as_gray=True)\nsmoothed = skimage.filters.gaussian(plate, sigma=2)\nbinary = smoothed \u003C skimage.filters.threshold_otsu(smoothed)\nbinary = remove_small_objects(binary, min_size=30)\n\n# Watershed to split touching colonies\ndistance = ndimage.distance_transform_edt(binary)\nfrom skimage.feature import peak_local_max\nlocal_max = peak_local_max(distance, min_distance=8, labels=binary)\nmarkers = np.zeros_like(binary, dtype=int)\nfor i, (r, c) in enumerate(local_max, start=1):\n    markers[r, c] = i\nmarkers = ndimage.label(markers)[0]\nlabels = skimage.segmentation.watershed(-distance, markers, mask=binary)\n\nregions = skimage.measure.regionprops(labels)\nprint(f\"Colony count: {len(regions)}\")\nprint(f\"Mean area: {np.mean([r.area for r in regions]):.0f} px^2\")\n```\n\n## Best Practices\n\n1. **Always inspect images first** — check bit depth, dimensions, and channel order before processing\n2. **Use appropriate preprocessing** — CLAHE for low contrast, Gaussian blur for noisy images, background subtraction for uneven illumination\n3. **Validate segmentation visually** — overlay masks on original images to verify quality before batch processing\n4. **Cellpose model selection** — use `cyto2` for whole-cell, `nuclei` for nuclear segmentation; adjust `diameter` parameter if auto-detection fails\n5. **Trackpy parameter tuning** — `diameter` must be odd integer; `search_range` should be \u003C typical inter-particle distance; use `memory` for blinking objects\n6. **Colocalization controls** — always include single-stained controls; report both Pearson and Manders coefficients\n7. **Batch consistency** — use identical preprocessing and segmentation parameters across all images in an experiment\n8. **Scale bars** — always record pixel size (um\u002Fpx) from microscope metadata for absolute measurements\n\n## Troubleshooting\n\n**Problem:** Cellpose segments too many or too few cells\n**Solution:** Adjust `diameter` parameter manually instead of auto-detection. Increase `cellprob_threshold` (e.g., 0.5) to reduce false positives, decrease for more detections.\n\n**Problem:** Touching colonies not separated by watershed\n**Solution:** Decrease `min_distance` in `peak_local_max`. Try morphological erosion before distance transform.\n\n**Problem:** Trackpy links wrong particles across frames\n**Solution:** Decrease `search_range` to limit maximum displacement. Increase `minmass` to exclude dim objects that cause mislinks.\n\n**Problem:** TIFF file won't load or has wrong dimensions\n**Solution:** Use `tifffile.imread` for raw loading. Check `image.shape` and `image.dtype`. For multi-series files use `aicsimageio`.\n\n**Problem:** Colocalization values seem artificially high\n**Solution:** Ensure proper background subtraction. Use Costes automatic thresholding. Check for bleed-through between channels.\n\n## Resources\n\n- [Cellpose Documentation](https:\u002F\u002Fcellpose.readthedocs.io\u002F)\n- [scikit-image Documentation](https:\u002F\u002Fscikit-image.org\u002Fdocs\u002Fstable\u002F)\n- [trackpy Documentation](http:\u002F\u002Fsoft-matter.github.io\u002Ftrackpy\u002F)\n- [AICS ImageIO](https:\u002F\u002Fallencellmodeling.github.io\u002Faicsimageio\u002F)\n- [Bio-image Analysis Notebooks](https:\u002F\u002Fhaesleinhuepf.github.io\u002FBioImageAnalysisNotebooks\u002F)\n",{"name":5,"license":46,"category":30,"metadata":47,"description":7},"MIT license",{"skill-author":48},"InkVell Inc.","main","4aa39efd1cdab0b4657ecee16c92a92011a5b10f","openscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub","https:\u002F\u002Fgithub.com\u002Ffadrienne","2026-10-28 00:43:09",{"source":8,"skillName":5,"commands":56,"prompt":66,"zipAvailable":67},[57,60,63],{"tool":58,"command":59},"npx","npx skills add fadrienne\u002FMyGitHub --skill bioimage-analysis",{"tool":61,"command":62},"bunx","bunx skills add fadrienne\u002FMyGitHub --skill bioimage-analysis",{"tool":64,"command":65},"pnpm","pnpm dlx skills add fadrienne\u002FMyGitHub --skill bioimage-analysis","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002FSKILL.md",true,[69,75,79,83,87],{"path":70,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":73,"sourceHtmlUrl":74},"scripts\u002Fanalyze_morphology.py","SCRIPT","脚本",12016,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002Fscripts\u002Fanalyze_morphology.py",{"path":76,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":77,"sourceHtmlUrl":78},"scripts\u002Fcolocalization.py",11982,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002Fscripts\u002Fcolocalization.py",{"path":80,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":81,"sourceHtmlUrl":82},"scripts\u002Fcount_colonies.py",10766,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002Fscripts\u002Fcount_colonies.py",{"path":84,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":85,"sourceHtmlUrl":86},"scripts\u002Fsegment_cells.py",10025,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002Fscripts\u002Fsegment_cells.py",{"path":88,"resourceType":71,"resourceTypeDesc":72,"sizeBytes":89,"sourceHtmlUrl":90},"scripts\u002Ftrack_cells.py",14549,"https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fopenscience\u002Fbackend\u002Fcli\u002Fskills\u002Fbiology\u002Fbioimage-analysis\u002Fscripts\u002Ftrack_cells.py",[92,121,146,180,207,234],{"skillNo":93,"name":94,"nameZh":6,"description":95,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":96,"categories":97,"keywords":101,"publishedAt":41},"01M7167B28PK20HP7R7ZED2DY0","statistical-power","Sample size calculation, power analysis, and effect size conversion for scientific studies. Use BEFORE data collection (a priori) to determine required N, or after (post-hoc) to compute achieved power. Covers parametric tests (t-test, ANOVA, chi-square, proportions, correlation, regression), simulation-based power for complex\u002Fclustered\u002Fnested designs, and power curves. Use this skill when someone asks 'how many samples do I need', 'what is my power', 'what effect size can I detect', or any variant. Pairs with \u002Fexperimental-design (choose design first, then compute power) and \u002Fstatistical-analysis (analyze data after collection).","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fstatistical-power\u002FSKILL.md",[98],{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[102,103,104,105,106,107,108,109,110,111,112,25,113,114,115,116,117,118,119,120],"power","statistical power","effect","scipy","regression","choose","design","uv","when","Bash","collection","calculation","ANOVA","conversion","analyze","t-test","chi-square","simulation","sample",{"skillNo":122,"name":123,"nameZh":6,"description":124,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":125,"categories":126,"keywords":130,"publishedAt":41},"01M71677EBCM8EPCE9BZCK8505","statistical-analysis","Guided statistical analysis with test selection and reporting. Use when you need help choosing appropriate tests for your data, assumption checking, power analysis, and APA-formatted results. Best for academic research reporting, test selection guidance. For implementing specific models programmatically use statsmodels.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fstatistical-analysis\u002FSKILL.md",[127],{"categoryNo":128,"categoryName":129,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000008","测试与质量",[25,131,102,132,133,134,110,135,136,137,28,138,36,139,140,141,142,143,144,145],"statistical analysis","academic research","implementing","selection","you","reporting","data","tests","with","test","research","results","statsmodels","models","help",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":161,"publishedAt":41},"01M71673R93XAHFH81DBNVNG7H","scientific-writing","Core skill for the deep research and writing tool. Write scientific manuscripts in full paragraphs (never bullet points). Use two-stage process with (1) section outlines with key points using research-lookup then (2) convert to flowing prose. IMRAD structure, citations (APA\u002FAMA\u002FVancouver), figures\u002Ftables, reporting guidelines (CONSORT\u002FSTROBE\u002FPRISMA), for research papers and journal submissions.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fscientific-writing\u002FSKILL.md",[152,155,156],{"categoryNo":153,"categoryName":154,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":157,"categoryName":158,"taxonomyType":159,"taxonomyTypeDesc":160},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[162,163,164,165,166,167,168,169,170,171,111,172,173,174,175,176,177,178,136,179],"writing","scientific","scientific writing","Citations","deep","deep research","never","papers","journal","false","api","prisma","structure","openrouter","Outlines","core skill","read","features",{"skillNo":181,"name":182,"nameZh":6,"description":183,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":184,"categories":185,"keywords":190,"publishedAt":41},"01M7166ZPKXBF4EBPHVTJPQBB1","scientific-visualization","Meta-skill for publication-ready figures. Use when creating journal submission figures requiring multi-panel layouts, significance annotations, error bars, colorblind-safe palettes, and specific journal formatting (Nature, Science, Cell). Orchestrates matplotlib\u002Fseaborn\u002Fplotly with publication styles. For quick exploration use seaborn or plotly directly.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fscientific-visualization\u002FSKILL.md",[186,189],{"categoryNo":187,"categoryName":188,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000013","分析与可视化",{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},[191,163,192,193,194,195,196,197,198,170,110,199,200,201,202,203,204,205,28,206],"visualization","scientific visualization","error","ready","quick","exploration","meta-skill","Meta","safe","plotly","annotations","formatting","Publication","figures","panel","submission",{"skillNo":208,"name":209,"nameZh":6,"description":210,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":211,"categories":212,"keywords":219,"publishedAt":41},"01M7166VXJWQSSC3RQZP60WBGR","research-code","Debug, profile, review, and restructure Python research and analysis code. Use when analysis scripts crash, produce wrong results, run too slowly, or need a correctness review. Covers: reading tracebacks and diagnosing root causes, hypothesis-driven debugging, reviewing code for common statistical\u002Fnumerical errors, profiling data pipelines, improving reproducibility (seeds, environments, determinism), and structuring analysis scripts for sharing. Distinct from \u002Fexploratory-data-analysis (which understands data) and \u002Fstatistical-analysis (which chooses and runs tests) — this skill focuses on the code itself.","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fresearch-code\u002FSKILL.md",[213,216],{"categoryNo":214,"categoryName":215,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000021","资料检索与研究",{"categoryNo":217,"categoryName":218,"taxonomyType":159,"taxonomyTypeDesc":160},"01JBSEEDCAT000000000000030","开发工程师",[220,221,141,222,223,224,225,109,226,110,111,25,227,228,229,230,231,232,178,233],"code","research code","which","memory","data-analysis","errors","debugging","common","review","data pipelines","run","scripts","line","write",{"skillNo":235,"name":236,"nameZh":6,"description":237,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":238,"licenseFileUrl":6,"sourceHtmlUrl":239,"categories":240,"keywords":247,"publishedAt":41},"01M7166CF5HSR7SVZYZFWTDX55","markdown-mermaid-writing","Comprehensive markdown and Mermaid diagram writing skill. Use when creating any scientific document, report, analysis, or visualization. Establishes text-based diagrams as the default documentation standard with full style guides (markdown + mermaid), 24 diagram type references, and 9 document templates.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Ffadrienne\u002FMyGitHub\u002Fblob\u002Fmain\u002Fscientific-agent-skills\u002Fskills\u002Fmarkdown-mermaid-writing\u002FSKILL.md",[241,244,245,246],{"categoryNo":242,"categoryName":243,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000002","文档处理",{"categoryNo":153,"categoryName":154,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":99,"categoryName":100,"taxonomyType":21,"taxonomyTypeDesc":22},{"categoryNo":157,"categoryName":158,"taxonomyType":159,"taxonomyTypeDesc":160},[162,248,249,250,251,252,191,253,254,110,111,25,255,256,257,258,259,260,163,178],"markdown mermaid writing","mermaid","markdown","community","diagrams","project","default","team","guides","text","documentation","references","diagram"]