UAV Ortho Color Balancing in PCI

Ortho Color balancing for large UAV ortho mosaics can be a challenging task. Usually you start to get into troubles when illumination conditions are quickly changing – at sub-optimal conditions with clouds  and low illumination condition in spring or autumn.  color balancing in Agisoft does a good job but sometime we need more – here a hot spot correction and global adaption is sometimes needed. PCIs Orthoengine does a great job here.

This is a small python script that uses the ortho corrected geotiff files from Agisoft and applies a local and global correction.


1. Head section of a Python PCI script

Here we  load some PCI libraries.

print ""
print "***************************************************************"
print ""
print " -= SHESE 4 hainich ortho processing =-"
print " workflow"
print " Last modified 24112018"
print ""
print "***************************************************************"
# This script runs the following PPFs in a top-down sequence and generates a 
# ortho mosaic based on the input ortho images exported from AGISOFT Photoscan.
# All orthos must have the same georef and resolution. 
# 1. mosrep
# 2. mosdef
# 3. mosrun
import sys 
import os
import pci
import fnmatch
from import *
from pci.lut import *
from pci.fimport import fimport
from pci.pcimod import pcimod
from pci.model import model
from pci.exceptions import *
from pci.ortho import ortho
from pci.mosprep import mosprep
from pci.mosdef import mosdef
from pci.mosrun import mosrun
from pci.exceptions import PCIException
The comments are defined using a hash sign - you can also put these comments directly behind any coded line

2. The xml section of the script that defines the processing parameters

where xml files are defined – you usually want that from the user and not hard coded into your script – so f.e. using the following expression the user would have to start the script by typing:

python pythonscriptname /dir/where/the/files/are

to start the script and to include the “InFolder” string (in this example). We later use “InFolder” to place the string into pathname.

mfile = r"W:\work-hainich\Hainich08-2018\exported-orthofiles"
silfile = r"W:\work-hainich\Hainich08-2018\exported-orthofiles\mosaic.xml"
nodatval = [0]
normaliz = "HotSpot" #HotSpot method often useful for airphoto imagery
balspec = "BUNDLE"
cutmthd = "minsqdiff"

 mosprep(mfile, silfile, nodatval, "", normaliz,
 balspec, "", "", [], cutmthd)
except PCIException, e:
 print e
except Exception, e:
 print e

## Create Mosaic Definition XML file to
silfile = r"W:\work-hainich\Hainich08-2018\exported-orthofiles\mosaic.xml"
mdfile = r"W:\work-hainich\Hainich08-2018\exported-orthofiles\mosaicdef.xml"
dbic = [1,2,3]
tispec = ""
tipostrn = ""
mapunits= "UTM 32 D000"
pxszout= [0.03]
blend = [5]
nodata = [0]
ftype = "PIX"
foptions = ""
 mosdef(silfile, mdfile, dbic, tispec, tipostrn, mapunits, pxszout, blend, nodata, ftype, foptions)
except PCIException, e:
 print e
except Exception, e:
 print e

## Finally create the full resolution mosaic
outdir = r"W:\work-hainich\Hainich08-2018\exported-orthofiles"
crsrcmap = ""

 mosrun(silfile, mdfile, outdir, "", crsrcmap,
 "", "", "", "BILIN")
except PCIException, e:
 print e
except Exception, e:
 print e