Static image analysis (CLI + FastAPI) for the analyser family
Project description
image-analyser
Static image analysis (CLI + FastAPI) for the analyser family.
Given a single image file, image-analyser returns:
- Format — JPEG / PNG / WebP / AVIF / HEIC / GIF / TIFF / BMP, MIME type, resolution, megapixels, aspect class, colour mode, bit depth, alpha, file size.
- Hashes — SHA-256 of bytes, perceptual pHash and dHash for dedup.
- Metadata — EXIF (camera, lens, ISO, GPS, timestamp), IPTC, XMP, ICC profile, C2PA Content Credentials.
- Quality — blur (Laplacian variance), exposure (under / over / clipping), brightness, contrast, noise, JPEG-quality estimate.
- Colour — k-means dominant palette + average colour.
- Barcodes / QR codes — via pyzbar.
- Animation — frame count + duration for GIF / WebP.
- Object detection (opt-in
[ml]) — DETR by default; configurable HuggingFace pipeline. - Caption / textual description (opt-in
[ml]or[api]) — local BLIP, or one of Anthropic / OpenAI / Google / OpenRouter. - OCR (opt-in
[ocr]) — Tesseract or EasyOCR.
Anything that can't run in the current install lands in result.skipped[] with a stable reason. Anything that raises lands in result.failed[]. The HTTP response stays 200.
Install
pip install image-analyser # Tier 1 only
pip install image-analyser[ml] # + DETR object detection + local BLIP captioning
pip install image-analyser[ocr] # + Tesseract / EasyOCR
pip install image-analyser[api] # + API captioning (no torch needed)
pip install image-analyser[all] # everything
System dependencies:
libzbar0(for barcode/QR detection):brew install zbar/apt install libzbar0libmagic(for MIME detection):brew install libmagic/apt install libmagic1tesseract(only if[ocr]extra used and tesseract is the engine):brew install tesseract/apt install tesseract-ocr
CLI
image-analyser photo.jpg # pretty JSON
image-analyser photo.jpg --json # compact JSON
image-analyser photo.jpg --skip caption,ocr # opt out
image-analyser photo.jpg --only metadata,quality # opt in
image-analyser photo.jpg --caption-backend local # force local BLIP
image-analyser serve # FastAPI on :8006
image-analyser serve --port 9000
Legal --skip / --only values: metadata, quality, colour, hashing, barcode, objects, caption, ocr.
Exit codes: 0 on success (even with failed[]), 2 on bad input, 1 on internal error.
HTTP API
# Multipart upload
curl -F file=@photo.jpg http://127.0.0.1:8006/analyse
# JSON with absolute path
curl -X POST -H "Content-Type: application/json" \
-d '{"path":"/abs/path/photo.jpg","skip":["caption"]}' \
http://127.0.0.1:8006/analyse
# Health check
curl http://127.0.0.1:8006/health
# {"status": "ok", "version": "0.1.0"}
Python library
from image_analyser import ImageAnalyser
result = ImageAnalyser().analyse("photo.jpg")
print(result.metadata.exif.camera if result.metadata.exif else "no EXIF")
print(result.quality.blur_score, result.colour.dominant)
for s in result.skipped:
print("skipped", s.name, "—", s.reason)
Configuration
All env vars use the IMAGE_ANALYSER_ prefix.
| Env var | Default | Purpose |
|---|---|---|
IMAGE_ANALYSER_PORT |
8006 |
FastAPI port |
IMAGE_ANALYSER_HOST |
127.0.0.1 |
bind address |
IMAGE_ANALYSER_MODE |
production |
production / development |
IMAGE_ANALYSER_ALLOWED_ORIGINS |
* |
CORS allow-list (comma-separated) |
IMAGE_ANALYSER_CAPTION_BACKEND |
auto |
auto / local / api / none |
IMAGE_ANALYSER_CAPTION_PROVIDER |
anthropic |
anthropic / openai / google / openrouter |
IMAGE_ANALYSER_CAPTION_MODEL |
provider-default | model id override |
IMAGE_ANALYSER_LOCAL_CAPTION_MODEL |
Salesforce/blip-image-captioning-base |
HuggingFace BLIP model id |
IMAGE_ANALYSER_OCR_ENGINE |
auto |
auto / tesseract / easyocr / none |
IMAGE_ANALYSER_OBJECT_DETECTION_MODEL |
facebook/detr-resnet-50 |
HuggingFace pipeline model |
IMAGE_ANALYSER_OBJECT_DETECTION_THRESHOLD |
0.5 |
detection-confidence cutoff |
IMAGE_ANALYSER_DEVICE |
auto |
auto / cpu / cuda / mps |
IMAGE_ANALYSER_MAX_UPLOAD_MB |
50 |
reject larger uploads |
API keys: standard provider env vars (ANTHROPIC_API_KEY, OPENAI_API_KEY, GOOGLE_API_KEY, OPENROUTER_API_KEY).
Development
git clone https://github.com/michael-borck/image-analyser
cd image-analyser
python -m venv .venv && source .venv/bin/activate
pip install -e ".[dev,all]"
python tests/fixtures/make_fixtures.py
pytest # fast tests
pytest -m slow # opt-in ML / engine tests
ruff check .
mypy src
The analyser family
| Tool | PyPI | Port | Role |
|---|---|---|---|
| auto-analyser | ✓ | — | router (file → specialist) |
| bundle-analyser | ✓ | 8008 | folder / zip walker |
| code-analyser | ✓ | 8004 | source code analysis |
| document-analyser | ✓ | 8000 | document analysis |
| git-analyser | ✓ | 8007 | git repo analysis |
| image-analyser | ✓ | 8006 | static image analysis (this repo) |
| records-analyser | ✓ | 8003 | structured-records analysis |
| speech-analyser | ✓ | 8001 | audio transcription / speech analysis |
| video-analyser | ✓ | 8002 | video analysis |
| wordpress-analyser | ✓ | 8005 | WordPress export analysis |
Licence
MIT © Michael Borck.
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file image_analyser-0.1.3.tar.gz.
File metadata
- Download URL: image_analyser-0.1.3.tar.gz
- Upload date:
- Size: 274.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8e21fbd96d461908f0b389545f5bae428966e5b2d953e88b90a63880163a0332
|
|
| MD5 |
ca612c8a1608cd82e2656dda87bd8e36
|
|
| BLAKE2b-256 |
eb26cff2afc66e4df273f74acdbc85d1a785ee301232c1a1e686979b56c8f63a
|
File details
Details for the file image_analyser-0.1.3-py3-none-any.whl.
File metadata
- Download URL: image_analyser-0.1.3-py3-none-any.whl
- Upload date:
- Size: 24.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.13.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
a67800743867a52bdd39d86fc032d1bb8adfef5bcb34fa8fdad000edf7c673f0
|
|
| MD5 |
fb8e0f4387f4443fd4b228df5dd05122
|
|
| BLAKE2b-256 |
44cb17f8bff1790dadbf3e0e2b431b226f3962a228779ba38f7b2518bd0696c7
|