[gdal-dev] Numerical instability with thin plate spline transform

Jan Hartmann j.l.h.hartmann at uva.nl
Sat Sep 17 07:10:48 EDT 2011



On 09/09/2011 08:11 AM, Even Rouault wrote:
> You might try latest GDAL trunk, in particular 
> http://trac.osgeo.org/gdal/changeset/22876 . It offers the option to 
> use libarmadillo to speed-up matrix inversion in thinplatespline.cpp 
> (speed-up when TPS are in the thousands), but perhaps as a side 
> effect, you'd get also more numerical stability.

I tried to compile the SVN version a few times the last couple of days, 
but it always broke down: Can someone do a "make clean" in their sandbox 
and repair the error?

  g++ -fPIC -L/home/a907hart/local/lib -L/usr/lib  gdaldem.o 
commonutils.o  -L/home/a907hart/src/gdal -lgdal  -larmadillo 
-L/home/a907hart/local/lib -lgeos_c -L/home/a907hart/local/pgsql/lib 
-lpq -lpthread -lm -lrt -ldl  -L/home/a907hart/local/lib   
-lcurl            -o gdaldem
gdaldem.o:(.data.rel.ro._ZTV21GDALGeneric3x3Dataset[vtable for 
GDALGeneric3x3Dataset]+0x30): undefined reference to 
`GDALDataset::CloseDependentDatasets()'
gdaldem.o:(.data.rel.ro._ZTV22GDALColorReliefDataset[vtable for 
GDALColorReliefDataset]+0x30): undefined reference to 
`GDALDataset::CloseDependentDatasets()'


Jan

>> On Thu, Sep 8, 2011 at 5:23 AM, Jan Hartmann<j.l.h.hartmann at uva.nl>  wrote:
>>> Not sure whether this can be considered a bug, so I give it for what it
>>> is worth.
>>>
>>> I'm doing thin plate spline transformation from one set of projected
>>> coordinates to another. Both sets have values between -600000 and 600000
>>> (meters). A typical set of gcps looks like:
>>>
>>>   -gcp 62402 -74383 181915 315371 \
>>>   -gcp -100169 -24213 19685 366661 \
>>>   -gcp 118323 233822 239994 623190 \
>>> ...
>>>
>>> When transforming the the first two columns of this list with
>>> gdaltransform -tps, using the same gcp-list, the results should be
>>> exactly equal to the last two columns:
>>>
>>>   (from gdal_tps.cpp:)
>>>   * The thin plate spline transformer produces exact transformation
>>>   * at all control points and smoothly varying transformations between
>>>   * control points with greatest influence from local control points.
>>>   * It is suitable for for many applications not well modelled by
>>> polynomial * transformations.
>>>   *
>>>
>>>
>>> However, they aren't. With a few control points the differences are only
>>> in millimeters, but with a few hundred gcps the differences become
>>> meters, and above thousand points the error can get to fifty meters. The
>>> problem gets worse when some control points are very near to other ones.
>>> I was happy to discover that dividing all numbers by 1000 solves the
>>> problem, but there certainly is a numerical instability in the
>>> algorithm.
>>>
>>> Of course, thin plate spline transformations normally use scan
>>> coordinates as input, and these are almost always small numbers. Even
>>> so, I can imagine problems with very large rasters and the rubber
>>> sheeting applications I am working with.
>>>
>>> Jan
>>>
>>>
>>>
>>> _______________________________________________
>>> gdal-dev mailing list
>>> gdal-dev at lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
>> _______________________________________________
>> gdal-dev mailing list
>> gdal-dev at lists.osgeo.org
>> http://lists.osgeo.org/mailman/listinfo/gdal-dev
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.osgeo.org/pipermail/gdal-dev/attachments/20110917/58a68ce7/attachment.html


More information about the gdal-dev mailing list