
.. DO NOT EDIT.
.. THIS FILE WAS AUTOMATICALLY GENERATED BY SPHINX-GALLERY.
.. TO MAKE CHANGES, EDIT THE SOURCE PYTHON FILE:
.. "advanced_examples/plot_deramp.py"
.. LINE NUMBERS ARE GIVEN BELOW.

.. only:: html

    .. note::
        :class: sphx-glr-download-link-note

        :ref:`Go to the end <sphx_glr_download_advanced_examples_plot_deramp.py>`
        to download the full example code

.. rst-class:: sphx-glr-example-title

.. _sphx_glr_advanced_examples_plot_deramp.py:


Bias correction with deramping
==============================

(On latest only) Update will follow soon with more consistent bias correction examples.
In ``xdem``, this approach is implemented through the :class:`xdem.biascorr.Deramp` class.

For more information about the approach, see :ref:`biascorr-deramp`.

.. GENERATED FROM PYTHON SOURCE LINES 10-15

.. code-block:: default

    import geoutils as gu
    import numpy as np

    import xdem








.. GENERATED FROM PYTHON SOURCE LINES 16-17

**Example files**

.. GENERATED FROM PYTHON SOURCE LINES 17-24

.. code-block:: default

    reference_dem = xdem.DEM(xdem.examples.get_path("longyearbyen_ref_dem"))
    dem_to_be_aligned = xdem.DEM(xdem.examples.get_path("longyearbyen_tba_dem"))
    glacier_outlines = gu.Vector(xdem.examples.get_path("longyearbyen_glacier_outlines"))

    # Create a stable ground mask (not glacierized) to mark "inlier data"
    inlier_mask = ~glacier_outlines.create_mask(reference_dem)








.. GENERATED FROM PYTHON SOURCE LINES 25-27

The DEM to be aligned (a 1990 photogrammetry-derived DEM) has some vertical and horizontal biases that we want to avoid.
These can be visualized by plotting a change map:

.. GENERATED FROM PYTHON SOURCE LINES 27-32

.. code-block:: default


    diff_before = reference_dem - dem_to_be_aligned
    diff_before.show(cmap="coolwarm_r", vmin=-10, vmax=10, cbar_title="Elevation change (m)")





.. image-sg:: /advanced_examples/images/sphx_glr_plot_deramp_001.png
   :alt: plot deramp
   :srcset: /advanced_examples/images/sphx_glr_plot_deramp_001.png
   :class: sphx-glr-single-img





.. GENERATED FROM PYTHON SOURCE LINES 33-34

A 2-D 3rd order polynomial is estimated, and applied to the data:

.. GENERATED FROM PYTHON SOURCE LINES 34-40

.. code-block:: default


    deramp = xdem.coreg.Deramp(poly_order=2)

    deramp.fit(reference_dem, dem_to_be_aligned, inlier_mask=inlier_mask)
    corrected_dem = deramp.apply(dem_to_be_aligned)








.. GENERATED FROM PYTHON SOURCE LINES 41-42

Then, the new difference can be plotted.

.. GENERATED FROM PYTHON SOURCE LINES 42-47

.. code-block:: default


    diff_after = reference_dem - corrected_dem
    diff_after.show(cmap="coolwarm_r", vmin=-10, vmax=10, cbar_title="Elevation change (m)")





.. image-sg:: /advanced_examples/images/sphx_glr_plot_deramp_002.png
   :alt: plot deramp
   :srcset: /advanced_examples/images/sphx_glr_plot_deramp_002.png
   :class: sphx-glr-single-img





.. GENERATED FROM PYTHON SOURCE LINES 48-49

We compare the median and NMAD to validate numerically that there was an improvement (see :ref:`robuststats-meanstd`):

.. GENERATED FROM PYTHON SOURCE LINES 49-57

.. code-block:: default

    inliers_before = diff_before[inlier_mask]
    med_before, nmad_before = np.median(inliers_before), xdem.spatialstats.nmad(inliers_before)

    inliers_after = diff_after[inlier_mask]
    med_after, nmad_after = np.median(inliers_after), xdem.spatialstats.nmad(inliers_after)

    print(f"Error before: median = {med_before:.2f} - NMAD = {nmad_before:.2f} m")
    print(f"Error after: median = {med_after:.2f} - NMAD = {nmad_after:.2f} m")




.. rst-class:: sphx-glr-script-out

 .. code-block:: none

    /home/docs/checkouts/readthedocs.org/user_builds/xdem-erikm/conda/latest/lib/python3.11/site-packages/numpy/core/fromnumeric.py:784: UserWarning: Warning: 'partition' will ignore the 'mask' of the MaskedArray.
      a.partition(kth, axis=axis, kind=kind, order=order)
    Error before: median = -2.33 - NMAD = 3.42 m
    Error after: median = -0.19 - NMAD = 2.91 m





.. rst-class:: sphx-glr-timing

   **Total running time of the script:** (0 minutes 3.871 seconds)


.. _sphx_glr_download_advanced_examples_plot_deramp.py:

.. only:: html

  .. container:: sphx-glr-footer sphx-glr-footer-example




    .. container:: sphx-glr-download sphx-glr-download-python

      :download:`Download Python source code: plot_deramp.py <plot_deramp.py>`

    .. container:: sphx-glr-download sphx-glr-download-jupyter

      :download:`Download Jupyter notebook: plot_deramp.ipynb <plot_deramp.ipynb>`


.. only:: html

 .. rst-class:: sphx-glr-signature

    `Gallery generated by Sphinx-Gallery <https://sphinx-gallery.github.io>`_
