Drone Image Processing (Photogrammetry)

SOP-L805 Revision 0.1
Author

Marc Los Huertos

EA Program, Pomona College

Published

2026-06-26

1 Purpose

This SOP describes the post-processing workflow for aerial imagery collected by uncrewed aerial systems (UAS/drones). It covers image organization, photogrammetric reconstruction (orthomosaics, digital surface models, and point clouds), ground control point integration, accuracy assessment, and data archiving (Anderson & Gaston, 2013; Iglhaut et al., 2019).

2 Scope

  • Applies to: Photogrammetric processing of RGB, multispectral, and thermal drone imagery collected for EA Program research
  • Does not apply to: Drone flight planning, airspace authorization, or FAA Part 107 compliance (covered in the drone operations field SOP); GIS analysis of processed outputs (see SOP-L804)
  • Location: EA Program laboratory (SGM 133) and processing workstations

3 Responsibilities

Role Responsibility
Lab PI Approve processing workflows; ensure data storage compliance
Drone Pilot / Operator Deliver organized imagery with flight logs; place and survey GCPs
Processing Analyst Run photogrammetric software; assess quality; archive outputs
Data Reviewer Verify accuracy metrics before outputs are used in analysis

4 Definitions

  • Digital elevation model (DEM): A raster representing bare-ground surface elevation; derived by removing vegetation and structures from a digital surface model using filtering algorithms.
  • Digital surface model (DSM): A raster representing the elevation of all surfaces in the scene, including vegetation canopy and structures; the direct output of photogrammetric point cloud processing.
  • Ground control point (GCP): A precisely surveyed point on the ground (surveyed with RTK-GPS or total station) that appears in multiple overlapping images; used to georeference the photogrammetric model to a known coordinate system and improve absolute accuracy.
  • Orthomosaic: A geometrically corrected aerial image composed of many overlapping individual photos, in which scale is uniform and features can be measured accurately; produced by photogrammetric processing.
  • Photogrammetry: The science of making measurements from photographs; in drone operations, the process of generating 3D models, DEMs, and orthomosaics from overlapping aerial images using structure-from-motion algorithms.
  • Point cloud: A set of data points in 3D space (X, Y, Z coordinates) representing the surface of objects; generated by photogrammetric processing of overlapping images; the intermediate product from which DEMs and DSMs are derived.
  • Structure from Motion (SfM): A photogrammetric algorithm that reconstructs 3D geometry from 2D overlapping images by identifying and matching common features across multiple images; the computational core of drone photogrammetry software (Agisoft Metashape, Pix4D).

5 Safety and Hazards

WarningHazards

Photogrammetric processing is computationally intensive but poses no physical hazards. However, extended processing sessions may generate significant heat from workstation components. Ensure adequate ventilation around processing workstations.

For field-related hazards during drone operations and GCP placement, refer to SOP-F001 Field Safety.

6 Equipment and Materials

6.1 Software

Item Access Notes
Agisoft Metashape Professional Campus license Primary photogrammetry tool
OpenDroneMap (ODM) Free / open source Alternative processing
WebODM Self-hosted Browser interface for ODM
QGIS (3.x) Free download Visualization and QC
R with terra / sf RStudio Server Post-processing analysis
CloudCompare Free download Point cloud inspection

6.2 Hardware

Item Minimum Specs Notes
Processing workstation 32 GB RAM, dedicated GPU, SSD More RAM for large datasets
External storage 2 TB+ portable SSD Raw image archive

6.3 Drone Platforms

Platform Sensor Resolution
DJI Mavic 3 Enterprise RGB (Hasselblad) 20 MP; 0.7 cm/px at 100 m
DJI Matrice 350 RTK Zenmuse P1 / L2 High-res RGB or LiDAR
Custom multispectral rig MicaSense RedEdge-P 5-band multispectral

7 Procedure

7.1 Image Organization

Before processing, organize raw imagery following a consistent directory structure:

project_name/
├── drone/
│   ├── raw_images/
│   │   ├── flight_2026-05-21_rgb/
│   │   │   ├── DJI_0001.JPG
│   │   │   ├── DJI_0002.JPG
│   │   │   └── ...
│   │   └── flight_2026-05-21_multi/
│   ├── flight_logs/
│   │   └── flight_2026-05-21.csv
│   ├── gcp/
│   │   └── gcp_coordinates.csv
│   ├── processed/
│   │   ├── orthomosaic/
│   │   ├── dsm/
│   │   ├── point_cloud/
│   │   └── report/
│   └── README.md

Check that all images have valid EXIF data (GPS coordinates, camera parameters). Remove obviously corrupted or blurry images before processing.

Code
library(exifr)

# Read EXIF from all images in a flight folder
exif_data <- read_exif(
  list.files("drone/raw_images/flight_2026-05-21_rgb/",
             pattern = "\\.JPG$", full.names = TRUE),
  tags = c("FileName", "GPSLatitude", "GPSLongitude",
           "GPSAltitude", "FocalLength", "ImageWidth",
           "ImageHeight", "DateTimeOriginal")
)

# Check for missing GPS
missing_gps <- exif_data %>%
  filter(is.na(GPSLatitude) | is.na(GPSLongitude))
cat(sprintf("%d images missing GPS coordinates\n", nrow(missing_gps)))

# Summary
cat(sprintf("Total images: %d\n", nrow(exif_data)))
cat(sprintf("Date range: %s to %s\n",
            min(exif_data$DateTimeOriginal),
            max(exif_data$DateTimeOriginal)))

7.2 Ground Control Points (GCPs)

GCPs are surveyed reference points used to improve the geometric accuracy of photogrammetric outputs.

  1. Place GCPs before the flight. Use high-contrast targets (black and white checkerboard, minimum 30 cm) visible from flight altitude
  2. Survey GCP positions using a differential GPS or RTK receiver. Record coordinates in WGS 84 (EPSG:4326) and a local projected CRS (e.g., EPSG:26911)
  3. Format GCP data as a CSV file:
gcp_id,longitude,latitude,elevation_m,crs
GCP01,-117.7123,34.0966,398.2,EPSG:4326
GCP02,-117.7118,34.0971,401.5,EPSG:4326
  1. Use a minimum of 5 GCPs distributed across the study area. Reserve 2 or more as independent check points for accuracy assessment

7.3 Photogrammetric Processing (Agisoft Metashape)

The following workflow applies to Agisoft Metashape Professional. Adapt parameters for your specific project needs.

Step 1: Create project and import photos

  1. Create a new Metashape project and save to drone/processed/
  2. Add photos from the flight folder
  3. Verify camera positions on the reference pane

Step 2: Align photos

  1. Workflow > Align Photos
  2. Settings: Accuracy = High; Key point limit = 40,000; Tie point limit = 10,000; Adaptive camera model fitting = enabled
  3. Review the sparse point cloud and camera positions

Step 3: Import and assign GCPs

  1. Import GCP coordinates from the CSV file
  2. Assign each GCP to its corresponding target in at least 3 photos
  3. Uncheck GCPs designated as check points
  4. Run Optimize Cameras

Step 4: Build dense point cloud

  1. Workflow > Build Point Cloud
  2. Quality = High (or Medium for initial assessment); Depth filtering = Moderate
  3. Inspect the dense cloud for artifacts; remove obvious noise manually or with CloudCompare

Step 5: Build DEM and orthomosaic

  1. Workflow > Build DEM (Source: Point Cloud)
  2. Workflow > Build Orthomosaic (Surface: DEM; Blending mode: Mosaic)

Step 6: Export products

  1. Export DEM as GeoTIFF to drone/processed/dsm/
  2. Export orthomosaic as GeoTIFF to drone/processed/orthomosaic/
  3. Export point cloud as .laz to drone/processed/point_cloud/
  4. Export processing report as PDF to drone/processed/report/
TipTip

For large datasets (more than 1,000 images), process on the lab workstation rather than a laptop. Expect processing times of several hours for dense cloud generation at High quality.

7.4 OpenDroneMap (Alternative Workflow)

For projects using the open-source pipeline:

Code
# Run ODM with standard settings
docker run -ti --rm \
  -v /path/to/project/drone:/datasets \
  opendronemap/odm \
  --project-path /datasets \
  --dsm \
  --orthophoto-resolution 2.0 \
  --dem-resolution 5.0 \
  --gcp /datasets/gcp/gcp_list.txt

7.5 Accuracy Assessment

Evaluate positional accuracy using the reserved check points:

Code
library(terra)
library(sf)

# Load the DSM
dsm <- rast("drone/processed/dsm/dsm_2026-05-21.tif")

# Load check points
check_pts <- read_csv("drone/gcp/check_points.csv") %>%
  st_as_sf(coords = c("longitude", "latitude"), crs = 4326) %>%
  st_transform(crs = crs(dsm))

# Extract DSM elevation at check points
check_pts$dsm_elev <- extract(dsm, check_pts)$value

# Calculate vertical RMSE
check_pts <- check_pts %>%
  mutate(error_m = dsm_elev - elevation_m)

rmse_z <- sqrt(mean(check_pts$error_m^2, na.rm = TRUE))
mae_z <- mean(abs(check_pts$error_m), na.rm = TRUE)

cat(sprintf("Vertical RMSE: %.3f m\n", rmse_z))
cat(sprintf("Vertical MAE:  %.3f m\n", mae_z))
cat(sprintf("n check points: %d\n", nrow(check_pts)))

Report accuracy metrics in all publications and project reports. Typical targets for environmental applications: horizontal RMSE less than 2 times the ground sampling distance (GSD); vertical RMSE less than 3 times the GSD (James et al., 2017).

7.6 Multispectral Processing

For multispectral imagery (e.g., MicaSense RedEdge):

  1. Include reflectance calibration panel images (taken before and after each flight)
  2. Process each band alignment in Metashape or use MicaSense’s Atlas or micasense Python library
  3. Export calibrated reflectance orthomosaics (not raw DN values)
  4. Calculate vegetation indices in R:
Code
library(terra)

# Load calibrated reflectance bands
red <- rast("drone/processed/orthomosaic/red_reflectance.tif")
nir <- rast("drone/processed/orthomosaic/nir_reflectance.tif")

# Calculate NDVI
ndvi <- (nir - red) / (nir + red)
names(ndvi) <- "NDVI"

writeRaster(ndvi, "drone/processed/orthomosaic/ndvi_2026-05-21.tif",
            overwrite = TRUE)

8 Quality Control and Acceptance Criteria

  • Photo alignment: at least 90% of images must align successfully
  • Reprojection error: mean below 1.0 pixel after GCP optimization
  • Check point RMSE: document and compare against project requirements
  • Visual inspection: no visible seam lines, ghosting, or geometric distortion in the orthomosaic
  • File integrity: verify that all exported GeoTIFFs have valid CRS headers and correct extent

9 Waste Disposal

Not applicable (computational procedure).

10 References

Anderson, K., & Gaston, K. J. (2013). Lightweight unmanned aerial vehicles will revolutionize spatial ecology. Frontiers in Ecology and the Environment, 11(3), 138–146. https://doi.org/10.1890/120150
Iglhaut, J., Cabo, C., Puliti, S., Piermattei, L., O’Connor, J., & Rosette, J. (2019). Structure from motion photogrammetry in forestry: A review. Current Forestry Reports, 5(3), 155–168. https://doi.org/10.1007/s40725-019-00094-3
James, M. R., Robson, S., d’Oleire-Oltmanns, S., & Niethammer, U. (2017). Optimising UAV topographic surveys processed with structure-from-motion: Ground control quality, quantity and bundle adjustment. Geomorphology, 280, 51–66. https://doi.org/10.1016/j.geomorph.2016.11.021

11 Training Record

Training is documented in the EA Program training log. Before processing drone imagery independently, personnel must:

  1. Read this SOP in full
  2. Complete Agisoft Metashape (or ODM) training with a supervised practice dataset
  3. Demonstrate a complete processing workflow from raw images to accuracy-assessed outputs
  4. Be signed off by the PI or drone operations lead

12 Appendix A: Processing Parameter Reference

Parameter Low Quality Medium High (Recommended)
Photo alignment Low accuracy Medium High
Dense cloud Low Medium High
DEM resolution 10x GSD 5x GSD 2x GSD
Orthomosaic 10x GSD 5x GSD Native GSD
Approx. processing time (500 images) 30 min 2 hr 6 hr+

13 Appendix B: Troubleshooting

Symptom Probable Cause Corrective Action
Low alignment rate (<80%) Insufficient overlap Re-fly with 80%+ front/side overlap
High reprojection error Incorrect GCP placement Re-identify GCP markers in photos
Artifacts in orthomosaic Moving objects (water, cars) Mask affected areas; adjust blending
Out-of-memory error Dataset too large for RAM Reduce quality; split into chunks
DSM shows “doming” distortion No GCPs; insufficient geometry Add GCPs; increase flight line diversity