A hands-on, module-by-module portfolio of image-processing techniques applied to Sentinel-2 satellite imagery — built to demonstrate practical geospatial and remote-sensing skills in Python, from raster fundamentals up to full analysis workflows.
Each module is a self-contained folder of small, well-documented scripts. Shared
logic lives in a reusable utils/ package, so the codebase stays clean as it
grows. Built with rasterio, numpy, and matplotlib.
- Geospatial data handling — reading and writing georeferenced rasters (GeoTIFF), preserving CRS and affine transforms, and interpreting metadata.
- Remote-sensing fundamentals — multi-band imagery, spectral bands, true-colour composites, and spectral indices such as NDVI.
- Image processing — contrast enhancement, filtering, edge detection, morphology, and segmentation (progressively added across modules).
- Clean software practices — modular structure, a shared utilities package to avoid code duplication, per-module documentation, and reproducible outputs.
| # | Module | Status |
|---|---|---|
| 01 | Image Basics | ✅ Done |
| 02 | Image Enhancement | 🚧 Planned |
| 03 | Image Filtering | 🚧 Planned |
| 04 | Edge Detection | 🚧 Planned |
| 05 | Morphological Operations | 🚧 Planned |
| 06 | Image Segmentation | 🚧 Planned |
| 07 | Feature Extraction | 🚧 Planned |
| 08 | Remote Sensing Applications | 🚧 Planned |
remote-sensing-image-processing/
├── data/
│ └── sample/sentinel2.tif # sample Sentinel-2 scene (multi-band GeoTIFF)
├── utils/
│ ├── __init__.py
│ └── raster_io.py # shared helpers: read, stretch, save PNG/GeoTIFF
├── modules/
│ ├── 01_image_basics/ # each module is a folder of scripts + a README
│ ├── 02_image_enhancement/
│ ├── 03_image_filtering/
│ ├── 04_edge_detection/
│ ├── 05_morphological_operations/
│ ├── 06_image_segmentation/
│ ├── 07_feature_extraction/
│ └── 08_remote_sensing_applications/
├── outputs/ # generated images/rasters (git-ignored)
├── requirements.txt
├── .gitignore
└── README.md
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txtrasterio bundles its own GDAL via pip wheels, so no separate GDAL install is
needed on most systems.
Run any script directly; each takes an optional image path and otherwise falls
back to the sample scene. Generated files are written to outputs/.
python modules/01_image_basics/03_display_rgb_image.py
python modules/01_image_basics/06_save_processed_image.py path/to/your.tifThe repo is organised so that adding a new technique is always the same small, predictable step:
- Modular layout. Every topic lives in its own numbered folder under
modules/, each with a short README explaining the concept and listing its scripts. Numbering keeps the learning path in order and easy to browse. - Shared utilities. Reusable logic — opening rasters, percentile contrast
stretching, and saving PNGs and georeferenced GeoTIFFs — lives once in
utils/raster_io.py. Scripts import from it (from utils import ...) instead of repeating boilerplate, which keeps each script short and focused on the technique it demonstrates. - Reproducible outputs. Scripts read from a sample scene by default and write
results to
outputs/, which is git-ignored so generated files never clutter the repository. - Consistent script pattern. Every script accepts an optional image path, documents its assumptions (e.g. band ordering), and can be run standalone.
To add a module: create the next numbered folder, drop in scripts that import
from utils, write a short module README, and flip its row in the progress
table above.
Sentinel-2 stacks don't have a universal band order. Scripts that need specific
bands declare them as constants at the top (e.g. RED_BAND, NIR_BAND); adjust
these to match your file. Run modules/01_image_basics/02_image_metadata.py
first to confirm your band count and order.
Python · rasterio · NumPy · matplotlib
MIT