Redimensionner un WolfArray

Il arrive régulièrement qu’il faille redimensionner une matrice et/ou adapter sa résolution.

Pour ce faire, l’objet WolfArray dispose d’une méthode rebin qui permet de redimensionner une matrice en adaptant sa résolution.

La méthode est initialement prévue pour modifier la résolution sur base d’un facteur “entier”. Elle peut néanmoins être utilisée avec des valeurs non entières, mais dans ce cas, la matrice résultante sera potentiellement étendue pour s’adapter à la nouvelle résolution.

[1]:
import _add_path # for debugging purposes only - must be removed in production

import numpy as np
from pathlib import Path
import matplotlib.pyplot as plt

from wolfhece import is_enough
if not is_enough('2.2.42'):
    raise ImportError("This code requires wolfhece version 2.2.42 or higher. -- try pip install wolfhece --upgrade")

from wolfhece.wolf_array import WolfArray
from wolfhece.pydownloader import toys_dataset
from wolfhece.PyVertexvectors import Zones, zone, vector, wolfvertex as wv

Chargement d’un modèle numérique de terrain

Affichage de sa résolution et de sa taille.

On pourra vérifier que la résolution est de 5.0 m x 5.0 m.

[4]:
mnt = WolfArray(toys_dataset("Array_Theux_Pepinster", 'mnt.bin'))
print(mnt)
Shape  : 480 x 1160
Resolution  : 5.0 x 5.0
Spatial extent :
   - Origin : (251000.0 ; 135500.0)
   - End : (253400.0 ; 141300.0)
   - Width x Height : 2400.0 x 5800.0
   - Translation : (0.0 ; 0.0)
Null value : 0.0


Changement de résolution vers 10m x 10m

Pendant la procédure d’adaptation de la résolution, il est possible de choisir une opération marthématique à appliquer sur les valeurs des pixels qui seront fusionnés.

  • ‘mean’ : moyenne des valeurs

  • ‘min’ : valeur minimale

  • ‘max’ : valeur maximale

  • ‘sum’ : somme des valeurs

  • ‘median’ : médiane des valeurs

[5]:
mnt.rebin(factor =2,            # factor can be non-integer (>= 1.0 == zoom out, < 1.0 == zoom in)
          operation = 'mean',)  # operation can be 'mean', 'min', 'max', 'sum', 'median'
[6]:
print(mnt)
Shape  : 240 x 580
Resolution  : 10.0 x 10.0
Spatial extent :
   - Origin : (251000.0 ; 135500.0)
   - End : (253400.0 ; 141300.0)
   - Width x Height : 2400.0 x 5800.0
   - Translation : (0.0 ; 0.0)
Null value : 0.0


ATTENTION : l’opération se réalise “en place”, c’est-à-dire que le WolfArray d’origine est modifié.

Si vous souhaitez conserver l’original, pensez à le copier avant de faire le rebin.

[8]:
mnt_copy = WolfArray(mold=mnt)
mnt_copy.rebin(factor=2., operation='max')
print(mnt_copy)
Shape  : 120 x 290
Resolution  : 20.0 x 20.0
Spatial extent :
   - Origin : (251000.0 ; 135500.0)
   - End : (253400.0 ; 141300.0)
   - Width x Height : 2400.0 x 5800.0
   - Translation : (0.0 ; 0.0)
Null value : 0.0


Une augmentation de la résolution est aussi possible

Cependant, dans ce cas, il n’y a pas d’opération possible sur les pixels. Les valeurs des pixels sont simplement dupliquées.

Une exception existe cependant : si le facteur est un diviseur non entier de la résolution actuelle, la valeur minimale des pixels ambigus sera conservée. Dans cette situation, le code :

  • commence par rechercher le plus grand diviseur entier des deux résolutions

  • applique un rebin (division) avec ce facteur (donc une résolurtion plus importante que celle demandée)

  • applique un second rebin (agglomération) avec le facteur nécessaire pour atteindre la résolution demandée, en utilisant l’opération ‘min’

Cela signifie que, temporairement, la matrice peut être agrandie pour s’adapter à la nouvelle résolution. Cela peut engendrer une consommation mémoire importante.

[11]:
mnt2 = WolfArray(toys_dataset("Array_Theux_Pepinster", 'mnt.bin'))
mnt2.rebin(factor=.5)
print(mnt2)
Shape  : 960 x 2320
Resolution  : 2.5 x 2.5
Spatial extent :
   - Origin : (251000.0 ; 135500.0)
   - End : (253400.0 ; 141300.0)
   - Width x Height : 2400.0 x 5800.0
   - Translation : (0.0 ; 0.0)
Null value : 0.0


[12]:
mnt2 = WolfArray(toys_dataset("Array_Theux_Pepinster", 'mnt.bin'))
mnt2.rebin(1./2.5)  # zoom in by a factor 2.5
print(mnt2)
WARNING:root:The factor 0.4 doesn't lead to an integer dimension for the Kronecker product
WARNING:root:The array will be rebinned firstly using the most common factor and then using the operation
WARNING:root:The greatest common divisor is 1.0
Shape  : 1200 x 2900
Resolution  : 2.0 x 2.0
Spatial extent :
   - Origin : (251000.0 ; 135500.0)
   - End : (253400.0 ; 141300.0)
   - Width x Height : 2400.0 x 5800.0
   - Translation : (0.0 ; 0.0)
Null value : 0.0


Anticiper les informations sans effectuer le rebin

Il est possible d’obtenir le header d’un WolfArray après rebin sans effectuer le rebin.

Ceci peut être utile pour anticiper la taille mémoire nécessaire avant de lancer l’opération.

[13]:
print((mnt2.get_rebin_header(3)))  # anticipate the header after rebin by a factor 3 without doing the rebin
Shape  : 400 x 967
Resolution  : 6.0 x 6.0
Spatial extent :
   - Origin : (251000.0 ; 135500.0)
   - End : (253400.0 ; 141302.0)
   - Width x Height : 2400.0 x 5802.0
   - Translation : (0.0 ; 0.0)
Null value : 0.0


Si le rebin n’est pas possible

Dans ce cas, une erreur est levée et vous devrez adapter votre code en conséquence ou faire remonter votre cas spécifique pour analyse et intégration potentielle dans une future version de la bibliothèque.