2011-08-14 17 views
6

¿Cuál sería la mejor manera de aproximar la relación de aspecto de un casco convexo en Python? Ya he intentado hacer esto ajustando los vértices del casco convexo con una elipse y tomando la relación del semi y el eje principal. Los resultados no son satisfactorios, por lo que ahora estoy buscando la relación de aspecto directamente desde el casco convexo. Cualquier idea o solución sería muy apreciada.Estimación de la relación de aspecto de un casco convexo

Saludos

+0

¿Qué quiere decir con aspecto relación en este contexto y ¿cómo se quiere obtener directamente del casco convexo? –

+1

¿Cómo se define la relación de aspecto de un casco convexo? ¿Desea permitir diferentes ángulos para que pueda obtener la relación de aspecto de un rectángulo girado? Si solo quiere usar 0 ° y 90 ° para los ejes, la relación de aspecto es fácil de calcular. –

+0

Por 0 y 90 grados, ¿quiere decir encontrar la relación de aspecto de la siguiente manera? 1) Encuentre el eje principal en el casco convexo (la trayectoria más larga posible en el casco convexo a través del centroide) y 2) mida el eje menor que es ortogonal al eje principal. Si ese es el caso, entonces debería funcionar. – ebressert

Respuesta

7

Normalmente, se encontrarían los vectores propios de la matriz de covarianza de la nube de puntos. La relación de aspecto es la relación de los valores propios más grandes a los más pequeños.

A modo de ejemplo para un montón de puntos al azar (que acababas de aplicar lo mismo a su casco convexo, utilizando solamente los vértices):

import matplotlib.pyplot as plt 
import numpy as np 

# Random data 
num = 100 
xy = np.random.random((2,num)) + 0.01 * np.arange(num) 

eigvals, eigvecs = np.linalg.eig(np.cov(xy)) 

fig, (ax1, ax2) = plt.subplots(nrows=2) 
x,y = xy 
center = xy.mean(axis=-1) 
for ax in [ax1, ax2]: 
    ax.plot(x,y, 'ro') 
    ax.axis('equal') 

for val, vec in zip(eigvals, eigvecs.T): 
    val *= 2 
    x,y = np.vstack((center + val * vec, center, center - val * vec)).T 
    ax2.plot(x,y, 'b-', lw=3) 

plt.show() 

enter image description here

+0

Esta es una buena solución. Todavía estoy probando este código en mis datos, pero hasta ahora los resultados son buenos. ¡Gracias! – ebressert

Cuestiones relacionadas