HOWTO · MATLAB
Cómo aplicar transformaciones geométricas a imágenes en MATLAB
Aplica una transformación geométrica 2D a una imagen en MATLAB con imwarp y, a continuación, elige cómo se interpola y se delimita la salida.
En esta página
Usa la función imwarp de MATLAB para aplicar una transformación geométrica a una imagen. Crea o selecciona un objeto de transformación, pásalo junto con la imagen a imwarp y elige una vista de salida cuando necesites controlar los límites resultantes. Los ejemplos de procesamiento de imágenes con MATLAB que aparecen a continuación ilustran la sintaxis y no se ejecutaron aquí; el ejemplo independiente de Octave solo informa de su cálculo de coordenadas. Para los límites de salida, affineOutputView usa el argumento nombre-valor BoundsStyle; BoundingStyle no es la grafía de la API.
Aplicar transformaciones geométricas a imágenes en MATLAB
Una transformación geométrica cambia la ubicación de los píxeles de una imagen; por ejemplo, puede rotarla, reflejarla, escalarla, cizallarla o trasladarla. Para una transformación afín 2D, affine2d acepta una matriz de 3 por 3. MATLAB usa coordenadas de vectores fila, por lo que la fila final contiene las traslaciones en x e y. La clase correspondiente para transformaciones 3D, affine3d, usa una matriz de 4 por 4.
La llamada básica de MATLAB es outputImage = imwarp(inputImage, transform). La imagen puede ser numérica, lógica o categórica.
Esta ilustración de coordenadas en Octave calcula la ubicación transformada de un punto; no aplica una transformación a los píxeles de una imagen mediante imwarp de MATLAB.
T = [1 0 0; 0.5 1 0; 1 0 1];
point = [2 3 1] * T;
printf('x = %.1f, y = %.1f\n', point(1), point(2));
La salida observada es la siguiente:
x = 4.5, y = 3.0
Un ejemplo completo de MATLAB lee cameraman.tif, crea una transformación affine2d, la aplica con imwarp y muestra el resultado. MATLAB usa coordenadas de vectores fila, por lo que esta matriz aplica cizallamiento y traslación:
inputImage = imread('cameraman.tif'); transform = affine2d([1 0 0; 0.5 1 0; 20 10 1]); outputImage = imwarp(inputImage, transform); imshow(outputImage);
La ilustración siguiente muestra una imagen transformada con affine2d; no se ha verificado si el recurso se muestra en el destino publicado.
Consulta la documentación de MathWorks sobre affine2d y affine3d.
Rotar una imagen N grados
Usa randomAffine2d con el argumento nombre-valor Rotation para crear una transformación afín 2D cuyo ángulo se selecciona del intervalo indicado. Para una rotación fija de 45 grados, usa [45 45]; un intervalo como [-10 10] permite que la función seleccione un ángulo dentro de esos límites. Pasa el objeto resultante y la imagen a imwarp. Estas llamadas de MATLAB ilustran la sintaxis; no se ejecutaron y no muestran resultados de ejecución.
La ilustración siguiente corresponde a la rotación de imagen descrita; no se ha verificado si el recurso se muestra en el destino publicado.
Reflejar, escalar, cizallar y trasladar una imagen
randomAffine2d también puede crear reflejos mediante XReflection o YReflection, activados con true. Usa Scale para indicar factores de escala, XShear o YShear para intervalos de cizallamiento y XTranslation o YTranslation para intervalos de traslación. Un factor inferior a 1 reduce la escala en el eje correspondiente; uno superior a 1 la aumenta. Estos parámetros aceptan intervalos, así que los extremos iguales indican un valor fijo. Puedes cambiar una propiedad cada vez para observar su efecto antes de combinar transformaciones. El patrón exacto de llamada de MATLAB es randomAffine2d('XReflection',true,'Scale',[1.2 1.2],'XShear',[0.1 0.1],'XTranslation',[20 20]); aplica el resultado con imwarp.
La ilustración siguiente corresponde a la reflexión, el escalado, el cizallamiento y la traslación; no se ha verificado si el recurso se muestra en el destino publicado.
Para transformaciones afines 3D, randomAffine3d proporciona el objeto de transformación correspondiente; los ejemplos de este artículo se centran en imágenes 2D. Consulta la documentación de MathWorks sobre randomAffine3d.
Configurar los bordes, la vista y los límites de la imagen de salida
imwarp admite opciones de interpolación como nearest, linear y cubic; el valor predeterminado es nearest. SmoothEdges controla el suavizado en los bordes de salida. Las dimensiones de salida dependen de la vista de salida y de los límites seleccionados, así que SmoothEdges por sí solo no determina el tamaño de la imagen.
Crea una vista de salida con affineOutputView(size(inputImage), transform, 'BoundsStyle', 'CenterOutput') y pásala después a imwarp mediante 'OutputView', outputView. BoundsStyle acepta CenterOutput, FollowOutput o SameAsInput; SameAsInput conserva una vista del mismo tamaño que la entrada, mientras que las otras opciones determinan los límites con respecto a la imagen transformada. El patrón pertinente de llamada de MATLAB es outputView = affineOutputView(size(inputImage), transform, 'BoundsStyle', 'SameAsInput'), seguido de outputImage = imwarp(inputImage, transform, 'SmoothEdges', true, 'OutputView', outputView). Estas llamadas ilustran la sintaxis y no se ejecutaron.
La ilustración siguiente muestra una imagen de salida con opciones de imwarp; no se ha verificado si el recurso se muestra en el destino publicado.
Consulta la documentación de MathWorks sobre affineOutputView y imwarp.