Este artículo analiza la tecnología de deformación de imágenes en color y propone un algoritmo de deformación bidimensional con velocidad y precisión satisfactorias.
1. Introducción
En aplicaciones de procesamiento de imágenes, generalmente el límite del área cubierta por la imagen es un rectángulo regular. Para obtener un efecto especial, a menudo es necesario transformar la imagen en un área bidimensional con límites irregulares arbitrarios o mapearla en una superficie espacial tridimensional. En resumen, esto es lo que se llama tecnología de transformación de imágenes. Este artículo se centra en la deformación de áreas poligonales bidimensionales arbitrarias y proporciona un algoritmo de deformación de imágenes en color factible. En el caso tridimensional, pertenece al alcance del revestimiento de textura en gráficos por computadora, que generalmente implica el borrado, sombreado y otras tecnologías de gráficos tridimensionales, lo cual es relativamente complicado y no se discutirá en profundidad en este artículo.
2. Principio de transformación
El problema de deformación bidimensional discutido en este artículo se puede formalizar como: la imagen se define en el área rectangular ABCD y el área del polígono de origen P = p1p2…pnp1 (Pi es el vértice, I = 1, 2,...n) está completamente incluido en ABCD; la deformación es transformar la imagen en P al área del polígono objetivo Q=Q1Q2...QnQ1 (Qi es el vértice, i=1, 2,...n) mediante la transformación F , donde P tiene una correspondencia uno a uno con cada vértice en Q, es decir, QI = F (PI) (I = 65438). La Figura 1 es un ejemplo simple de deformación: el área del polígono de origen en la figura es el área rectangular ABCD y el polígono objetivo es un cuadrilátero arbitrario EFGH. El cambio de sombra antes y después de la transformación ilustra claramente el efecto de la deformación.
@@T5S13200. GIF Figura 1@
Entonces, ¿cómo se debe realizar la transformación?
Una idea directa es encontrar explícitamente la expresión para transformar F. Hay dos formas de implementar F. Una es el método de transformación directa, que utiliza F para transformar cualquier píxel de P en Q. , muestra el valor de píxel original. Debido a que el número de píxeles contenidos en P y Q es generalmente diferente, o incluso muy diferente, a los píxeles en Q no se les asigna un valor, formando un agujero molesto, o se asignan varias veces, lo que es una pérdida de tiempo, y el efecto general es no es ideal. En segundo lugar, utilice la transformación inversa f-1 de f para transformar inversamente cada píxel en Q al punto correspondiente en P. Generalmente, este punto tiene coordenadas reales, por lo que su valor de píxel se puede determinar mediante interpolación. De esta manera, a cada píxel de la imagen resultante se le asigna un valor único, lo que no sólo mejora la precisión, sino que también evita asignaciones innecesarias y tiene buenos resultados.
La idea anterior de mostrar expresiones de transformación (o transformación inversa) es más precisa, pero a menudo implica resolver ecuaciones multivariadas complejas, lo cual no es fácil de completar. Otra idea dada en este artículo es que dado que cada vértice en P y Q forma un par de transformación, es decir, cualquier vértice Pi (i=1, 2...n) en el polígono de origen P se transforma en el polígono de destino Q A. vértice Qi (i = 1, 2 ... n) en, entonces el punto de transformación inversa de Qi también debe ser Pi. De esta manera, para cada punto de píxel A en Q (incluido el límite), utilizando el valor de coordenadas del punto de transformación inversa de cada vértice, el punto de transformación inversa B se puede obtener aproximadamente mediante tecnología de interpolación bilineal y luego utilizando el valor de coordenadas; del punto B en la interpolación se realiza en la imagen de origen y finalmente se obtiene el valor de píxel de la pantalla A.
El segundo método evita la solución explícita de la expresión de transformación manteniendo una cierta precisión, y es sencillo de implementar. Con base en esta idea, este artículo diseña un algoritmo de deformación rápida. Además, este algoritmo también se basa en la idea de conversión de escaneo de áreas poligonales del algoritmo de línea de escaneo para lograr un escaneo eficiente de cada píxel en q. A continuación, este artículo presenta primero la tecnología de interpolación y la tecnología de cálculo incremental, y luego brinda los pasos detallados del algoritmo de deformación bidimensional.
En tercer lugar, tecnología de interpolación
Dado el valor de coordenadas transformado de cada vértice Qi (i = 1, 2...n) del polígono objetivo Q, ¿cómo encontrar cualquier píxel en Q ¿Coordenadas transformadas inversas? La interpolación bilineal es un método de aproximación simple y rápido.
Específicamente, las coordenadas de transformación inversa del vértice del polígono Qi (i=1, 2...n) se utilizan para interpolar linealmente las coordenadas de transformación inversa del punto de intersección de la línea de exploración actual y cada borde del polígono, y luego las Las coordenadas de transformación inversa del punto de intersección se utilizan para interpolar linealmente los valores de coordenadas transformadas inversas de cada píxel en la sección donde se encuentra la línea de escaneo para el cálculo posterior. Después de procesar las líneas de escaneo una por una, también se obtiene el valor de coordenadas transformado inverso de cada píxel en Q. Como se muestra en la Figura 2, la línea de exploración Y (ordenada = Y) intersecta el polígono en dos puntos a y b, y d es cualquier punto de la línea de exploración en el segmento AB dentro del polígono. Se sabe que las coordenadas de transformación inversa de los tres vértices qi (I = 1, 2, 3) del polígono son (RXI, RYI);
Supongamos las coordenadas de transformación inversa de a, b, d son respectivamente (RXa, RYa), (RXb, RYb), (RXd, RYd). RXp se puede calcular mediante la siguiente fórmula:
RXa=uRX1 (1-u)RX2 fórmula 1.
RXb=vRX1 (1-v)RX3 fórmula 2
RXd=tRXa (1-t)RXb fórmula 3
Donde u=|AQ2|/ |Q1Q2|, v=|BQ3|/|Q1Q3|, t=|DB|/|AB|,
se denominan parámetros de interpolación.
El valor de RYd también se puede obtener exactamente de forma similar, incluso sin cambiar el cálculo de los parámetros de interpolación. (Rxd, Ryd) es la coordenada aproximada del punto correspondiente al punto D en la imagen original.
@@T5S13201. GIF Figura 2@
El proceso de interpolación bilineal anterior puede mejorar la velocidad mediante cálculo incremental. Entre ellos, en la dirección horizontal, las coordenadas transformadas inversamente de cada píxel en cada sección del polígono se pueden calcular incrementalmente de izquierda a derecha a lo largo de la línea de escaneo. Tomemos como ejemplo la coordenada x después de la transformación inversa. Como se muestra en la Figura 2, en la línea de exploración Y, C y D hay dos píxeles adyacentes. Para el punto C, el parámetro de interpolación tc=|CB|/|AB|, para el punto D, td=|DB|/|AB|, entonces la diferencia de los parámetros de interpolación △t=|CD|/|AB|, porque C y D Adyacentes, en la misma línea de exploración, |CD. De acuerdo con la Ecuación 1 ~ Ecuación 3, no es difícil deducir la relación entre la coordenada X transformada inversa Rxd del punto D y la coordenada X transformada inversa Rxc del punto C de la siguiente manera:
Rxd=Rxc ( Rxa-Rxb) △t= Rxc △Rxx
Debido a que △Rxx sigue siendo una constante en la sección AB, la coordenada X transformada inversa de cada píxel en la sección AB se puede obtener aumentando secuencialmente Rxa de punto A, y la coordenada Y transformada inversa de Lo mismo ocurre con la resolución incremental. De esta manera, el cálculo del valor de coordenadas transformado inverso de cada píxel en la sección AB se simplifica a dos sumas, lo que ahorra un tiempo increíble. De hecho, en la dirección vertical, cada borde también puede calcular las coordenadas transformadas inversas de su intersección con la línea de exploración de forma incremental entre líneas de exploración adyacentes. Como se muestra en la Figura 2, el borde Q1Q2 cruza dos líneas de exploración adyacentes Y e Y-1 en los puntos A y E respectivamente. Entonces, la diferencia en los parámetros de interpolación entre los dos puntos △u=|AE|/|Q1Q2|, el ángulo entre el lado de Q1Q2 y la línea de exploración se fija en θ, la diferencia en las coordenadas Y de A y E es 1, entonces |AE|=1/ Sinθ, es Q65438.
rxa = Rxe (rx 1-Rx2)△u = Rxe △Rxy
Obviamente, △Rxy también es una constante a lo largo del borde de Q1Q2, por lo que se puede ver que explora El punto de intersección de las líneas y las coordenadas transformadas inversas de cada borde requieren solo dos adiciones de punto flotante. De esta manera, la transformación inversa de cada píxel en el área se puede completar de manera eficiente mediante cálculo incremental, lo que mejora en gran medida la velocidad de todo el algoritmo de deformación.
Además, como se mencionó anteriormente, los puntos después de la transformación inversa generalmente tienen coordenadas reales, por lo que el valor del color no se puede obtener directamente en la imagen original. Pero sabemos que la esencia de la llamada imagen digital es muestrear discretamente imágenes continuas en puntos de la cuadrícula con coordenadas enteras, por lo que el valor de color de un punto en cualquier coordenada del área se puede obtener mediante interpolación. La interpolación se refiere al cálculo aproximado del valor de color de cualquier punto de coordenadas utilizando los valores de color de varios píxeles circundantes (con valores de coordenadas enteros y valores de color determinados) de acuerdo con una determinada fórmula de interpolación.
Generalmente, existen métodos de interpolación como el método del vecino más cercano, el método de interpolación bilineal y el método de función spline cúbica. Debido al equilibrio entre precisión y velocidad, la interpolación bilineal es adecuada para la mayoría de las aplicaciones. En particular, los tres componentes de color primario de un color deben interpolarse por separado, en lugar de utilizar directamente el número de índice de color obtenido leyendo el punto de píxel. Consulte la referencia [1] para obtener una discusión detallada.
IV.Detalles del algoritmo
A continuación se proporcionará un algoritmo de deformación bidimensional para imágenes en color. Este algoritmo se basa en el algoritmo de línea de escaneo de transformación de escaneo de área poligonal, utilizando datos similares. estructuras para eficientemente El área del polígono objetivo se escanea punto por punto mientras se implementan las diversas técnicas analizadas anteriormente.
Primero, proporcione la estructura de datos descrita en lenguaje C:
Estructura de borde {
Flotante x /*La coordenada X del punto final inferior del borde; está en el borde Indicado en la tabla de clasificación ET Cadena de activación de bordes
En la tabla AEL, se indica la coordenada x del punto de intersección del borde y la línea de escaneo */
<; p>float dx/*La pendiente del borde El recíproco de /La coordenada transformada inversa de float Ry/* en AEL, representa la coordenada transformada inversa del punto de intersección del borde y el línea de escaneo*.
/
Tabla flotante dRx/*En la dirección entre líneas de escaneo, cambia inversamente*/
Flotante seco /*Incremento de coordenadas Valor (Rx, Ry) */
struct Edge * next/*Puntero al siguiente borde*/
} /*Información sobre el borde del polígono*/
struct Borde * ET[resolución y];
/*Tabla de clasificación de bordes, una matriz de punteros que clasifica los bordes no horizontales según la ordenada y del punto final inferior del borde.
Los bordes cuyo punto final inferior es igual a I se clasifican en la categoría I. En la misma categoría, los bordes se organizan en orden creciente de valores X y △ X. La resolución y es el número de líneas de escaneo; */
Estructura Edye*AEL;
tabla/*La lista vinculada activa de bordes consta de todos los bordes del polígono que se cruzan con la línea de exploración actual y registra el orden en el que Los bordes del polígono se cruzan con la línea de exploración actual. */
Polígono de estructura {
int npts/*Número de vértices del polígono*/
Puntos de estructura* Pts
/ *Secuencia de vértices del polígono */
} /*Información del polígono*/
Punto de estructura {
int X
int Y; ; /*Coordenadas de vértices*/
Float Rx;
float Ry/*Coordenadas de transformación inversa de vértices*/
};/*Las coordenadas de cada uno vértice del polígono Información*/
Tenga en cuenta que el punto final inferior del lado indicado anteriormente se refiere al extremo con el valor de ordenada más pequeño, y el otro extremo es el punto final superior.
Los siguientes son los pasos detallados del algoritmo:
1. Preparación de datos
Para cada borde no horizontal Qi 1, establezca las coordenadas de Qi y Qi 1 respectivamente Para (, fácil).
Y (x
i 1, Yi 1); sus coordenadas de transformación inversa son (Rxi, Ryi) y (RXi 1, RYi 1).
Luego complete los campos de la estructura de información aquí según los siguientes tipos:
X=Xi, YiYi 1
RX=RXi, YiYi 1
RY=RYi, YiYi 1
dx=(xi-xi 1)/(伊-伊1)
Ymax=max(yi, yi 1)
dRx=(Rxi-Rxi 1)/(伊-伊1)
dRy =(Ryi-Ryi 1)/(yi-yi 1)
Luego inserte la lista vinculada ET[min(yi, yi 1)].
Active Edge Bench AEL y déjelo en blanco.
La ordenada y de la línea de exploración actual es 0, que es el número de secuencia mínimo.
2. Escanee la conversión
Repita los siguientes pasos hasta que y sea igual a YResolution.
(1) Si ET[y] no está vacío, inserte todos los bordes en AEL.
(2) Si AEL no está vacío, organice los bordes de pequeño a grande de acuerdo con los valores de Pair en secuencia. Luego se forman varios intervalos horizontales [xLeft, xRight] a lo largo de la línea de exploración actual y, y las coordenadas de transformación inversa de los puntos finales izquierdo y derecho son (lRx, lRy) y (rRx, rRy) respectivamente. Para cada uno de estos intervalos, realice los siguientes pasos:
dRxx=(lRx-rRx)/(xleft-xRight)
dRyx=(lRy-rRy)/(xleft- xRight)
Supongamos que la imagen original se ha leído en una imagen de matriz bidimensional. Supongamos que xx = xleft, rxy = lrx, ryx = lry, luego, para cada píxel cuyas coordenadas satisfacen que xLeft≤xx≤xRight es (xX, y), sus coordenadas transformadas inversas (rxy, ryx) se pueden calcular de la siguiente manera:
Rxx=Rxx dRxx
Ryx=Ryx dRyy
Utilice la interpolación (Rxx, Ryx) en la imagen de la matriz (ver referencia [1]), de acuerdo con el valor del color. del píxel de la pantalla. Luego, el borde x = x 1, calcula el siguiente píxel.
(4) Elimine los bordes en AEL que satisfacen y = Ymax y luego ajuste la información de cada borde en AEL de acuerdo con la siguiente fórmula.
X=X dx
Rx=Ry dRx
Ry=Ry dRy
(5)y=y 1, repetir a pequeño.
Discusión sobre verbos (abreviatura de verbo)
El algoritmo anterior proporciona una solución de implementación simple y rápida para la deformación bidimensional de imágenes en color. En cuanto a la deformación 3D, es más compleja ya que suele implicar la eliminación de superficies ocultas. Sin embargo, en algunos casos, se puede evitar el problema de los espacios en blanco. Por ejemplo, la forma de la superficie objetivo es relativamente simple después de proyectarse en la pantalla, las distintas partes no se superpondrán, por lo que no es necesario utilizar tecnología de supresión y la proyección directa es suficiente.