1 votos

¿Cómo rotar puntos relativos en grados?

Tengo 4 puntos en el rango [0.0, 1.0] que representan las esquinas superior izquierda e inferior derecha de un cuadro delimitador.

Por ejemplo: [0.25 0.33 0.71 0.73]

En otras palabras, el primer par (en formato (y, x)) significa que el punto está un 25% abajo en la parte superior de la imagen, y un 33% desde la izquierda. El segundo par significa que el punto inferior derecho está ubicado un 71% desde la parte superior de la imagen y un 73% desde la izquierda.

Pregunta

Si ahora giro la imagen por N grados, ¿cómo calculo dónde deberían estar esos 4 puntos? Para ser más específico, realmente solo me importa rotar la imagen 90, 180, 270 grados.

Ingrese la descripción de la imagen aquí

Izquierda: imagen original, no rotada. Derecha: imagen rotada 90 grados.

3voto

Martin Roberts Puntos 591

La transformación que requieres es: $$ y’ = y \cos \theta + x \sin \theta $$ $$x’ = -y \sin \theta + x \cos \theta$$

También no olvides que al programar $\cos \theta$ y $\sin \theta$ deben estar en radianes y no en grados. Para convertir de grados a radianes, multiplica por $\pi/180$.

Notarás que la fórmula anterior se simplifica mucho si los ángulos de rotación son múltiplos de $90 \deg$.

Para 0 grados, $y’ = y, \; x’ = x$

Para 90 grados, $y’ = x, \; x’ = -y$

Para 180 grados, $y’ = -y, \; x’ = -x$

Para 270 grados, $y’ = -x, \; x’ = y$

Si las coordenadas finales tienen que ser todas positivas, como suele ser el caso en muchos contextos de procesamiento de imagen, esto debería modificarse a

Para 0 grados, $y’ = y, \; x’ = x$

Para 90 grados, $y’ = x, \; x’ =1 - y$

Para 180 grados, $y’ = 1 - y, \; x’ = 1 - x$

Para 270 grados, $y’ = 1 - x, \; x’ = y$

Por último, observo que el orden de las coordenadas $x$ y $y$ que utilizas (aunque se utiliza con bastante frecuencia en el procesamiento de imágenes) está al revés de la convención matemática estándar, así que ten cuidado si estás buscando otras soluciones en internet para asegurarte de que estás leyendo correctamente.

¡Espero que eso te ayude!

1voto

Duncan C Puntos 482

Basándome en la respuesta de Martin Roberts, aquí está mi solución completa:

  // valores en píxeles absolutos
  box = [y_min, x_min, y_max, x_max];

  // Haz los puntos relativos a la imagen
  pct = [box[0] / height, box[1] / width, box[2] / height, box[3] / width];
  //^
  //|
  //+--------+
  //         |
  //         v
  rot90 = [pct[1], 1 - pct[2], pct[3], 1 - pct[0]];
  // ^
  // |
  // +--------+
  //          |
  //          v
  rot180 = [rot90[1], 1 - rot90[2], rot90[3], 1 - rot90[0]];
  // ^
  // |
  // +--------+
  //          |
  //          v
  rot270 = [rot180[1], 1 - rot180[2], rot180[3], 1 - rot180[0]];

introducir descripción de la imagen aquí

  • Como detalle de implementación menor, aunque no todas las imágenes en mi conjunto de datos eran cuadradas, se redimensionaron deliberadamente para ser cuadradas debido al modelo de red neuronal donde se utilizarán.
  • La razón de los puntos (x, y) invertidos, es porque tf.image.draw_bounding_boxes de TensorFlow espera los puntos en ese orden.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X