An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data
- Free software: GNU General Public License v3
- Documentation: http://danschef.gitext.gfz-potsdam.de/arosics/doc/
- The (open-access) paper corresponding to this software repository can be found here:
Scheffler D, Hollstein A, Diedrich H, Segl K, Hostert P. AROSICS: An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data. Remote Sensing. 2017; 9(7):676.
Status
See also the latest coverage report.
Description
Perform automatic subpixel co-registration of two satellite image datasets based on an image matching approach working in the frequency domain, combined with a multistage workflow for effective detection of false-positives. Python implementation by Daniel Scheffler (daniel.scheffler [at] gfz-potsdam [dot] de).
AROSICS detects and corrects local as well as global misregistrations between two input images in the subpixel scale, that are often present in satellite imagery.
Prerequisites and hints: The input images can have any GDAL compatible image format. Both of them must be approximately geocoded. In case of ENVI files, this means they must have a 'map info' and a 'coordinate system string' as attributes of their header file. The input images must have a geographic overlap but clipping them to same geographical extent is NOT neccessary. Please do not perform any spatial resampling of the input images before applying this algorithm. Any needed resampling of the data is done automatically. Thus, the input images may have different spatial resolutions. The current algorithm will not perform any ortho-rectification. So please use ortho-rectified input data in order to minimize local shifts in the input images.
AROSICS supports local and global co-registration.
-
Local co-registration:
A dense grid of tie points is automatically computed, whereas tie points are subsequently validated using a multistage workflow. Only those tie points not marked as false-positives are used to compute the parameters of an affine transformation. Warping of the target image is done using an appropriate resampling technique (cubic by default). -
Global co-registration:
Only a global X/Y translation is computed within a small subset of the input images (window position is adjustable). This allows very fast co-registration but only corrects for translational (global) X/Y shifts. The calculated subpixel-shifts are (by default) applied to the geocoding information of the output image. No spatial resampling is done automatically as long as both input images have the same projection. If you need the output image to be aligned to the reference image coordinate grid (by using an appropriate resampling algorithm), use the '-align_grids' option.
AROSICS is designed to robustly handle the typical difficulties of multi-sensoral/multi-temporal images. Clouds are automatically handled by the implemented outlier detection algorithms. The user may provide user-defined masks to exclude certain image areas from tie point creation. The image overlap area is automatically calculated. Thereby, no-data regions within the images are automatically respected. Providing the map coordinates of the actual data corners lets you save some calculation time, because in this case the automatic algorithm can be skipped. The no-data value of each image is automatically derived from the image corners. The verbose program mode gives some more output about the interim results, shows some figures and writes the used footprint and overlap polygons to disk. Note, that maybe the figures must be manually closed in in order to continue the processing (depending on your Python configuration).
For further details regarding the implemented algorithm, example use cases, quality assessment and benchmarks refer to the above mentioned paper (Scheffler et al. 2017).
Installation
Use the pip installer:
pip install arosics
- Or clone the repository via GIT and update the PATH environment variable:
cd /your/installation/folder
git clone https://gitext.gfz-potsdam.de/danschef/arosics.git
git clone https://gitext.gfz-potsdam.de/danschef/geoarray.git
git clone https://gitext.gfz-potsdam.de/danschef/py_tools_ds.git
PATH=$PATH:/path/to/your/installation/folder/arosics:/path/to/your/installation/folder/geoarray:/path/to/your/installation/folder/py_tools_ds
AROSICS has been tested with Python 3.4+ and Python 2.7. It should be fully compatible to all Python versions above 2.7.
Modules
CoReg
This module calculates spatial shifts and performs a global correction (based on a single matching window).
Python Interface
calculate spatial shifts - with input data on disk
from arosics import COREG
#im_reference = '/path/to/your/ref_image.bsq'
#im_target = '/path/to/your/tgt_image.bsq'
CR = COREG(im_reference, im_target, wp=(354223, 5805559), ws=(256,256))
CR.calculate_spatial_shifts()
Calculating actual data corner coordinates for reference image...
Corner coordinates of reference image:
[[319090.0, 5790510.0], [351800.0, 5899940.0], [409790.0, 5900040.0], [409790.0, 5790250.0], [319090.0, 5790250.0]]
Calculating actual data corner coordinates for image to be shifted...
Corner coordinates of image to be shifted:
[[319460.0, 5790510.0], [352270.0, 5900040.0], [409790.0, 5900040.0], [409790.0, 5790250.0], [319460.0, 5790250.0]]
Matching window position (X,Y): 354223/5805559
Detected integer shifts (X/Y): 0/-2
Detected subpixel shifts (X/Y): 0.357885632465/0.433837319984
Calculated total shifts in fft pixel units (X/Y): 0.357885632465/-1.56616268002
Calculated total shifts in reference pixel units (X/Y): 0.357885632465/-1.56616268002
Calculated total shifts in target pixel units (X/Y): 0.357885632465/-1.56616268002
Calculated map shifts (X,Y): 3.578856324660592 15.661626799963415
Original map info: ['UTM', 1, 1, 300000.0, 5900040.0, 10.0, 10.0, 33, 'North', 'WGS-84']
Updated map info: ['UTM', 1, 1, '300003.57885632466', '5900055.6616268', 10.0, 10.0, 33, 'North', 'WGS-84']
calculate spatial shifts - without any disk access
from geoarray import GeoArray
from arosics import COREG
im_reference = '/path/to/your/ref_image.bsq'
im_target = '/path/to/your/tgt_image.bsq'
# get a sample numpy array with corresponding geoinformation as reference image
geoArr = GeoArray(im_reference)
ref_ndarray = geoArr[:] # numpy.ndarray with shape (10980, 10980)
ref_gt = geoArr.geotransform # GDAL geotransform: (300000.0, 10.0, 0.0, 5900040.0, 0.0, -10.0)
ref_prj = geoArr.projection # projection as WKT string ('PROJCS["WGS 84 / UTM zone 33N....')
# get a sample numpy array with corresponding geoinformation as target image
geoArr = GeoArray(im_target)
tgt_ndarray = geoArr[:] # numpy.ndarray with shape (10980, 10980)
tgt_gt = geoArr.geotransform # GDAL geotransform: (300000.0, 10.0, 0.0, 5900040.0, 0.0, -10.0)
tgt_prj = geoArr.projection # projection as WKT string ('PROJCS["WGS 84 / UTM zone 33N....')
# pass an instance of GeoArray to COREG and calculate spatial shifts
geoArr_reference = GeoArray(ref_ndarray, ref_gt, ref_prj)
geoArr_target = GeoArray(tgt_ndarray, tgt_gt, tgt_prj)
CR = COREG(geoArr_reference, geoArr_target, wp=(354223, 5805559), ws=(256,256))
CR.calculate_spatial_shifts()
Calculating actual data corner coordinates for reference image...
Corner coordinates of reference image:
[[300000.0, 5848140.0], [409790.0, 5848140.0], [409790.0, 5790250.0], [300000.0, 5790250.0]]
Calculating actual data corner coordinates for image to be shifted...
Corner coordinates of image to be shifted:
[[300000.0, 5847770.0], [409790.0, 5847770.0], [409790.0, 5790250.0], [300000.0, 5790250.0]]
Matching window position (X,Y): 354223/5805559
Detected integer shifts (X/Y): 0/-2
Detected subpixel shifts (X/Y): 0.357885632465/0.433837319984
Calculated total shifts in fft pixel units (X/Y): 0.357885632465/-1.56616268002
Calculated total shifts in reference pixel units (X/Y): 0.357885632465/-1.56616268002
Calculated total shifts in target pixel units (X/Y): 0.357885632465/-1.56616268002
Calculated map shifts (X,Y): 3.578856324660592/15.661626799963415
Calculated absolute shift vector length in map units: 16.065328089207995
Calculated angle of shift vector in degrees from North: 192.8717191970359
Original map info: ['UTM', 1, 1, 300000.0, 5900040.0, 10.0, 10.0, 33, 'North', 'WGS-84']
Updated map info: ['UTM', 1, 1, '300003.57885632466', '5900055.6616268', 10.0, 10.0, 33, 'North', 'WGS-84']
'success'
correct shifts
CR.correct_shifts() returns an an OrderedDict containing the coregistered numpy array and its corresponding geoinformation.
CR.correct_shifts()
OrderedDict([('band', None),
('is shifted', True),
('is resampled', False),
('updated map info',
['UTM',
1,
1,
300003.57885632466,
5900025.6616268,
10.0,
10.0,
33,
'North',
'WGS-84']),
('updated geotransform',
[300000.0, 10.0, 0.0, 5900040.0, 0.0, -10.0]),
('updated projection',
'PROJCS["WGS 84 / UTM zone 33N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32633"]]'),
('arr_shifted', array([[ 0, 0, 0, ..., 953, 972, 1044],
[ 0, 0, 0, ..., 1001, 973, 1019],
[ 0, 0, 0, ..., 953, 985, 1020],
...,
[ 0, 0, 0, ..., 755, 763, 773],
[ 0, 0, 0, ..., 760, 763, 749],
[9999, 9999, 9999, ..., 9999, 9999, 9999]], dtype=uint16)),
('GeoArray_shifted',
<py_tools_ds.io.raster.GeoArray.GeoArray at 0x7f6c5a1cabe0>)])
To write the coregistered image to disk, the COREG class needs to be instanced with a filepath given to keyword 'path_out'. The output raster format can be any format supported by GDAL. Find a list of supported formats here: http://www.gdal.org/formats_list.html
apply detected shifts to multiple images
Sometimes it can be useful to apply the same shifts to multiple images - e.g. to different mask images derived from the same satellite dataset. For this purpose you can calculate spatial shifts using the COREG class (see above) and then apply the calculated shifts to mulitple images using the DESHIFTER class.
Take a look at the keyword arguments of the DESHIFTER class when you need further adjustments (e.g. output paths for the corrected images; aligned output grid, ...).
from arosics import DESHIFTER
DESHIFTER(im_target1, CR.coreg_info).correct_shifts()
DESHIFTER(im_target2, CR.coreg_info).correct_shifts()
OrderedDict([('band', None),
('is shifted', True),
('is resampled', False),
('updated map info',
['UTM',
1,
1,
300003.57885632466,
5900025.6616268,
10.0,
10.0,
33,
'North',
'WGS-84']),
('updated geotransform',
[300000.0, 10.0, 0.0, 5900040.0, 0.0, -10.0]),
('updated projection',
'PROJCS["WGS 84 / UTM zone 33N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32633"]]'),
('arr_shifted', array([[ 0, 0, 0, ..., 953, 972, 1044],
[ 0, 0, 0, ..., 1001, 973, 1019],
[ 0, 0, 0, ..., 953, 985, 1020],
...,
[ 0, 0, 0, ..., 755, 763, 773],
[ 0, 0, 0, ..., 760, 763, 749],
[9999, 9999, 9999, ..., 9999, 9999, 9999]], dtype=uint16)),
('GeoArray_shifted',
<py_tools_ds.io.raster.GeoArray.GeoArray at 0x7f6c5a1caa58>)])
Shell console interface
The help instructions of the console interface can be accessed like this:
python arosics.py -h
Follow these instructions to run AROSICS from a shell console. For example, the most simple call for a global co-registration would be like this:
python arosics.py global /path/to/your/ref_image.bsq /path/to/your/tgt_image.bsq
CoReg_local
This module has been designed to detect and correct geometric shifts present locally in your input image. The class COREG_LOCAL calculates a grid of spatial shifts with points spread over the whole overlap area of the input images. Based on this grid a correction of local shifts can be performed.
Python interface
detect and correct local shifts - with input data on disk
from arosics import COREG_LOCAL
im_reference = '/path/to/your/ref_image.bsq'
im_target = '/path/to/your/tgt_image.bsq'
kwargs = {
'grid_res' : 200,
'window_size' : (64,64),
'path_out' : 'auto',
'projectDir' : 'my_project',
'q' : False,
}
CRL = COREG_LOCAL(im_reference,im_target,**kwargs)
CRL.correct_shifts()
Calculating actual data corner coordinates for reference image...
Corner coordinates of reference image:
[[319090.0, 5790510.0], [351800.0, 5899940.0], [409790.0, 5900040.0], [409790.0, 5790250.0], [319090.0, 5790250.0]]
Calculating actual data corner coordinates for image to be shifted...
Corner coordinates of image to be shifted:
[[319460.0, 5790510.0], [352270.0, 5900040.0], [409790.0, 5900040.0], [409790.0, 5790250.0], [319460.0, 5790250.0]]
Matching window position (X,Y): 372220.10753674706/5841066.947109019
Calculating geometric quality grid (1977 points) in mode 'multiprocessing'...
progress: |==================================================| 100.0% [1977/1977] Complete 9.75 sek
Found 1144 valid GCPs.
Correcting geometric shifts...
Translating progress |==================================================| 100.0% Complete
Warping progress |==================================================| 100.0% Complete
Writing GeoArray of size (10979, 10979) to /home/gfz-fe/scheffler/jupyter/arosics_jupyter/my_project/S2A_OPER_MSI_L1C_TL_SGS__20160608T153121_A005024_T33UUU_B03__shifted_to__S2A_OPER_MSI_L1C_TL_SGS__20160529T153631_A004881_T33UUU_B03.bsq.
OrderedDict([('band', None),
('is shifted', True),
('is resampled', True),
('updated map info',
['UTM',
1,
1,
300000.0,
5900030.0,
10.0,
10.0,
33,
'North',
'WGS-84']),
('updated geotransform',
[300000.0, 10.0, 0.0, 5900030.0, 0.0, -10.0]),
('updated projection',
'PROJCS["WGS 84 / UTM zone 33N",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",15],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32633"]]'),
('arr_shifted', array([[ 0, 0, 0, ..., 1034, 996, 1001],
[ 0, 0, 0, ..., 1046, 1114, 1124],
[ 0, 0, 0, ..., 1021, 1126, 1148],
...,
[ 0, 0, 0, ..., 760, 769, 805],
[ 0, 0, 0, ..., 762, 755, 765],
[ 0, 0, 0, ..., 0, 0, 0]], dtype=uint16)),
('GeoArray_shifted',
<py_tools_ds.io.raster.GeoArray.GeoArray at 0x7f451ac14a90>)])
detect and correct local shifts - without any disk access
All you have to do is to instanciate COREG_LOCAL with two instances of the GeoArray class as described above.
CRL = COREG_LOCAL(GeoArray(ref_ndarray, ref_gt, ref_prj),GeoArray(tgt_ndarray, tgt_gt, tgt_prj),**kwargs)
CRL.correct_shifts()
visualize geometric quality grid with INITIAL shifts present in your input target image
Use the function COREG_LOCAL.view_CoRegPoints() to visualize the geometric quality grid with the calculated absolute lenghts of the shift vectors (the unit corresponds to the input projection - UTM in the shown example, thus the unit is 'meters'.).
NOTE: a calculation of reliable shifts above cloud covered areas is not possible. In the current version of AROSICS these areas are not masked. A proper masking is planned.
%matplotlib inline
CRL.view_CoRegPoints(figsize=(15,15),backgroundIm='ref')
Note: array has been downsampled to 1000 x 1000 for faster visualization.
The output figure shows the calculated absolute lenghts of the shift vectors - in this case with shifts up to ~25 meters.
visualize geometric quality grid with shifts present AFTER shift correction
The remaining shifts after local correction can be calculated and visualized by instanciating COREG_LOCAL with the output path of the above instance of COREG_LOCAL.
CRL_after_corr = COREG_LOCAL(im_reference, CRL.path_out, **kwargs)
CRL_after_corr.view_CoRegPoints(figsize=(15,15),backgroundIm='ref')
Calculating actual data corner coordinates for reference image...
Corner coordinates of reference image:
[[319090.0, 5790510.0], [351800.0, 5899940.0], [409790.0, 5900040.0], [409790.0, 5790250.0], [319090.0, 5790250.0]]
Calculating actual data corner coordinates for image to be shifted...
Corner coordinates of image to be shifted:
[[319460.0, 5790540.0], [352270.0, 5900030.0], [409780.0, 5900030.0], [409780.0, 5790260.0], [322970.0, 5790250.0], [319460.0, 5790280.0]]
Matching window position (X,Y): 372216.38593955856/5841068.390957352
Note: array has been downsampled to 1000 x 1000 for faster visualization.
Calculating geometric quality grid (1977 points) in mode 'multiprocessing'...
progress: |==================================================| 100.0% [1977/1977] Complete 10.78 sek
The output figure shows a significant reduction of geometric shifts.
show the points table of the calculated geometric quality grid
NOTE: Point records where no valid match has been found are filled with -9999.
CRL.CoRegPoints_table
geometry | POINT_ID | X_IM | Y_IM | X_UTM | Y_UTM | X_WIN_SIZE | Y_WIN_SIZE | X_SHIFT_PX | Y_SHIFT_PX | X_SHIFT_M | Y_SHIFT_M | ABS_SHIFT | ANGLE | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | POINT (352000 5898040) | 81 | 5200 | 200 | 352000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
1 | POINT (354000 5898040) | 82 | 5400 | 200 | 354000.0 | 5898040.0 | 64 | 64 | 0.372470 | -0.285500 | 3.724704 | 2.855005 | 4.693024 | 232.529646 |
2 | POINT (356000 5898040) | 83 | 5600 | 200 | 356000.0 | 5898040.0 | 64 | 64 | 0.260948 | -0.293539 | 2.609479 | 2.935389 | 3.927580 | 221.636201 |
3 | POINT (358000 5898040) | 84 | 5800 | 200 | 358000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
4 | POINT (360000 5898040) | 85 | 6000 | 200 | 360000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
5 | POINT (362000 5898040) | 86 | 6200 | 200 | 362000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
6 | POINT (364000 5898040) | 87 | 6400 | 200 | 364000.0 | 5898040.0 | 64 | 64 | 0.141693 | 0.187036 | 1.416935 | -1.870360 | 2.346476 | 322.853405 |
7 | POINT (366000 5898040) | 88 | 6600 | 200 | 366000.0 | 5898040.0 | 64 | 64 | -0.230941 | 0.121139 | -2.309409 | -1.211389 | 2.607841 | 62.320969 |
8 | POINT (368000 5898040) | 89 | 6800 | 200 | 368000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
9 | POINT (370000 5898040) | 90 | 7000 | 200 | 370000.0 | 5898040.0 | 64 | 64 | -0.035693 | 0.084596 | -0.356928 | -0.845957 | 0.918172 | 22.875994 |
10 | POINT (372000 5898040) | 91 | 7200 | 200 | 372000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
11 | POINT (374000 5898040) | 92 | 7400 | 200 | 374000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
12 | POINT (376000 5898040) | 93 | 7600 | 200 | 376000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
13 | POINT (378000 5898040) | 94 | 7800 | 200 | 378000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
14 | POINT (380000 5898040) | 95 | 8000 | 200 | 380000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
15 | POINT (382000 5898040) | 96 | 8200 | 200 | 382000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
16 | POINT (384000 5898040) | 97 | 8400 | 200 | 384000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
17 | POINT (386000 5898040) | 98 | 8600 | 200 | 386000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
18 | POINT (388000 5898040) | 99 | 8800 | 200 | 388000.0 | 5898040.0 | 64 | 64 | 0.656098 | 2.533985 | 6.560977 | -25.339852 | 26.175457 | 345.483797 |
19 | POINT (390000 5898040) | 100 | 9000 | 200 | 390000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
20 | POINT (392000 5898040) | 101 | 9200 | 200 | 392000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
21 | POINT (394000 5898040) | 102 | 9400 | 200 | 394000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
22 | POINT (396000 5898040) | 103 | 9600 | 200 | 396000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
23 | POINT (398000 5898040) | 104 | 9800 | 200 | 398000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
24 | POINT (400000 5898040) | 105 | 10000 | 200 | 400000.0 | 5898040.0 | 64 | 64 | -0.147210 | -0.223871 | -1.472098 | 2.238708 | 2.679344 | 146.672433 |
25 | POINT (402000 5898040) | 106 | 10200 | 200 | 402000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
26 | POINT (404000 5898040) | 107 | 10400 | 200 | 404000.0 | 5898040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
27 | POINT (406000 5898040) | 108 | 10600 | 200 | 406000.0 | 5898040.0 | 64 | 64 | 0.249318 | 0.214416 | 2.493182 | -2.144158 | 3.288369 | 310.695805 |
28 | POINT (408000 5898040) | 109 | 10800 | 200 | 408000.0 | 5898040.0 | 64 | 64 | 0.372511 | -1.410450 | 3.725107 | 14.104504 | 14.588127 | 194.794441 |
29 | POINT (352000 5896040) | 136 | 5200 | 400 | 352000.0 | 5896040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... | ... |
1947 | POINT (350000 5792040) | 2995 | 5000 | 10800 | 350000.0 | 5792040.0 | 64 | 64 | 0.209144 | -1.750348 | 2.091443 | 17.503485 | 17.627992 | 186.813809 |
1948 | POINT (352000 5792040) | 2996 | 5200 | 10800 | 352000.0 | 5792040.0 | 64 | 64 | 0.367216 | -1.643834 | 3.672159 | 16.438337 | 16.843505 | 192.592548 |
1949 | POINT (354000 5792040) | 2997 | 5400 | 10800 | 354000.0 | 5792040.0 | 64 | 64 | 0.288332 | -1.711756 | 2.883320 | 17.117562 | 17.358700 | 189.561275 |
1950 | POINT (356000 5792040) | 2998 | 5600 | 10800 | 356000.0 | 5792040.0 | 64 | 64 | 0.349523 | -1.629551 | 3.495229 | 16.295510 | 16.666142 | 192.105965 |
1951 | POINT (358000 5792040) | 2999 | 5800 | 10800 | 358000.0 | 5792040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
1952 | POINT (360000 5792040) | 3000 | 6000 | 10800 | 360000.0 | 5792040.0 | 64 | 64 | 0.356829 | -1.353932 | 3.568290 | 13.539322 | 14.001641 | 194.764576 |
1953 | POINT (362000 5792040) | 3001 | 6200 | 10800 | 362000.0 | 5792040.0 | 64 | 64 | 0.332107 | -1.475567 | 3.321073 | 14.755674 | 15.124795 | 192.684252 |
1954 | POINT (364000 5792040) | 3002 | 6400 | 10800 | 364000.0 | 5792040.0 | 64 | 64 | 0.260931 | -1.235276 | 2.609308 | 12.352761 | 12.625339 | 191.927413 |
1955 | POINT (366000 5792040) | 3003 | 6600 | 10800 | 366000.0 | 5792040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
1956 | POINT (368000 5792040) | 3004 | 6800 | 10800 | 368000.0 | 5792040.0 | 64 | 64 | 0.230095 | -1.258021 | 2.300948 | 12.580208 | 12.788901 | 190.364959 |
1957 | POINT (370000 5792040) | 3005 | 7000 | 10800 | 370000.0 | 5792040.0 | 64 | 64 | -0.096170 | -0.463691 | -0.961701 | 4.636910 | 4.735589 | 168.282899 |
1958 | POINT (372000 5792040) | 3006 | 7200 | 10800 | 372000.0 | 5792040.0 | 64 | 64 | 0.194545 | 0.126613 | 1.945447 | -1.266134 | 2.321176 | 303.056848 |
1959 | POINT (374000 5792040) | 3007 | 7400 | 10800 | 374000.0 | 5792040.0 | 64 | 64 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 | -9999.000000 |
1960 | POINT (376000 5792040) | 3008 | 7600 | 10800 | 376000.0 | 5792040.0 | 64 | 64 | -0.192273 | -0.410461 | -1.922730 | 4.104609 | 4.532627 | 154.900105 |
1961 | POINT (378000 5792040) | 3009 | 7800 | 10800 | 378000.0 | 5792040.0 | 64 | 64 | 0.411476 | -1.231980 | 4.114758 | 12.319801 | 12.988792 | 198.469086 |
1962 | POINT (380000 5792040) | 3010 | 8000 | 10800 | 380000.0 | 5792040.0 | 64 | 64 | 0.262658 | -0.490337 | 2.626580 | 4.903369 | 5.562549 | 208.176553 |
1963 | POINT (382000 5792040) | 3011 | 8200 | 10800 | 382000.0 | 5792040.0 | 64 | 64 | 0.186922 | -1.105403 | 1.869221 | 11.054032 | 11.210959 | 189.597841 |
1964 | POINT (384000 5792040) | 3012 | 8400 | 10800 | 384000.0 | 5792040.0 | 64 | 64 | -0.267606 | 0.342886 | -2.676062 | -3.428858 | 4.349526 | 37.970358 |
1965 | POINT (386000 5792040) | 3013 | 8600 | 10800 | 386000.0 | 5792040.0 | 64 | 64 | 0.368027 | -1.232417 | 3.680269 | 12.324169 | 12.861941 | 196.626786 |
1966 | POINT (388000 5792040) | 3014 | 8800 | 10800 | 388000.0 | 5792040.0 | 64 | 64 | 0.405260 | -0.790863 | 4.052597 | 7.908634 | 8.886509 | 207.131823 |
1967 | POINT (390000 5792040) | 3015 | 9000 | 10800 | 390000.0 | 5792040.0 | 64 | 64 | 0.372675 | -1.224506 | 3.726746 | 12.245065 | 12.799619 | 196.927457 |
1968 | POINT (392000 5792040) | 3016 | 9200 | 10800 | 392000.0 | 5792040.0 | 64 | 64 | 0.386730 | -1.438051 | 3.867297 | 14.380515 | 14.891447 | 195.052215 |
1969 | POINT (394000 5792040) | 3017 | 9400 | 10800 | 394000.0 | 5792040.0 | 64 | 64 | 0.433132 | -1.209992 | 4.331321 | 12.099919 | 12.851785 | 199.695480 |
1970 | POINT (396000 5792040) | 3018 | 9600 | 10800 | 396000.0 | 5792040.0 | 64 | 64 | 0.410025 | -0.784237 | 4.100254 | 7.842365 | 8.849563 | 207.602090 |
1971 | POINT (398000 5792040) | 3019 | 9800 | 10800 | 398000.0 | 5792040.0 | 64 | 64 | 0.376237 | -1.138838 | 3.762373 | 11.388382 | 11.993777 | 198.281973 |
1972 | POINT (400000 5792040) | 3020 | 10000 | 10800 | 400000.0 | 5792040.0 | 64 | 64 | 0.071339 | -0.964923 | 0.713385 | 9.649233 | 9.675568 | 184.228288 |
1973 | POINT (402000 5792040) | 3021 | 10200 | 10800 | 402000.0 | 5792040.0 | 64 | 64 | 0.246210 | -1.129963 | 2.462099 | 11.299628 | 11.564754 | 192.292166 |
1974 | POINT (404000 5792040) | 3022 | 10400 | 10800 | 404000.0 | 5792040.0 | 64 | 64 | -0.263890 | -0.903314 | -2.638901 | 9.033142 | 9.410709 | 163.715048 |
1975 | POINT (406000 5792040) | 3023 | 10600 | 10800 | 406000.0 | 5792040.0 | 64 | 64 | 0.239090 | -1.235482 | 2.390904 | 12.354817 | 12.584034 | 190.952493 |
1976 | POINT (408000 5792040) | 3024 | 10800 | 10800 | 408000.0 | 5792040.0 | 64 | 64 | 0.272772 | -0.964375 | 2.727717 | 9.643754 | 10.022098 | 195.793451 |
1977 rows × 14 columns
export geometric quality grid to an ESRI point shapefile
CRL.quality_grid.to_PointShapefile(path_out='/path/to/your/output_shapefile.shp')
Shell console interface
Follow these instructions to run AROSICS from a shell console. For example, the most simple call for a local co-registration would be like this:
python arosics.py local /path/to/your/ref_image.bsq /path/to/your/tgt_image.bsq 50
Credits
This package was created with Cookiecutter and the audreyr/cookiecutter-pypackage project template. The test data represent modified Copernicus Sentinel data (2016).