Skip to content
Snippets Groups Projects
Select Git revision
  • multi-gitter-gfz-name-repl
  • multi-gitter-branch
  • main default protected
  • enhancement/add_sqa
  • 17-initially-set-up-sqa
  • bugfix/fix_warp_ndarray_crash
  • bugfix/fix_warp_ndarray
  • feature/add_localCS_compatibility
  • v0.23.1
  • v0.23.0
  • v0.22.3
  • v0.22.2
  • v0.22.1
  • v0.22.0
  • v0.21.1
  • v0.21.0
  • v0.20.2
  • v0.20.1
  • v0.20.0
  • v0.19.1
  • v0.19.0
  • v0.18.1
  • v0.18.0
  • v0.17.9
  • v0.17.8
  • v0.17.7
  • v0.17.6
  • v0.17.5
28 results

py_tools_ds

  • Clone with SSH
  • Clone with HTTPS
  • logo

    An Automated and Robust Open-Source Image Co-Registration Software for Multi-Sensor Satellite Data

    Status

    build status coverage report pypi_status license python versions

    See also the latest coverage and the nosetests HTML 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

    AROSICS depends on some open source packages which are usually installed without problems by the automatic install routine. However, for some projects, we strongly recommend resolving the dependency before the automatic installer is run. This approach avoids problems with conflicting versions of the same software. Using conda, the recommended approach is:

    # create virtual environment for arosics, this is optional
    conda create -y -q --name arosics python=3
    source activate arosics
    conda install -y -q -c conda-forge numpy gdal scikit-image matplotlib pyproj rasterio shapely geopandas
    
    # optional libraries:
    conda install -y -q -c conda-forge basemap pykrige
    conda install -y -q -c conda-forge pyfftw  # Linux and MacOS
    conda install -y -q -c jesserobertson pyfftw  # Windows

    To install AROSICS, 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_cli.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_cli.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 tie point 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 tie point grid with INITIAL shifts present in your input target image

    Use the function COREG_LOCAL.view_CoRegPoints() to visualize the tie point 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.

    png

    The output figure shows the calculated absolute lenghts of the shift vectors - in this case with shifts up to ~25 meters.

    visualize tie point 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 tie point grid (1977 points) in mode 'multiprocessing'...
    	progress: |==================================================| 100.0% [1977/1977] Complete 10.78 sek

    png

    The output figure shows a significant reduction of geometric shifts.

    show the points table of the calculated tie point 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 tie point grid to an ESRI point shapefile

    CRL.tiepoint_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_cli.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).