Aplicar transformación geométrica a imágenes en MATLAB

Ammar Ali 15 febrero 2024
Aplicar transformación geométrica a imágenes en MATLAB

Este tutorial discutirá la aplicación de la transformación geométrica a una imagen usando la función imwarp() en MATLAB.

Aplicar transformación geométrica a imágenes en MATLAB

La transformación geométrica transforma las imágenes de acuerdo con nuestros requisitos, como rotar, cambiar el tamaño y cortar imágenes. Podemos usar la función imwarp() en MATLAB para aplicar una transformación geométrica a una imagen.

Una imagen consta de píxeles colocados en ubicaciones específicas. La función imwrap() cambia la ubicación de los píxeles según el objeto de transformación dado.

Por ejemplo, si queremos voltear una imagen verticalmente, solo tenemos que cambiar la posición de los píxeles presentes en la imagen. La fila superior de píxeles se intercambiará con la última fila de píxeles presente en la imagen dada.

La sintaxis básica de la función imwarp() se proporciona a continuación.

output_image = imwarp(input_image, geo_tran);

Podemos usar la sintaxis anterior para aplicar una transformación geométrica dada geo_tran a una imagen de entrada input_image, y el resultado se almacenará dentro de output_image. La imagen de entrada puede ser una imagen numérica, lógica o categórica.

Podemos crear un objeto o matriz de transformación geométrica 2D utilizando la función affine2d() de MATLAB. Tenemos que definir una matriz de 3 por 3 dentro de la función affine2d() para crear el objeto de transformación y pasarlo dentro de la función imwarp() para aplicarlo a la imagen dada.

Por ejemplo, usemos la imagen de la cámara ya almacenada en MATLAB y apliquemos una transformación geométrica usando la función imwarp().

Vea el código a continuación.

clc

Img = imread('cameraman.tif');
imshow(Img)
gform = affine2d([1 0 0; .5 1 0; 1 0 1])
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

Producción:

transformación usando affine2d

En el resultado anterior, podemos ver que la imagen del lado derecho ha cambiado y el único cambio está en la ubicación de los píxeles. También podemos cambiar la matriz de transformación según la imagen dada y el tipo de salida que queremos obtener de la función.

Consulte este enlace para obtener más detalles sobre la función affine2d(). Si queremos crear una matriz de transformación geométrica para una imagen 3d, podemos usar la función affine3d() de MATLAB.

En el caso de affine3d(), la matriz de entrada debe tener un tamaño de 4 por 4. Consulte este enlace para obtener más detalles sobre la función affine3d().

Rotar una imagen por N grados

Para rotar una imagen, podemos usar la función randomaffine2d() para crear un objeto de transformación afín 2D aleatorio y luego pasarlo junto con la imagen dada dentro de la función imwarp() para aplicar la transformación a la imagen dada. Podemos usar el argumento Rotación de la función randomaffine2d(), y después de eso, tenemos que establecer el ángulo o el rango del ángulo para crear una transformación para rotar la imagen dada.

Por ejemplo, giremos la imagen de arriba 45 grados. Vea el código a continuación.

clc

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

Producción:

Rotación de imagen usando imwarp

En el código anterior, aplicamos el mismo valor de 45 dos veces, pero también podemos proporcionar un rango y la función elegirá un ángulo aleatorio del rango para crear el objeto de transformación.

Reflejar, escalar, distorsionar y trasladar una imagen

Para crear el reflejo del eje x o y de la imagen, podemos usar los argumentos XReflection y YReflection. Después de definir el nombre del argumento, tenemos que pasar “true” porque, por defecto, estos argumentos están configurados como “false”.

El argumento de reflexión volteará la imagen horizontal o verticalmente. También podemos cortar una imagen, lo que significa mover una parte de la imagen en una dirección y la otra parte en la dirección opuesta.

También podemos aplicar el corte del eje x o y usando los argumentos XShear y YShear, y después de eso, tenemos que establecer el valor como un vector de 2 elementos. También podemos escalar la imagen usando el argumento scale de la función randomaffine2d().

Si el valor de la escala es inferior a 1, el tamaño de la imagen disminuirá; si es mayor que 1, aumentará. También podemos traducir una imagen en el eje x o y usando los argumentos XTranslation y YTranslation, y después de eso, tenemos que definir la matriz de 2 elementos para la traducción.

Por ejemplo, cambiemos las propiedades mencionadas anteriormente y veamos el resultado. Vea el código a continuación.

clc
clear

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[15 15],'XTranslation',[20 20]);
Jmg = imwarp(Img,gform);
figure
imshow(Jmg)

Producción:

Cambiar las propiedades de la transformación

Podemos cambiar cada propiedad por separado para ver su resultado en la imagen original. Consulte este enlace para obtener más detalles sobre la función randomaffine2d().

En el caso de una imagen 3D, podemos usar la función randomaffine3d() para crear un objeto de transformación 3D, y podemos cambiar sus propiedades de la misma manera que cambiamos las propiedades de la función randomaffine2d(). Consulte este enlace para obtener más detalles sobre la función randomaffine3d().

Establecer bordes, vista y estilo de delimitación de la imagen de salida

También podemos alterar las propiedades de la función imwarp() como el método de interpolación, que está configurado como más cercano por defecto, y podemos cambiarlo a lineal o cúbico. En algunos casos, los bordes de la imagen de salida no son suaves, pero podemos usar el argumento SmoothEdges dentro de la función imwarp() para obtener bordes suaves.

También podemos cambiar la vista de salida de la imagen de salida usando el argumento OutputView, y después de eso, tenemos que pasar un objeto de vista creado usando la función affineOutputView(). El primer argumento de la función affineOutputView() es el tamaño de la imagen de entrada, y el segundo argumento es el objeto de transformación.

El tercer argumento opcional, BoundingStyle, se utiliza para establecer el estilo de delimitación de la imagen de salida. Hay tres tipos de estilos disponibles: CenterOutput, FollowOutput y SameAsInput.

Por ejemplo, cambiemos las propiedades de la función imwarp() mencionada anteriormente. Vea el código a continuación.

clc
clear

Img = imread('cameraman.tif');
imshow(Img)
gform = randomAffine2d('Rotation',[45 45]);
Output_view = affineOutputView(size(Img),gform,'BoundsStyle','CenterOutput');
Jmg = imwarp(Img,gform,'SmoothEdges',true,'OutputView',Output_view);
figure
imshow(Jmg)

Producción:

Cambio de propiedades de imwarp

La imagen de la derecha (imagen de salida) tiene el mismo tamaño que la imagen de entrada porque hemos usado el argumento de bordes suaves. Si no usamos el argumento de bordes suaves, el tamaño de la imagen de salida aumentará, lo que también se muestra en el primer ejemplo de rotación de la imagen.

Consulte este enlace(https://www.mathworks.com/help/images/ref/affineoutputview.html) para obtener más detalles sobre la función affineOutputView(). Consulte este enlace(https://www.mathworks.com/help/images/ref/affineoutputview.html) para obtener más detalles sobre la función imwarp().

Autor: Ammar Ali
Ammar Ali avatar Ammar Ali avatar

Hello! I am Ammar Ali, a programmer here to learn from experience, people, and docs, and create interesting and useful programming content. I mostly create content about Python, Matlab, and Microcontrollers like Arduino and PIC.

LinkedIn Facebook

Artículo relacionado - MATLAB Image