Différents résultats dans les métriques calculées avec LAStools et lidR
J'ai un modèle de hauteur de la canopée calculé à partir de données TLS haute densité sur une parcelle de 60 mètres sur 200. J'ai essayé de calculer les voxels avec LAStools et lidR et j'ai obtenu des résultats très différents. Je me demandais si quelqu'un pouvait expliquer clairement ce qui se passe. Script Lastools que j'ai utilisé:
lasvoxel -i infile.laz -drop_class 2 -step 0.5 -o outfile.las
number of voxels: 189077
Code lidR:
las = readLAS("infile.laz", select = "xyzc", filter = "-drop_class 2 -drop_z_below 0 ")
voxels <- voxelize_points(las, res = 0.5)
number of voxels: 196257
L'asymétrie et l'aplatissement de la hauteur de la voilure ont également été calculés: LAStools:
lascanopy -i infiles\*.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o outfile.csv
Résultat:
plots ske kur
72a-4.laz 1.0905 5.58125
11a-4.laz 0.362 2.594
34-2.laz 0.1675 2.00875
63a-1.laz -0.3115 2.36
lidR:
library(e1071)
files <- list.files(path= "/files", pattern= "*.laz", full.names = TRUE, recursive = FALSE)
O = lapply(files, function(x) {
las <- readLAS(x, select = "xyzc")
z <- las$Z
z_canopy <- z[z>=1.3]
skew <- skewness(z_canopy)
kur <- kurtosis(z_canopy)
return(data.frame(file=x, skewH = skew, kurH=kur))
})
Résultat:
plots ske kur
72a-4.laz 1.090595768 2.58132381
11a-4.laz 0.362007296 -0.40599745
34-2.laz 0.167542141 -0.991227478
63a-1.laz -0.311523396 -0.640029907
Comme nous pouvons le voir, les résultats pour l'asymétrie sont les mêmes, mais les valeurs de kurtosis sont très différentes. Quelqu'un peut-il m'aider s'il vous plaît à comprendre pourquoi il y a une si grande différence?
Réponses
Concernant le nombre de voxels cela peut s'expliquer par l'alignement des voxels. lidR
centre le voxel en res/2
signifiant que le bas du voxel au sol est à 0 et non au centre. Si LAStools a des voxels centrés sur 0, le décalage peut expliquer la différence. Je n'ai pas essayé d'en être sûr mais cela a du sens.
À propos de l'asymétrie et du kurtosis, votre question est mal posée. Vous ne demandez pas pourquoi lidR
fournit une sortie différente de LAStools
mais pourquoi e1071
fournit une sortie différente de LAStools
. lidR
fait la même chose qu'en LAStools
réalité.
library(e1071)
library(lidR)
LASfile <- system.file("extdata", "Megaplot.laz", package="lidR")
las <- readLAS(LASfile, filter = "-drop_z_below 1.3")
# e1071
skewness(las$Z) # -0.42 kurtosis(las$Z) # -0.66
# lidR
cloud_metrics(las, .stdmetrics_z)[c("zskew", "zkurt")]
# -0.42
# 2.33
# LAStools
system("lascanopy.exe -i Megaplot.laz -kur -ske -height_cutoff 1.3 -files_are_plots -names -o output.csv")
# -0.42
# 2.33
Dans lidR
le kurtosis est défini selon les formules de wikipedia . On peut deviner que cela LAStools
fait la même chose. Dans lidR
le code est:
n * sum((z - zmean)^4)/(sum((z - zmean)^2)^2)
Dans e1071
le code est:
# Here the same formula
r <- n * sum((x-xmean)^4)/(sum((x-xmean)^2)^2)
# Then why output is different
y <- if (type == 1)
r - 3
else if (type == 2)
((n + 1) * (r - 3) + 6) * (n - 1)/((n - 2) * (n - 3))
else
r * (1 - 1/n)^2 - 3
return(y)
Selon la page wikipedia, il semble que cela corresponde à l' excès de kurtosis ou quelque chose comme ça.