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.

Crea una galería de imágenes transformadas

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

Visión general

Una transformación geométrica bidimensional es un mapeo que asocia cada punto en un plano euclidiano con otro punto en 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 checkerboard

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

Después de haber ejecutado 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 reflectivas pueden incluir una rotación, un escalado 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 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 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 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 su 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)')

Tenga en cuenta que pasar el objeto de referencia espacial de salida revela 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, los triángulos similares se asignan a triángulos similares. Las transformaciones de similitud no reflectantes son un subconjunto de transformaciones de similitud.

Para una similitud, la ecuación es la misma que para una 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 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 anterior de traducción, recupere el objeto de referencia espacial de salida de la función y pase a revelar el reflejo.RIimwarpRIimshow

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

Imagen 4: aplicar transformación affine a checkerboard

En una transformación afín, las cotas x e y se pueden escalar o distorsionar 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 una matriz de 3 por 3, donde los seis elementos de la primera y segunda columnas 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áteales se asignan a cuadriláteales. 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 equivale 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>

Trate de 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 transformación lineal a Destapor a checkerboard

En una transformación lineal por tramos, las transformaciones afines se aplican por separado a las regiones de la imagen. En este ejemplo, los puntos superior izquierda, superior derecha e inferior izquierda 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 sea 50% más hacia la derecha y 20% inferior a 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 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 lejos del centro, resultando en lados convexos.

En primer lugar, defina una función que asigne los índices de píxel 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);

Desplace el origen al centro de la imagen. A continuación, convierta las coordenadas x e y de cartesiano en coordenadas de ángulo () y radio () cilíndricas utilizando la función. cambia linealmente a medida que aumenta la distancia del 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 nonlineearly 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);

Volver a convertir al sistema de coordenadas cartesianas. 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 usa para transformar la imagen de acuerdo con 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 de cojín de alfiler a checkerboard

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

Puede comenzar con los mismos valores que para la transformación de 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 nonlineearly 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);

Volver a convertir al sistema de coordenadas cartesianas. 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 usa para transformar la imagen de acuerdo con 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')

Resumen: Mostrar todas las transformaciones geométricas de checkerboard

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')

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

Consulte también

Funciones

Objetos

Temas relacionados