Tools & data · Prototype
FishMorph
Measure fish images, save landmarks and masks, and compare a 3D model with reference profiles. A local Python workbench with a browser interface.
- Measured synthetic fixture; downloaded JSON matched its stored SQLite analysis document.
- Eight independent synthetic references and an authored model candidate. Head-length ratio 0.33 versus reference mean 0.24025; this is an intentional fixture comparison.
Screenshots from the bundled synthetic demo. The example images and specimen records are generated fixtures.
- Role
- System design, implementation and testing with AI coding tools
- Period
- 2026
- Status
- Local Python application
- Platform
- Python 3.11+, local browser UI
Overview
Import images, mark landmarks and body outlines, then save measurements with the specimen record. FishMorph retains the original image and keeps a history of annotation changes.
The bundled demo uses synthetic fish, so it is easy to try without supplying photographs.
Image measurements
Landmarks and a reviewed body outline give length-relative measurements and profiles. Multiple photographs of one specimen stay grouped together rather than being counted as separate animals.
Measurements depend on the available landmarks and scale. An unscaled photograph cannot give physical length or reveal the width of an unseen side.
Reproduce this check
python3 -m venv .venv
.venv/bin/python -m pip install -e ".[dev]"
.venv/bin/fishmorph --project ./demo-data serveMesh comparison
Load a mesh to render orthographic views on the CPU, then mark matching landmarks and compare its proportions with a reference profile. The saved projection matrices make each view reproducible.
Color comparison needs calibrated reference data. A neutral model render and an ordinary field photograph usually cannot provide that comparison.
Testing
The packaged application passed 68 tests. Its demo contains eight reference specimens, nine images and a model comparison.
Browser checks covered annotation saving, measurements, zoom, masks and JSON export at desktop and phone widths. Exported JSON matched the analysis stored in SQLite.
Reproduce this check
.venv/bin/python -m pytest -qImages and measurements
The code and bundled synthetic examples are MIT licensed. Imported photographs and meshes keep their original licenses.
Manual landmarks and masks need review. The examples test the software workflow; they do not establish biological accuracy.
Scope & limitations
Manual landmarks and masks require review. Unscaled images cannot establish physical length; field color is not absolute pigmentation. Synthetic tests do not establish biological validity.