Source code for footprint2graph.algo.smooth
# -*- coding: utf-8 -*-
import tracklib as tkl
"""
smoothing ! filtering, simplifcation
"""
[docs]
def skeleton_smoothing(geom, wl_inf, wl_sup):
'''
Filtre de Fourier coupe-bande sur une géométrie.
Parameters
----------
geom : Track
trace ou edge en entrée.
wl_inf : float
longueur d'onde de coupure inférieure (en mètres).
wl_sup : float
longueur d'onde de coupure supérieure (en mètres).
Returns
-------
Track
trace filtrée.
'''
N = len(geom)
# Centrage du signal
geom = geom.copy()
c0 = geom.getCentroid();
cx = c0.E; cy = c0.N
geom.translate(-cx, -cy)
# Sauvegarde des extrémités
ci = geom[0]
cf = geom[-1]
# Periodisation du signal
geom_in = geom.reverse() + geom + geom.reverse()
if geom_in.length() <= 0:
return geom.copy()
# Filtre coupe-bande
signal_low_freq = tkl.filter_freq(geom_in, (1.0/wl_sup), mode=tkl.FILTER_SPATIAL, type=tkl.FILTER_LOW_PASS , dim=tkl.FILTER_XY)[N:2*N]
signal_hgh_freq = tkl.filter_freq(geom_in, (1.0/wl_inf), mode=tkl.FILTER_SPATIAL, type=tkl.FILTER_HIGH_PASS, dim=tkl.FILTER_XY)[N:2*N]
# Somme passe-haut/passe-bas
out = geom.copy()
for i in range(N):
out[i, "x"] = signal_low_freq[i, "x"] + signal_hgh_freq[i, "x"]
out[i, "y"] = signal_low_freq[i, "y"] + signal_hgh_freq[i, "y"]
# Reconstruction des extrémités
out[0] = ci
out[-1] = cf
# Decentrage du signal
out.translate(cx, cy)
return out