Main Content

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.

Buscar rotación y escala de imagen

En este ejemplo se muestra cómo alinear o registrar dos imágenes que difieren por una rotación y un cambio de escala. Puede utilizar para buscar el ángulo de rotación y el factor de escala después de seleccionar manualmente los puntos correspondientes.fitgeotrans A continuación, puede transformar la imagen distorsionada para recuperar la imagen original.

Paso 1: Leer imagen

Lea una imagen en el espacio de trabajo.

original = imread('cameraman.tif'); imshow(original) text(size(original,2),size(original,1)+15, ...     'Image courtesy of Massachusetts Institute of Technology', ...     'FontSize',7,'HorizontalAlignment','right')

scale = 0.7; distorted = imresize(original,scale); % Try varying the scale factor.  theta = 30; distorted = imrotate(distorted,theta); % Try varying the angle, theta. imshow(distorted)

Paso 2: Cambiar el tamaño y girar la imagen

Paso 3: Seleccione Puntos de Control

Usa la Herramienta Selección de Punto de Control para seleccionar al menos dos pares de puntos de control.

movingPoints = [151.52  164.79; 131.40 79.04]; fixedPoints = [135.26  200.15; 170.30 79.30];

Puede ejecutar el resto del ejemplo con estos puntos seleccionados previamente, pero intente elegir sus propios puntos para ver cómo varían los resultados.

cpselect(distorted,original,movingPoints,fixedPoints);

Guarde los puntos de control eligiendo el menú y, a continuación, la opción.ArchivoGuardar puntos en el espacio de trabajo Guarde los puntos, sobrescribiendo variables y .movingPointsfixedPoints

Paso 4: Estimar la transformación

Ajuste una transformación de similitud no reflectante a sus puntos de control.

tform = fitgeotrans(movingPoints,fixedPoints,'nonreflectivesimilarity');

Después de haber realizado los pasos 5 y 6, repita los pasos 4 a 6, pero intente usar 'affine' en lugar de 'NonreflectiveSimilarity'. ¿Qué pasa? ¿Los resultados son tan buenos como lo fueron con 'NonreflectiveSimilarity'?

Paso 5: Resolver escala y ángulo

La transformación geométrica, , contiene una matriz de transformación en .tformtform.T Puesto que sabe que la transformación incluye solo rotación y escalado, la matemática es relativamente simple para recuperar la escala y el ángulo.

Dejar

<math display="inline">
<mrow>
<mi mathvariant="normal">sc</mi>
<mo>=</mo>
<mi mathvariant="normal">scale</mi>
<mo>*</mo>
<mi mathvariant="normal">cos</mi>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="normal">theta</mi>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
</math>

Dejar

<math display="inline">
<mrow>
<mi mathvariant="normal">ss</mi>
<mtext></mtext>
<mo>=</mo>
<mtext></mtext>
<mi mathvariant="normal">scale</mi>
<mo>*</mo>
<mi mathvariant="normal">sin</mi>
<mrow>
<mo>(</mo>
<mrow>
<mi mathvariant="normal">theta</mi>
</mrow>
<mo>)</mo>
</mrow>
</mrow>
</math>

Entonces, , yTinv = invert(tform)Tinv.T =

<math display="inline">
<mrow>
<mrow>
<mo>[</mo>
<mtable>
<mtr>
<mtd>
<mrow>
<mi mathvariant="normal">sc</mi>
</mrow>
</mtd>
<mtd>
<mrow>
<mo>-</mo>
<mi mathvariant="normal">ss</mi>
</mrow>
</mtd>
<mtd>
<mrow>
<mn>0</mn>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi mathvariant="normal">ss</mi>
</mrow>
</mtd>
<mtd>
<mrow>
<mi mathvariant="normal">sc</mi>
</mrow>
</mtd>
<mtd>
<mrow>
<mn>0</mn>
</mrow>
</mtd>
</mtr>
<mtr>
<mtd>
<mrow>
<mi mathvariant="normal">tx</mi>
</mrow>
</mtd>
<mtd>
<mrow>
<mi mathvariant="normal">ty</mi>
</mrow>
</mtd>
<mtd>
<mrow>
<mn>1</mn>
</mrow>
</mtd>
</mtr>
</mtable>
<mo>]</mo>
</mrow>
</mrow>
</math>

donde y son traducciones x e y, respectivamente.txty

tformInv = invert(tform); Tinv = tformInv.T; ss = Tinv(2,1); sc = Tinv(1,1); scale_recovered = sqrt(ss*ss + sc*sc)
scale_recovered = 0.7000 
theta_recovered = atan2(ss,sc)*180/pi
theta_recovered = 29.3741 

Los valores recuperados de y deben coincidir con los valores establecidos en .scale_recoveredtheta_recoveredPaso 2: Cambiar el tamaño y girar la imagen

Paso 6: Recuperar imagen original

Recuperar la imagen original mediante la transformación, la imagen girada y escalada, utilizando la transformación geométrica y lo que sabe sobre la referencia espacial de .distortedtformoriginal El par nombre-valor 'OutputView' se utiliza para especificar la resolución y el tamaño de cuadrícula de la imagen de salida remuestreada.

Roriginal = imref2d(size(original)); recovered = imwarp(distorted,tform,'OutputView',Roriginal);

Compárelos mirándolos uno al lado del otro en un montaje.recoveredoriginal

montage({original,recovered})

La calidad de imagen (derecha) no coincide con la imagen (izquierda) debido al proceso de distorsión y recuperación.recoveredoriginal En particular, la reducción de la imagen provoca la pérdida de información. Los artefactos alrededor de los bordes se deben a la precisión limitada de la transformación. Si tuviera que elegir más puntos en , la transformación sería más precisa.Paso 3: Seleccione Puntos de Control

Consulte también

| | | | |

Temas relacionados