A professional Python application for longitudinal ophthalmic image registration and comparison, supporting DICOM and standard image formats with multiple alignment methods.
Version 2.3.0 | Updated: December 2025
This application provides robust image registration with multiple alignment options:
- AKAZE: Fast and accurate feature-based alignment (recommended default)
- ORB: Fastest option for quick previews
- SIFT: Classic algorithm for detailed images
- Manual 3-Point: For difficult cases where automatic methods fail
- Fundus photography
- IR (Infrared) en face images
- FAF (Fundus Autofluorescence) images
- Cross-modality registration (IR↔FAF) with CLAHE preprocessing
- Other planar retinal modalities
- DICOM Support: Full DICOM loading with metadata preservation
- Pixel Spacing: Accurate mm measurements from DICOM tags
- Measurement Unit Toggle: Switch between mm and pixels for measurements
- CLAHE Preprocessing: Contrast Limited Adaptive Histogram Equalization for cross-modality registration
- Multimodality Options: Grayscale, invert, contrast, brightness adjustments
- Batch Processing: Register multiple follow-up images at once
- Batch Export: Export all registered images to DICOM, PNG, TIFF, or JPEG
- Reference Baseline: Lock baseline for longitudinal studies
- Measurement Tools: Distance and area measurements via right-click menu
- Registration Points Visualization: Up to 50 spatially distributed points with connecting lines
- Multiple Comparison Modes: Side-by-side, Overlay, Difference, Checkerboard, Split View
ophthalmic_registration/
├── core/
│ ├── image_data.py # Image data structures and metadata
│ └── exceptions.py # Custom exceptions
├── io/
│ ├── dicom_loader.py # DICOM image loading with metadata
│ ├── standard_loader.py # Standard format loading (PNG, TIFF, etc.)
│ └── image_io.py # Unified image I/O interface
├── preprocessing/
│ └── pipeline.py # Preprocessing pipeline (CLAHE, etc.)
├── registration/
│ ├── feature_aligner.py # Feature-based alignment (AKAZE, ORB, SIFT)
│ ├── sift_aligner.py # SIFT-specific alignment
│ └── registration_pipeline.py # Unified registration pipeline
├── measurement/
│ └── spatial.py # Spatial calibration and measurements
├── visualization/
│ └── comparison.py # Visualization and comparison tools
├── export/
│ └── output.py # Export utilities (DICOM, PNG, TIFF, JPEG)
├── gui/
│ ├── main_window.py # Main application window
│ ├── image_viewer.py # Image viewer with zoom/pan/measurements
│ ├── comparison_view.py # Multi-mode comparison widget
│ ├── controls_panel.py # Registration settings panel
│ ├── batch_registration.py # Batch registration dialog
│ ├── batch_export_dialog.py # Batch export dialog
│ ├── manual_registration.py # Manual 3-point registration
│ └── styles.py # Modern dark/light themes
└── utils/
└── logging_config.py # Logging configuration
pip install -r requirements.txtFor additional preprocessing options:
pip install scikit-image # For advanced filtersLaunch the graphical user interface:
python run_gui.py- Load Baseline: File → Open Baseline (Ctrl+O)
- Load Follow-up: File → Open Follow-up (Ctrl+Shift+O)
- Register: Click "Register" button or press Ctrl+R
- Compare: Switch to "Compare" tab to view results
- Export: File → Export Results (Ctrl+E)
Right-click on any image to access measurement tools:
- Measure → Distance: Click two points to measure distance
- Measure → Area: Click multiple points, double-click to complete polygon
- Measurements display in mm if DICOM pixel spacing is available
- Load baseline image
- Registration → Batch Registration (Ctrl+B)
- Select multiple follow-up images
- Process all at once
- Register one or more follow-up images
- Registration → Batch Export Registered Images (Ctrl+Shift+E)
- Choose format (DICOM, PNG, TIFF, JPEG)
- Select additional outputs (overlays, difference maps, reports)
from ophthalmic_registration import RegistrationPipeline, ImageLoader
# Load images
loader = ImageLoader()
baseline = loader.load("baseline_fundus.dcm")
followup = loader.load("followup_fundus.dcm")
# Register images
pipeline = RegistrationPipeline()
result, registered = pipeline.register_and_apply(baseline, followup)
# Export
from ophthalmic_registration import ExportManager
exporter = ExportManager(output_dir="./results")
exporter.export_registration_results(baseline, followup, registered, result)- Unified loading for DICOM and standard formats
- Automatic metadata extraction (pixel spacing, orientation)
- Intensity normalization for consistent processing
- Grayscale conversion
- CLAHE contrast enhancement
- Vessel enhancement filters
- Resolution normalization
- Feature-based: AKAZE, ORB, SIFT with RANSAC
- Supports: Translation, Euclidean, Affine, Homography motion models
- CLAHE preprocessing for cross-modality alignment
- Pixel-to-mm conversion using DICOM pixel spacing
- Distance and area measurements
- Displayed directly on image viewer
- DICOM export with metadata preservation
- Lossless formats: PNG, TIFF
- Lossy format: JPEG with quality control
- Overlay images, difference maps, transform JSON, reports
For research and clinical evaluation purposes.
Created by Li Fan, 2025
- AKAZE: Alcantarilla, P.F. et al. (2013). Fast Explicit Diffusion for Accelerated Features in Nonlinear Scale Spaces
- CLAHE: Zuiderveld, K. (1994). Contrast Limited Adaptive Histogram Equalization