Semana 21. Corrección de errores en el método de densificación IDW
El trabajo de esta semana se ha centrado en corregir los errores detectados a la hora de implementar IDW. Se ha corregido la información del blog de la semana 19.
Estos errores consistian en aplicar una correcta combinación convexa para la determinacion de los pesos de cada punto. La corrección aplicada consiste en emplear la fórmula D = λ1·A + λ2·B + λ3·C
, donde λ1, λ2 y λ3
son pesos aleatorios que siguen una distribución normal truncada en el rango [0, 1]. Los pesos se normalizan para que sumen 1, lo que garantiza que la combinación sea convexa.
El otro error corregido es la manera de expresar y calcular los valores aleatorias de λ. Se busca obtener un valor aleatorio entre 0 y 1, pero que los valores intermedios tengan una probabilidad mayor a los valores cercanos a los extremos. Para lograr esto se aplica spicy.stats.tuncnorm
. De esta manera el peso λ sigue una distribución aleatoria truncada en el rango [0, 1].
from scipy.stats import truncnorm
# Parámetros de la distribución normal truncada
media = 0.5
desviacion_estandar = 0.2
limite_inferior = 0
limite_superior = 1
# Convertir los límites al espacio de la distribución normal estándar
a = (limite_inferior - media) / desviacion_estandar
b = (limite_superior - media) / desviacion_estandar
# Generar lambda con distribución normal truncada
lambdaComb = truncnorm.rvs(a, b, loc=media, scale=desviacion_estandar)
lambdaComb = np.clip(lambdaComb, 0.0, 1.0) # Asegurarse de que esté en el rango [0, 1]
# Interpolación aplicando C = λA + (1-λ)B
interpolated_point = lambdaComb * point + (1 - lambdaComb) * neighbor_point
# Generar pesos aleatorios que sumen 1
lambda_1 = truncnorm.rvs(a ,b, loc=media, scale=desviacion_estandar)
lambda_2 = truncnorm.rvs(a ,b, loc=media, scale=desviacion_estandar)
lambda_3 = truncnorm.rvs(a ,b, loc=media, scale=desviacion_estandar)
# Normalizar los pesos para que sumen 1
total = lambda_1 + lambda_2 + lambda_3
lambda_1 /= total
lambda_2 /= total
lambda_3 /= total
# Interpolacion aplicando D=λ1*A+λ2*B+λ3*C
interpolated_point = lambda_1 * point_A + lambda_2 * point_B + lambda_3 * point_C
Además de las correcciones he probado a aplicar el muestreo a las nubes de puntos del dataset Goose.
El muestreo aleatorio se aplica correctamente como se puede ver en el video.
En el caso de la voxelización, si utilizamos la vista cenital podemos ver que la estructura de la nube se mantiene. Pero al ver la camara en tercera persona se pierde todo el detalle de la nube. Este error probablemente se deba a la mala configuracion del tamaño del voxel.

