AMyGDA analyses photographs of antibiotic-containing 96-well plates, estimates growth in each well, and infers minimum inhibitory concentrations (MICs).
A paper describing the software and demonstrating its reproducibility and accuracy is available in Microbiology.
This is a major release and the CLI uses a proper verb structure so is different to earlier versions!
AMyGDA has been used to analyse all images of all the 96-well plates from the CRyPTIC project; each was inoculated with a sample of M. tuberculosis and incubated for two weeks. Where possible, a minimum inhibitory concentration (MIC) for each drug was estimated -- these are referred to as AMYGDA_DILUTION in the UKMYC_PHENOTYPES table in the current release (v3.4.0) of the CRyPTIC datatables which are freely available on Zenodo.
AMyGDA now uses modern Python packaging via pyproject.toml.
python -m venv .venv
source .venv/bin/activate
pip install -e .[dev]amygda run examples/sample-images/01/image-01-raw.pngSubcommands:
amygda filter IMAGEamygda segment IMAGEamygda measure IMAGEamygda run IMAGEamygda strips IMAGEamygda panels IMAGE
Useful options:
measureandrunaccept--plate_design UKMYC5--growth_pixel_threshold 130--growth_percentage 2--measured_region 0.5--sensitivity 4
Stage outputs:
filterreads the exact image you pass and writes an image with-filteredappended to the stemsegmentreads the exact image you pass, writes a matching-arrays.npz, and only writes-segmentedif you pass--save-segmented-imagemeasurereads the exact image you pass, loads the matching-arrays.npz, and writes an image with-growthappended to the stemstripsreads a filtered image plus the matching segmented arrays and automatically saves one horizontal*-DRUG-panel.pngimage per drugpanelsdoes the same asstripsbut also includes the positive control wells above the drug strip, left-aligned, to help downstream machine-learning workflows- existing stage suffixes are replaced rather than accumulated, so segmenting
image-filtered.pngproducesimage-segmented.png runexecutes all three stages in sequence in memory, producing*-filtered,*-growth, and the segmentation arrays, with*-segmentedonly if--save-segmented-imageis supplied
from amygda import PlateMeasurement
plate = PlateMeasurement(
"examples/sample-images/01",
categories={"ImageFileName": "image-01"},
plate_design="UKMYC5",
)
plate.load_image("-raw.png")
plate.mean_shift_filter()
plate.equalise_histograms_locally()
plate.stretch_histogram()
plate.save_image("-filtered.jpg")Run the tests with:
pytestRun linting and type checks with:
ruff check .
mypyThe legacy PlateMeasurement constructor arguments new, tags, and
configuration_path are still accepted for compatibility, but they now emit
deprecation warnings and no longer affect behavior.
Plate layouts live in amygda/config/ and are shipped as package data. Each design is defined by three matrices:
*-drug-matrix.txt*-conc-matrix.txt*-dilution-matrix.txt
Adding a new plate design means adding a matching set of those files.
The software is available subject to the terms of the attached academic-use licence.