OversightML Imagery IO
Flexible read/write for NITF, GeoTIFF, JPEG 2000, DTED, and more. Performant cloud-native tile access with no complex dependencies. Built in Rust for speed with Python APIs for easy integration with the latest ML frameworks and data science environments.
Why This Library
-
pip installand go — self-contained wheels with a Rust core and bundled codecs. No system libraries, no C toolchain, no conda. Minimal dependencies also mean a smaller attack surface and fewer packages to patch — a real consideration for production and security-sensitive deployments. -
Specification-compliant NITF read/write — supports all four IMODE interleave modes (B, P, R, S) and compression types including uncompressed, JPEG 2000, HTJ2K, and JPEG DCT — with masked variants for sparse imagery. An extensible, data-driven TRE parser ships with definitions for all publicly available Tagged Record Extensions, and Data Extension Segments are first-class objects you can read, create, and modify. SICD and SIDD SAR data are supported through the NITF implementation.
-
Cloud-native tile access that works with compressed data — existing Zarr codecs cannot decode compressed tiles from TIFF or JPEG 2000 files because they lack support for format-specific context like TIFF predictor metadata and JPEG 2000 multi-tile-part reassembly. This library provides custom Zarr v3 codecs that solve these problems, along with VirtualiZarr parsers and a scatter-gather filesystem for non-contiguous byte ranges — making the promise of virtual Zarr access work with real compressed geospatial imagery.
-
Simple when you want it, deep when you need it —
imread/imsave/tilesfor common tasks; full low-level API for format-specific control over segments, metadata, tiling, masks, and compression parameters.
What This Library is Not
This is not a library of image operations or photogrammetry routines — there are no orthorectification pipelines, pan-sharpening filters, or coordinate transforms here. The goal is to get pixels from geospatial imagery formats into a NumPy array as efficiently as possible so you can feed them into your ML framework, image processing toolkit, or analysis pipeline of choice.
Quick Start
pip install osml-imagery-io
from aws.osml.io import imread, imsave, iminfo, tiles
# Inspect metadata without reading pixels
info = iminfo("image.ntf")
print(info.metadata["RPC00B"]) # Rational polynomial coefficients
print(info.metadata["STDIDC"]) # Acquisition context
# Read an image as a NumPy array, careful this is the whole image
pixels = imread("image.ntf") # shape: (bands, height, width)
# Read a single windowed region, much more practical
chip = imread("image.ntf", window=(100, 200, 256, 256)) # (x, y, width, height)
# Save to any supported format — inferred from extension
imsave("output.tif", chip)
# Iterate over tiles for memory-efficient processing of large images
for tile in tiles("large_image.tif", tile_size=(256, 256)):
process(tile.data)
Full Format Access
The convenience functions cover common tasks. When you need to work with the format itself — multi-segment NITF files, TRE fields, block masks, resolution levels — the full API is there.
from aws.osml.io import IO
with IO.open("satellite_scene.ntf", "r") as dataset:
# Navigate all segments in the file
for key in dataset.get_asset_keys():
print(key) # "image:0", "image:1", "text:0", "des:0", ...
image = dataset.get_asset("image:0")
meta = image.metadata.entries()
# Rational polynomial coefficients for geopositioning
rpc = meta["RPC00B"]
# TODO: Use coefficients to construct sensor model ...
# Acquisition context — mission, pass, date
stdidc = meta["STDIDC"]
acq_date = stdidc["ACQ_DATE"]
mission = stdidc["MISSION"]
# Exploitation usability — GSD, sun angles, obliquity
use00a = meta["USE00A"]
gsd = use00a["MEAN_GSD"]
sun_el = use00a["SUN_EL"]
# Read a specific block at a reduced resolution level
block = image.get_block(4, 7, resolution_level=2)
The dataset model is inspired by the SpatioTemporal Asset Catalog (STAC) specification — each dataset maps to a STAC Item, assets map to STAC Assets with typed roles, and the structural alignment makes it straightforward to publish datasets as STAC Items.
Format Specific Features
NITF / NSIF
| Capability | Details |
|---|---|
| Versions | NITF 2.1, NSIF 1.0 |
| Compression Options (IC) | NC, NM (uncompressed/masked), C8, M8 (JPEG 2000), CD, MD (HTJ2K), C3, M3, I1 (JPEG DCT) |
| Interleave (IMODE) | B (band), P (pixel), R (row), S (sequential) |
| TRE parser | Data-driven with definitions for all publicly available TREs |
| Data Extensions | Read and write DES payloads (SICD/SIDD XML, TRE overflow, etc.) |
| Pixel types | 8/16/32-bit unsigned, 16/32-bit signed, 32/64-bit float, 32/64-bit complex |
| Block masks | Sparse imagery via masked compression modes (NM, M8, MD, M3) |
| Multi-segment | Multiple image, text, graphic, and data segments per file |
| Multi-file pyramids | R-set resolution pyramids across separate files |
TIFF / GeoTIFF / COG
| Capability | Details |
|---|---|
| Compression Options | Uncompressed, Deflate and LZW, — with horizontal differencing predictor |
| Tiling | Configurable tile dimensions (multiples of 16) |
| GeoKeys | OGC GeoTIFF 1.1 — CRS, pixel scale, tiepoints, affine transforms |
| COG | Cloud Optimized GeoTIFF with overview IFDs and correct NewSubfileType |
| Pixel types | 8/16/32-bit unsigned, 16/32-bit signed, 32/64-bit float |
DTED (Digital Terrain Elevation Data)
| Capability | Details |
|---|---|
| Levels | 0, 1, 2, ... |
| Pixel type | Single-band Int16 (signed-magnitude encoding) |
| Extensions | .dt0–.dt5, .avg, .min, .max |
| Datum | WGS84 horizontal, MSL (EGM96) vertical |
| Zarr codec | Overlap-aware edge trimming for seamless multi-cell mosaics |
Other Formats
JP2, JPEG, and PNG file formats are also supported for read and write. These lack robust metadata, but they appear frequently as interchange formats for tiles and quick-look products alongside NITF and GeoTIFF imagery.
Cloud-Native Access
Access tiles from NITF, TIFF, and JPEG 2000 files in S3 as virtual Zarr arrays — no format conversion needed. Generate a lightweight tile index once, and the Zarr / xarray / Dask ecosystem treats the file as a native chunked array.
The library provides three components that together make this work for real compressed geospatial data:
- VirtualiZarr parsers that scan NITF, TIFF, and JPEG 2000 files to build multi-resolution tile indexes (Kerchunk JSON/Parquet)
- Format-aware Zarr v3 codecs that handle the decoding problems standard codecs cannot — NITF endian swap and interleave conversion, JPEG 2000 tile-part reconstruction from non-contiguous byte ranges, TIFF predictor reversal using metadata from outside the tile data, and DTED boundary-post trimming for seamless multi-cell elevation mosaics without preprocessing
- MultiReferenceFileSystem — an fsspec extension that adds scatter-gather I/O for JPEG 2000 codestreams where a single tile's data is scattered across multiple non-contiguous locations in the file (common with RLCP/RPCL progression orders in satellite imagery)
Multi-resolution pyramids follow the GeoZarr multiscales convention being developed by the OGC GeoZarr Standards Working Group.
from aws.osml.io.virtualizarr_parsers import OversightMLParser, write_tile_index
# Build a tile index (works for NITF, TIFF, JPEG 2000)
parser = OversightMLParser(local_paths="image.ntf")
store = parser(url="s3://my-bucket/imagery/image.ntf")
write_tile_index(store, "image.ntf.tile_index.json")
import zarr
from aws.osml.io.multi_reference_fs import MultiReferenceFileSystem
from zarr.storage._fsspec import FsspecStore
# Open tiles directly from S3 — only fetches the bytes you need
fs = MultiReferenceFileSystem(
fo="s3://my-bucket/imagery/image.ntf.tile_index.json",
asynchronous=True,
remote_options={"asynchronous": True},
skip_instance_cache=True,
)
store = FsspecStore(fs=fs, read_only=True, path="")
root = zarr.open_group(store, mode="r", zarr_format=2)
tile = root["0/data"][0:3, 768:1024, 1024:1280]
See the Cloud Imagery Access guide for the full workflow.
Documentation
Full documentation is published at awslabs.github.io/osml-imagery-io.
- Getting Started — install, read, write, tile in a few lines
- User Guide — datasets, metadata, block access, writing, cloud access
- API Reference — full Python API documentation
- Design Documents — architecture and design decisions
Development
conda env create -f environment.yml
conda activate osml-imagery-io-dev
source scripts/setup-dev-env.sh
maturin develop
pytest
cargo test
See CONTRIBUTING.md for details.
Security
Please do not open a public GitHub issue to report security concerns. Follow the reporting mechanisms described in SECURITY.
License
This project is licensed under the Apache 2.0 License. See the LICENSE file.
Metadata
Release files for osml-imagery-io 0.2.2
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| osml_imagery_io-0.2.2.tar.gz | 8.5 MB | Details |
Built distributions (wheels)
| File | Reset | |||
|---|---|---|---|---|
| osml_imagery_io-0.2.2-cp39-abi3-manylinux_2_28_x86_64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ x86-64 | Details |
| osml_imagery_io-0.2.2-cp39-abi3-manylinux_2_28_aarch64.whl | CPython 3.9 | abi3 | Linux glibc 2.28+ ARM64 | Details |
| osml_imagery_io-0.2.2-cp39-abi3-macosx_11_0_arm64.whl | CPython 3.9 | abi3 | macOS 11.0+ ARM64 | Details |
| osml_imagery_io-0.2.2-cp39-abi3-macosx_10_12_x86_64.whl | CPython 3.9 | abi3 | macOS 10.12+ x86-64 | Details |
Total release size: 19.7 MB
Release files / osml_imagery_io-0.2.2.tar.gz
| Download URL | osml_imagery_io-0.2.2.tar.gz |
|---|---|
| Size | 8.5 MB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
9ef7d602a8d6afeb46619ec355c3f5001de9f47716a81fbc2fc020a28dbf71fc
|
|
BLAKE2b-256 checksum How to use checksums |
b8b5558d8e40ccab6b5e8900427fe5dc6bb9e70690461a6a994050177aefb1b2
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / osml_imagery_io-0.2.2-cp39-abi3-manylinux_2_28_x86_64.whl
| Download URL | osml_imagery_io-0.2.2-cp39-abi3-manylinux_2_28_x86_64.whl |
|---|---|
| Size | 3.1 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ x86-64 abi3 |
|
SHA-256 checksum How to use checksums |
61903791f949286965c1cd3da09762408070c52553107945d606951f75ce65b3
|
|
BLAKE2b-256 checksum How to use checksums |
02085baba325337bcdec2359cd18ecb320aadbd84801a3d24c6c85998a6728c6
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / osml_imagery_io-0.2.2-cp39-abi3-manylinux_2_28_aarch64.whl
| Download URL | osml_imagery_io-0.2.2-cp39-abi3-manylinux_2_28_aarch64.whl |
|---|---|
| Size | 2.9 MB |
| Tags | CPython 3.9 Linux glibc 2.28+ ARM64 abi3 |
|
SHA-256 checksum How to use checksums |
1a19920725924a7bfc838b7912eb50fdeac1432332433c88f942a666f3f43ed9
|
|
BLAKE2b-256 checksum How to use checksums |
4046b1e5fd5a0fd62aa02aa408958162507aedd4ec965f791d365691330cc0cd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / osml_imagery_io-0.2.2-cp39-abi3-macosx_11_0_arm64.whl
| Download URL | osml_imagery_io-0.2.2-cp39-abi3-macosx_11_0_arm64.whl |
|---|---|
| Size | 2.4 MB |
| Tags | CPython 3.9 abi3 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
c2625fc6f9ba0f4dc478ee2b43847dda9ec9b722eb2e305802ece64cd0ff162c
|
|
BLAKE2b-256 checksum How to use checksums |
f7f4bfdf332c896dc683558487e79cc152a823a8f2e98e4fc0d66249be273bba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency logRelease files / osml_imagery_io-0.2.2-cp39-abi3-macosx_10_12_x86_64.whl
| Download URL | osml_imagery_io-0.2.2-cp39-abi3-macosx_10_12_x86_64.whl |
|---|---|
| Size | 2.7 MB |
| Tags | CPython 3.9 abi3 macOS 10.12+ x86-64 |
|
SHA-256 checksum How to use checksums |
8d3b99ed38480e53d99435cff2f94e8a02c860eb91201185b8a72ab879e7fe05
|
|
BLAKE2b-256 checksum How to use checksums |
797789bf99a535d4154d1c66b5465c503df09e2769dffbadf2eb455cd70e3d88
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/7.0.0 CPython/3.13.14
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Sep 21, 2026.
Transparency log