Pregunta

Estoy intentando realizar una inclinación en una imagen, como se muestra aquí


(fuente: microsoft.com )
.

Tengo una matriz de píxeles que representan mi imagen y estoy seguro de qué hacer con ellos.

¿Fue útil?

Solución

Una mejor manera de hacer esto es mediante el aplicación inversa.

En esencia, se quiere "urdimbre" la imagen, ¿verdad? Lo que significa que cada píxel de la imagen de origen va a un punto predefinido - la predefinición es una matriz de transformación que le indica cómo rotar, escalar, traducir, cizalla, etc. la imagen que es esencialmente la adopción de algunas de coordenadas (x,y) en su imagen y diciendo que "Ok, la nueva posición para este píxel es (f(x),g(y)).

Eso es esencialmente lo que "warping" lo hace.

Ahora, piense en una imagen de escala ... digamos, diez veces el tamaño. Eso quiere decir que, el píxel en (1,1) se convierte en el píxel en (10,10) - y luego el siguiente píxel, (1,2) se convierte en el (10,20) píxel en la nueva imagen. Pero si seguir haciendo esto, usted no tendrá ningún valor para un píxel, (13,13) porque, (1.3,1.3) no está definido en su imagen original y que tendrá un montón de agujeros en su nueva imagen - que tendrá que interpolar para ese valor usando los cuatro pixeles alrededor de él en la nueva imagen, es decir, (10,10) , (10,20), (20,10), (200,2) - esto se llama de interpolación bilineal

Pero aquí hay otro problema, supongamos que su transformación no era simple raspado y era afín (como muestra la imagen que has enviado) - entonces (1,1) se convertiría en algo así como (2.34,4.21) y entonces tendría que redondear hacia la imagen de salida a (2,4) y después que tendría que hacer la interpolación bilineal en la nueva imagen para rellenar los agujeros o la interpolación más complicado - derecha desordenado

Ahora, hay hay manera para salir de la interpolación, pero podemos conseguir lejos con hacer la interpolación bilineal, simplemente una vez . ¿Cómo? Simple, aplicación inversa.

En lugar de verlo como la imagen de origen ir a la nueva imagen, pensar en que los datos para la nueva imagen llegará a partir de la imagen de origen! Así, (1,1) en la nueva imagen vendrá de alguna mapeo inverso imagen de origen, por ejemplo, (3.4, 2.1) y luego hacer la interpolación bilineal la imagen de origen para averiguar el valor correspondiente!

matriz Transformación

Ok, así que ¿cómo se define una matriz de transformación para una transformación afín? Este sitio web te dice cómo hacerlo por composición diferente transformación matrices para la rotación, de corte, etc.

Transformaciones:

text alt

Composición:

text alt

La matriz final se puede lograr realizando composición de cada matriz en el orden y que invertido para obtener el la aplicación inversa -. Utilizar este calcular las posiciones de los pixeles la imagen de origen y interpolar

Otros consejos

Si no tiene ganas de volver a inventar la rueda, echa un vistazo a la biblioteca OpenCV. Se implementa muchas funciones de procesamiento de imágenes útiles, incluyendo transformaciones de perspectiva. Echa un vistazo a la cvWarpPerspective la que he utilizado para realizar esta tarea con bastante facilidad.

Como se ha comentado por KennyTM sólo necesita una transformación afín que es una aplicación lineal que se obtiene multiplicando cada píxel por una matriz M y añadiendo el resultado a un vector de traslación V . Es pura matemática

end_pixel_position = M*start_pixel_position + V

donde M es una composición de transformaciones sencillas como rotaciones o batiduras y V es un vector que traduce cada punto de sus imágenes mediante la adición de coeficientes fijos a cada pixel.

Por ejemplo, si desea girar la imagen se puede tener una matriz de rotación definida como:

    | cos(a) -sin(a) |
M = |                |
    | sin(a)  cos(a) |

donde a es el ángulo que desea girar su imagen por.

Mientras escalado utiliza una matriz de la forma:

    | s1   0 |
M = |        |
    | 0   s2 |

donde s1 y s2 son factores de escala en ambos ejes.

Para la traducción sólo tiene el vector V

    | t1 |
V = |    |
    | t2 |

que se suma t1 y t2 a las coordenadas del pixel.

A continuación, combinar las matrices en una sola transformación, por ejemplo, si usted tiene cualquiera de escala, rotación y traslación que va a terminar con algo como:

| x2 |             | x1 |
|    | = M1 * M2 * |    | + T
| y2 |             | y1 |

donde:

  • x1 y y1 son coordenadas de píxeles antes de aplicar la transformación,
  • x2 y y2 son píxeles después de la transformación,
  • M1 y M2 son matrices utilizadas para la escala y la rotación ( Recuerde: la composición de matrices no es conmutativa Por lo general M1 * M2 * Vect != M2 * M1 * Vect),
  • T es un uso de vectores de traducción para traducir cada píxel.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top