Coregix provides pairwise raster coregistration for geospatial imagery.
Coregix coregisters a source raster to a reference raster while preserving geospatial metadata and multi-band outputs. By default, it estimates a translation followed by a rigid transform using mutual-information optimization, then applies the resulting transform to produce a coregistered GeoTIFF.
Current scope:
- pairwise GeoTIFF coregistration CLI and Python API
- edge-proxy registration for cross-sensor structural alignment
- chunked transform application for large source rasters
- optional postprocess trimming of invalid edge artifacts
conda env create -f environment.yml
conda activate coregixThis installs the runtime stack and the package in editable mode.
pip install -e .The installed CLI entrypoint is:
align-image-pair --helpYou can also run the module directly:
python -m coregix.cli.align_image_pair --helpBuild the image from the repository root:
docker build -t coregix .Release images are published to Docker Hub as iosefa/coregix.
Run the CLI with a mounted data directory:
docker run --rm \
-v "$PWD:/data" \
iosefa/coregix:latest \
--moving-image /data/source.tif \
--fixed-image /data/reference.tif \
--output-image /data/aligned.tifIf you built the image locally, use coregix instead of iosefa/coregix:latest.
align-image-pair \
--moving-image /path/to/source.tif \
--fixed-image /path/to/reference.tif \
--output-image /path/to/aligned.tifBy default this:
- registers on edge-proxy images
- writes the result on the source-raster grid
- uses no chunking (
--split-factor 0)
--split-factor controls chunked transform application as 2^k total chunks:
0: no split1: halves2: quadrants3: octants
Example with quadrants:
align-image-pair \
--moving-image /path/to/source_large.tif \
--fixed-image /path/to/reference.tif \
--output-image /path/to/aligned_large.tif \
--split-factor 2--solve-resolutions runs multiple registration solves from coarse to fine,
then writes the final raster once from the original source image. Use 0 for
the reference-raster/native solve resolution.
--solve-resolution is deprecated and remains available for single-pass
compatibility. Prefer --solve-resolutions, even for one solve.
align-image-pair \
--moving-image /path/to/source_large.tif \
--fixed-image /path/to/reference.tif \
--output-image /path/to/aligned_large.tif \
--split-factor 2 \
--solve-resolutions 8,4,0.5--trim-edge-invalid runs a raster-space cleanup pass after alignment and sets edge artifacts to nodata.
Example:
align-image-pair \
--moving-image /path/to/source_large.tif \
--fixed-image /path/to/reference.tif \
--output-image /path/to/aligned_large_edgefixed.tif \
--split-factor 2 \
--trim-edge-invalid \
--edge-trim-depth 8 \
--edge-trim-invalid-below -3000The edge-trim thresholds are dataset-specific. --edge-trim-invalid-below is useful when interpolation artifacts are not equal to the dataset nodata value.
from coregix import align_image_pair
result = align_image_pair(
moving_image_path="/path/to/source.tif",
fixed_image_path="/path/to/reference.tif",
output_image_path="/path/to/aligned.tif",
)
print(result.output_image_path)from coregix import align_image_pair
result = align_image_pair(
moving_image_path="/path/to/source_large.tif",
fixed_image_path="/path/to/reference.tif",
output_image_path="/path/to/aligned_large_edgefixed.tif",
split_factor=2,
trim_edge_invalid=True,
edge_trim_depth=8,
edge_trim_invalid_below=-3000,
)
print(result.output_image_path)split_factorchanges only transform application, not the registration model.split_factor=2is the direct replacement for the previous quadrant-based large-raster path.- If needed, you can select separate registration bands with
moving_band_indexandfixed_band_indexin Python or--moving-band-indexand--fixed-band-indexin the CLI.