Normalización de coordenadas 2D que se transforman arbitrariamente.

Esto se publicó originalmente como una pregunta de programación, por lo que intentaré mantenerlo lo más abstracto posible.

Estamos ante dos imágenes. El primero es el original y el segundo es una versión distorsionada del original. Imágenes de muestra adjuntas.

El original tiene un cuadrado (marcador) dibujado en la parte superior izquierda, uno en la parte superior derecha y otro en la parte inferior derecha. Los tres cuadrados se utilizan para determinar la orientación. sabemos el w i d t h , h mi i gramo h t de la imagen y la ( X , y ) coordenadas de los tres marcadores. También hay un punto de interés. ( pag ) en la imagen cuyo ( X , y ) posición que conocemos.

La versión distorsionada tiene algunas transformaciones aplicadas (solo traducción, escala y rotación). Esto es muy común si un documento/imagen se imprime y se vuelve a escanear en el sistema. Incluso podría estar al revés, torcido, etc. pero por ahora ignoremos eso y supongamos que incluso la rotación no es más de 15 grados.

Ahora, soy capaz de detectar el ( X , y ) coordenadas de todos los marcadores y calcular el ángulo de rotación, la cantidad de ( X , y ) traducción y la ( X , y ) factor de escala.

Ahora, soy capaz de detectar el ( X , y ) coordenadas de todos los marcadores para la imagen transformada y necesita calcular la transformada pag :

t pag = F ( o metro 1 , o metro 2 , o metro 3 , o pag , t metro 1 , t metro 2 , t metro 3 ) dónde

  • o metro 1 , o metro 2 , o metro 3 son los marcadores originales.
  • o pag es el punto de interés original.
  • t metro 1 , t metro 2 , t metro 3 son los marcadores transformados.
  • t pag es el punto de interés transformado.

Hay dos preguntas distintas aquí:

  • ¿Cómo puedo calcular las coordenadas para el transformado? ( pag ) ?
  • ¿Qué casos de esquina deben tenerse en cuenta?

Original Transformado/Distorsionado

Veo. Eso me dice que si permitimos escalar tanto en x como en y, y tenemos rotación encima de eso, obtenemos un sesgo como resultado natural. En cualquier caso, no estoy seguro de cómo responder a sus preguntas sobre el "orden" de las transformaciones, ya que las transformaciones son el resultado de escáneres inexactos y no están bajo mi control. Normalmente, esto no induciría a escalar de manera diferente en xey y podemos conformarnos con la suposición de que la escala será un solo valor. ¿Responde esto a tu pregunta?
Lo hace, y hace que la respuesta sea un poco más simple.
He dado una respuesta. También eliminé todos mis comentarios para reducir el desorden, y también porque usé una terminología incorrecta en algunos de ellos; la clase de transformadas que estás considerando es la clase de transformadas de similitud del plano.

Respuestas (1)

Como se aclara en los comentarios, las transformaciones consideradas equivalen a todas las transformaciones de similitud del plano. Cualquier transformación de este tipo se puede escribir como un producto T R S , dónde T es una traducción, R es una rotación y S es una escala homogénea. En coordenadas, esto es

( X y ) = ( porque α pecado α pecado α porque α ) ( s 0 0 s ) ( X y ) + ( t X t y ) .

Asumiré que la relación de aspecto de la imagen es tal que las rotaciones hasta 15 no puede inclinar la diagonal más allá de la horizontal o la vertical, es decir, los marcadores en la parte superior permanecen en la parte superior y los marcadores en la derecha permanecen en la derecha. De lo contrario, es posible que primero deba realizar algunas pruebas adicionales para identificar los marcadores correctamente.

El ángulo de rotación α se puede extraer de los marcadores superiores: α = arcán ( ( y 2 y 1 ) / ( X 2 X 1 ) ) , dónde ( X 1 , y 1 ) son las coordenadas del marcador superior izquierdo y ( X 2 , y 2 ) son las coordenadas del marcador superior derecho. (Esto supone que los marcadores originalmente tienen el mismo y coordinar; de lo contrario, debe restar el ángulo correspondiente calculado a partir de las coordenadas originales).

El factor de escala s se puede determinar a partir del cambio en la distancia entre dos marcadores cualquiera, digamos los marcadores superiores: s = ( X 2 X 1 ) 2 + ( y 2 y 1 ) 2 / ( X 2 X 1 ) , dónde X 1 y X 2 son los originales X coordenadas de los marcadores superiores. (Nuevamente, esto supone que su original y las coordenadas son iguales; si no, el denominador es una raíz cuadrada análoga al numerador).

Ahora la traducción ( t X , t y ) se puede determinar a partir de cualquier marcador, digamos el marcador superior izquierdo:

( t X t y ) = ( porque α pecado α pecado α porque α ) ( s 0 0 s ) ( X 1 y 1 ) + ( X 1 y 1 ) .

Entonces solo tienes que aplicar la ecuación de transformación a pag para transformarlo.

Gracias. ¿Hay otros casos de esquina a tener en cuenta además del umbral de rotación que mencionaste? E incluso si se cruzara ese umbral, supongo que podría calcular y aplicar solo R, la lectura en las nuevas posiciones del marcador y luego aplicar solo TS para evitar efectos secundarios conmutativos.
@Raheel: No estoy seguro de lo que quiere decir con "casos de esquina". Si no se cruza el umbral de rotación, no debería haber ningún caso especial problemático. Si es así, el principal problema pasa por identificar correctamente los marcadores. No entiendo tu propuesta de hacer eso, ya que R solo se puede determinar una vez que ya haya identificado correctamente los marcadores, y si lo ha hecho, ya no necesita ningún tratamiento especial. Sugeriría identificar los marcadores calculando los ángulos en el triángulo que forman; el marcador superior derecho es el que tiene el ángulo recto.
Veo. Pensé que inicialmente quería decir que la función solo funcionaría hasta 15 grados de rotación, pero me doy cuenta de que quería decir " siempre que los marcadores se identifiquen correctamente, todo está bien ".