Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Crear una galería de imágenes transformadas

Este ejemplo muestra muchas propiedades de transformaciones geométricas aplicando diferentes transformaciones a una imagen de tablero de ajedrez.

Visión general

Una transformación geométrica bidimensional es una asignación que asocia cada punto de un plano euclidiana con otro punto de un plano euclidiana. En estos ejemplos, la transformación geométrica se define mediante una regla que indica cómo asignar el punto con coordenadas cartesianas (x,y) a otro punto con coordenadas cartesianas (u,v). Un patrón de tablero de ajedrez es útil para visualizar una cuadrícula de coordenadas en el plano de la imagen de entrada y el tipo de distorsión introducida por cada transformación.

Imagen 1: Crear tablero de ajedrez

produce una imagen que tiene azulejos rectangulares y cuatro esquinas únicas, lo que hace que sea fácil ver cómo la imagen del tablero de ajedrez se distorsiona por las transformaciones geométricas.checkerboard

Después de ejecutar este ejemplo una vez, intente cambiar la imagen a su imagen favorita.I

sqsize = 60; I = checkerboard(sqsize,4,4); nrows = size(I,1); ncols = size(I,2); fill = 0.3;  imshow(I) title('Original')

Imagen 2: Aplicar similitud no reflectante a Checkerboard

Las transformaciones de similitud no reflectante pueden incluir una rotación, una escala y una traducción. Se conservan las formas y los ángulos. Las líneas paralelas permanecen paralelas. Las líneas rectas permanecen rectas.

Para una similitud no reflexiva,

<math display="block">
<mrow>
<mo stretchy="false">[</mo>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>u</mi>
<mspace width="0.5em"></mspace>
<mi>v</mi>
</mrow>
</mtd>
</mtr>
</mtable>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo stretchy="false">[</mo>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>x</mi>
<mspace width="0.5em"></mspace>
<mi>y</mi>
<mspace width="0.5em"></mspace>
<mn>1</mn>
</mrow>
</mtd>
</mtr>
</mtable>
<mo stretchy="false">]</mo>
<mspace width="0.16666666666666666em"></mspace>
<mi>T</mi>
</mrow>
</math>

es una matriz de 3 por 3 que depende de 4 parámetros.T

% Try varying these 4 parameters. scale = 1.2;       % scale factor angle = 40*pi/180; % rotation angle tx = 0;            % x translation ty = 0;            % y translation  sc = scale*cos(angle); ss = scale*sin(angle);  T = [ sc -ss  0;       ss  sc  0;       tx  ty  1];

Dado que las similitudes no reflectantes son un subconjunto de transformaciones afines, cree un objeto mediante:affine2d

t_nonsim = affine2d(T); I_nonreflective_similarity = imwarp(I,t_nonsim,'FillValues',fill);  imshow(I_nonreflective_similarity); title('Nonreflective Similarity')

Si cambia uno o a un valor distinto de cero, observará que no tiene ningún efecto en la imagen de salida.txty Si desea ver las coordenadas que corresponden a la transformación, incluida la traducción, incluya información de referencia espacial:

[I_nonreflective_similarity,RI] = imwarp(I,t_nonsim,'FillValues',fill);  imshow(I_nonreflective_similarity,RI) axis on title('Nonreflective Similarity (Spatially Referenced)')

Observe que al pasar el objeto de referencia espacial de salida se muestra la traducción.RIimwarp Para especificar qué parte de la imagen de salida desea ver, utilice el par nombre-valor 'OutputView' en la función.imwarp

Imagen 3: Aplicar similitud a Checkerboard

En una transformación de similitud, triángulos similares se asignan a triángulos similares. Las transformaciones de similitud no reflectante son un subconjunto de transformaciones de similitud.

Para una similitud, la ecuación es la misma que para una similitud no reflexiva:

<math display="block">
<mrow>
<mo stretchy="false">[</mo>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>u</mi>
<mspace width="0.5em"></mspace>
<mi>v</mi>
</mrow>
</mtd>
</mtr>
</mtable>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo stretchy="false">[</mo>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>x</mi>
<mspace width="0.5em"></mspace>
<mi>y</mi>
<mspace width="0.5em"></mspace>
<mn>1</mn>
</mrow>
</mtd>
</mtr>
</mtable>
<mo stretchy="false">]</mo>
<mspace width="0.16666666666666666em"></mspace>
<mi>T</mi>
</mrow>
</math>

es una matriz de 3 por 3 que depende de 4 parámetros más una reflexión opcional.T

% Try varying these parameters. scale = 1.5;        % scale factor angle = 10*pi/180; % rotation angle tx = 0;            % x translation ty = 0;            % y translation a = -1;            % -1 -> reflection, 1 -> no reflection  sc = scale*cos(angle); ss = scale*sin(angle);  T = [   sc   -ss  0;       a*ss  a*sc  0;         tx    ty  1];

Dado que las similitudes son un subconjunto de transformaciones afines, cree un objeto mediante:affine2d

t_sim = affine2d(T);

Como en el ejemplo de traducción anterior, recupere el objeto de referencia espacial de salida de la función y pase a para revelar la reflexión.RIimwarpRIimshow

[I_similarity,RI] = imwarp(I,t_sim,'FillValues',fill);  imshow(I_similarity,RI) axis on title('Similarity')

Imagen 4: Aplicar aAfito de Transformación a Checkerboard

En una transformación afín, las dimensiones x e y se pueden escalar o cortar de forma independiente y puede haber una traducción, una reflexión y/o una rotación. Las líneas paralelas permanecen paralelas. Las líneas rectas permanecen rectas. Las similitudes son un subconjunto de transformaciones afines.

Para una transformación afín, la ecuación es la misma que para una similitud y similitud no reflectante:

<math display="block">
<mrow>
<mo stretchy="false">[</mo>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>u</mi>
<mspace width="0.5em"></mspace>
<mi>v</mi>
</mrow>
</mtd>
</mtr>
</mtable>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo stretchy="false">[</mo>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>x</mi>
<mspace width="0.5em"></mspace>
<mi>y</mi>
<mspace width="0.5em"></mspace>
<mn>1</mn>
</mrow>
</mtd>
</mtr>
</mtable>
<mo stretchy="false">]</mo>
<mspace width="0.16666666666666666em"></mspace>
<mi>T</mi>
</mrow>
</math>

es la matriz 3 por 3, donde los seis elementos de la primera y segunda columna pueden ser diferentes.T La tercera columna debe ser [0;0;1].

% Try varying the definition of T. T = [1  0.3  0;       1    1  0;      0    0  1]; t_aff = affine2d(T); I_affine = imwarp(I,t_aff,'FillValues',fill);  imshow(I_affine) title('Affine')

Imagen 5: Aplicar transformación proyectiva a Checkerboard

En una transformación proyectiva, los cuadriláteros se asignan a cuadriláteros. Las líneas rectas permanecen rectas, pero las líneas paralelas no permanecen necesariamente paralelas. Las transformaciones afines son un subconjunto de transformaciones proyectivas.

Para una transformación proyectiva:

<math display="block">
<mrow>
<mo stretchy="false">[</mo>
<mspace width="0.16666666666666666em"></mspace>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>u</mi>
<mi>p</mi>
<mspace width="0.5em"></mspace>
<mi>v</mi>
<mi>p</mi>
<mspace width="0.5em"></mspace>
<mi>w</mi>
<mi>p</mi>
</mrow>
</mtd>
</mtr>
</mtable>
<mspace width="0.16666666666666666em"></mspace>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mo stretchy="false">[</mo>
<mspace width="0.16666666666666666em"></mspace>
<mtable columnalign="center center">
<mtr>
<mtd>
<mrow>
<mi>x</mi>
<mspace width="0.5em"></mspace>
<mi>y</mi>
<mspace width="0.5em"></mspace>
<mi>w</mi>
</mrow>
</mtd>
</mtr>
</mtable>
<mspace width="0.16666666666666666em"></mspace>
<mo stretchy="false">]</mo>
<mspace width="0.16666666666666666em"></mspace>
<mi>T</mi>
</mrow>
</math>

<math display="block">
<mrow>
<mi>u</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>u</mi>
<mi>p</mi>
</mrow>
<mrow>
<mi>w</mi>
<mi>p</mi>
</mrow>
</mfrac>
</mrow>
</math>

<math display="block">
<mrow>
<mi>v</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>v</mi>
<mi>p</mi>
</mrow>
<mrow>
<mi>w</mi>
<mi>p</mi>
</mrow>
</mfrac>
</mrow>
</math>

T es una matriz de 3 por 3, donde los nueve elementos pueden ser diferentes.

<math display="block">
<mrow>
<mi>T</mi>
<mo>=</mo>
<mrow>
<mo>[</mo>
<mtable columnalign="center center center">
<mtr>
<mtd>
<mrow>
<mi>A</mi>
<mspace width="0.2777777777777778em"></mspace>
<mi>D</mi>
<mspace width="0.2777777777777778em"></mspace>
<mi>G</mi>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi>B</mi>
<mspace width="0.2777777777777778em"></mspace>
<mi>E</mi>
<mspace width="0.2777777777777778em"></mspace>
<mi>H</mi>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi>C</mi>
<mspace width="0.2777777777777778em"></mspace>
<mi>F</mi>
<mspace width="0.2777777777777778em"></mspace>
<mi>I</mi>
</mrow>
</mtd>
</mtr>
</mtable>
<mo>]</mo>
</mrow>
</mrow>
</math>

La ecuación de matriz anterior es equivalente a estas dos expresiones:

<math display="block">
<mrow>
<mi>u</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>A</mi>
<mi>x</mi>
<mo>+</mo>
<mi>B</mi>
<mi>y</mi>
<mo>+</mo>
<mi>C</mi>
</mrow>
<mrow>
<mi>G</mi>
<mi>x</mi>
<mo>+</mo>
<mi>H</mi>
<mi>y</mi>
<mo>+</mo>
<mi>I</mi>
</mrow>
</mfrac>
</mrow>
</math>

<math display="block">
<mrow>
<mi>v</mi>
<mo>=</mo>
<mfrac>
<mrow>
<mi>D</mi>
<mi>x</mi>
<mo>+</mo>
<mi>E</mi>
<mi>y</mi>
<mo>+</mo>
<mi>F</mi>
</mrow>
<mrow>
<mi>G</mi>
<mi>x</mi>
<mo>+</mo>
<mi>H</mi>
<mi>y</mi>
<mo>+</mo>
<mi>I</mi>
</mrow>
</mfrac>
</mrow>
</math>

Intente variar cualquiera de los nueve elementos de .T

T = [1  0  0.002;       1  1  0.0002;      0  0  1   ]; t_proj = projective2d(T);     I_projective = imwarp(I,t_proj,'FillValues',fill); imshow(I_projective) title('Projective')

Imagen 6: Aplicar la transformación lineal de Piecewise a Checkerboard

En una transformación lineal por parte, las transformaciones afines se aplican por separado a las regiones de la imagen. En este ejemplo, los puntos superior izquierdo, superior derecho e inferior izquierdo del tablero de ajedrez permanecen sin cambios, pero la región triangular en la parte inferior derecha de la imagen se estira para que la esquina inferior derecha de la imagen transformada esté un 50% más a la derecha y un 20% más a la derecha y un 20% más a la derecha y un 20% más más bajo que la coordenada original.

movingPoints = [0 0; 0 nrows; ncols 0; ncols nrows;];  fixedPoints  = [0 0; 0 nrows; ncols 0; ncols*1.5 nrows*1.2];  t_piecewise_linear = fitgeotrans(movingPoints,fixedPoints,'pwl');   I_piecewise_linear = imwarp(I,t_piecewise_linear,'FillValues',fill); imshow(I_piecewise_linear) title('Piecewise Linear')

Imagen 7: Aplicar transformación sinusoidal a Checkerboard

Este ejemplo y los dos ejemplos siguientes muestran cómo puede crear una asignación explícita para asociar cada punto de una cuadrícula normal (xi,yi) con un punto diferente (ui,vi). Esta asignación se almacena en un objeto, que se utiliza para transformar la imagen.geometricTranform2dimwarp

En esta transformación sinusoidal, la coordenada x de cada píxel no cambia. La coordenada y de cada fila de píxeles se desplaza hacia arriba o hacia abajo siguiendo un patrón sinusoidal.

a = ncols/12; % Try varying the amplitude of the sinusoid ifcn = @(xy) [xy(:,1), xy(:,2) + a*sin(2*pi*xy(:,1)/nrows)]; tform = geometricTransform2d(ifcn);  I_sinusoid = imwarp(I,tform,'FillValues',fill); imshow(I_sinusoid); title('Sinusoid')

Imagen 8: Aplicar la transformación de barril a Checkerboard

La distorsión de barril perturba una imagen radialmente hacia afuera desde su centro. La distorsión es mayor desde el centro, lo que resulta en lados convexos.

En primer lugar, defina una función que asigne índices de píxeles a la distancia desde el centro. Utilice la función para crear matrices de la coordenada X y la coordenada y de cada píxel, con el origen en la esquina superior izquierda de la imagen.meshgrid

[xi,yi] = meshgrid(1:ncols,1:nrows);

Cambie el origen al centro de la imagen. A continuación, convierta las coordenadas x e y cartesianas en coordenadas de ángulo cilíndrico ( ) y radio ( ) utilizando la función. cambia linealmente a medida que aumenta la distancia desde el píxel central.thetarcart2polr

xt = xi - ncols/2; yt = yi - nrows/2; [theta,r] = cart2pol(xt,yt);

Defina la amplitud, , del término cúbico.a Este parámetro es ajustable. A continuación, agregue un término cúbico para que cambie no linealmente con la distancia desde el píxel central.rr

a = 1; % Try varying the amplitude of the cubic term. rmax = max(r(:)); s1 = r + r.^3*(a/rmax.^2);

Vuelva a convertir al sistema de coordenadas cartesiano. Vuelva a desplazar el origen a la esquina superior derecha de la imagen.

[ut,vt] = pol2cart(theta,s1); ui = ut + ncols/2; vi = vt + nrows/2;

Almacene la asignación entre ( , ) y ( , ) en un objeto.xiyiuivigeometricTranform2d Se utiliza para transformar la imagen según la asignación de píxeles.imwarp

ifcn = @(c) [ui(:) vi(:)]; tform = geometricTransform2d(ifcn);  I_barrel = imwarp(I,tform,'FillValues',fill); imshow(I_barrel) title('Barrel')

Imagen 9: Aplicar la transformación pin cushion a Checkerboard

La distorsión pin-cojín es la inversa de la distorsión del barril porque el término cúbico tiene una amplitud negativa. La distorsión es aún mayor desde el centro, pero la distorsión aparece como lados cóncavos.

Puede comenzar con los mismos y valores que para la transformación del barril.thetar Defina una amplitud diferente, b, del término cúbico. Este parámetro es ajustable. A continuación, reste un término cúbico para que cambie no linealmente con la distancia desde el píxel central.rr

b = 0.4; % Try varying the amplitude of the cubic term. s = r - r.^3*(b/rmax.^2);

Vuelva a convertir al sistema de coordenadas cartesiano. Vuelva a desplazar el origen a la esquina superior derecha de la imagen.

[ut,vt] = pol2cart(theta,s); ui = ut + ncols/2; vi = vt + nrows/2;

Almacene la asignación entre ( , ) y ( , ) en un objeto.xiyiuivigeometricTranform2d Se utiliza para transformar la imagen según la asignación de píxeles.imwarp

ifcn = @(c) [ui(:) vi(:)]; tform = geometricTransform2d(ifcn); I_pin = imwarp(I,tform,'FillValues',fill); imshow(I_pin) title('Pin Cushion')

figure subplot(3,3,1),imshow(I),title('Original') subplot(3,3,2),imshow(I_nonreflective_similarity),title('Nonreflective Similarity') subplot(3,3,3),imshow(I_similarity),title('Similarity') subplot(3,3,4),imshow(I_affine),title('Affine') subplot(3,3,5),imshow(I_projective),title('Projective') subplot(3,3,6),imshow(I_piecewise_linear),title('Piecewise Linear') subplot(3,3,7),imshow(I_sinusoid),title('Sinusoid') subplot(3,3,8),imshow(I_barrel),title('Barrel') subplot(3,3,9),imshow(I_pin),title('Pin Cushion')

Resumen: Mostrar todas las transformaciones geométricas de Checkerboard

Tenga en cuenta que cambia la escala de las imágenes que se muestran.subplot

Consulte también

Funciones

Objetos

Temas relacionados