Skip to main content

Static image analysis (CLI + FastAPI) for the analyser family

Project description

image-analyser

PyPI Python License: MIT

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 libzbar0
  • libmagic (for MIME detection): brew install libmagic / apt install libmagic1
  • tesseract (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

image_analyser-0.1.0.tar.gz (271.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

image_analyser-0.1.0-py3-none-any.whl (23.0 kB view details)

Uploaded Python 3

File details

Details for the file image_analyser-0.1.0.tar.gz.

File metadata

  • Download URL: image_analyser-0.1.0.tar.gz
  • Upload date:
  • Size: 271.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for image_analyser-0.1.0.tar.gz
Algorithm Hash digest
SHA256 a3011ca446dba458969497129403dbe44bb25410c2fb058230b0590f614839b2
MD5 57b0836dae5428a2c29b88e7c90d73e1
BLAKE2b-256 627b87f7b324bf2fe76d455f87f3c90cfdcf5e551be2747804da4385ead554fb

See more details on using hashes here.

File details

Details for the file image_analyser-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: image_analyser-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 23.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.0

File hashes

Hashes for image_analyser-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 163256f0a1e4cd5503ec3f945a55cd215267bf519b42aaed8fc6a43588f77a56
MD5 7f6c54cb75c6ac37a007c00eb396433d
BLAKE2b-256 04b0e78ba0158d31b4c2e088e58fb4d6bf3d94890c5645f5ff55a7752ef61d4b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page