Contenido principal

La traducción de esta página aún no se ha actualizado a la versión más reciente. Haga clic aquí para ver la última versión en inglés.

Utilizar la correlación de fase como paso de preprocesamiento en el registro

Este ejemplo muestra cómo utilizar la correlación de fase como paso preliminar para el registro automático de imágenes. En este proceso, se realiza la correlación de fase mediante imregcorr y luego se pasa el resultado de ese registro como condición inicial de un registro basado en optimización utilizando imregister. La correlación de fase y el registro basado en optimización son algoritmos complementarios. La correlación de fase es adecuada para encontrar la alineación general, incluso para imágenes muy desalineadas. El registro basado en optimización es adecuado para encontrar una alineación precisa, dada una buena condición inicial.

Lea una imagen que será la imagen de referencia en el registro.

fixed = imread("cameraman.tif");
imshow(fixed)

Figure contains an axes object. The hidden axes object contains an object of type image.

Cree una imagen no registrada distorsionando deliberadamente esta imagen mediante rotación, escalado isotrópico y cizallado en la dirección y.

theta = 170;
rot = [
    cosd(theta) -sind(theta) 0; ... 
    sind(theta)  cosd(theta) 0; ... 
    0 0 1]; 
sc = 2.3;
scale = [sc 0 0; 0 sc 0; 0 0 1]; 
sh = 0.1;
shear = [1 sh 0; 0 1 0; 0 0 1]; 

tform = affinetform2d(shear*scale*rot);
moving = imwarp(fixed,tform); 

Añada ruido a la imagen y muestre el resultado.

moving = imnoise(moving,"gaussian");
imshow(moving)

Figure contains an axes object. The hidden axes object contains an object of type image.

Estime el registro necesario para alinear las dos imágenes. imregcorr devuelve un objeto simtform2d que define la transformación.

tformEstimate = imregcorr(moving,fixed)
tformEstimate = 
  simtform2d with properties:

    Dimensionality: 2
             Scale: 0.4182
     RotationAngle: -167.1995
       Translation: [245.7549 302.3793]
                 R: [2×2 double]

                 A: [-0.4078    0.0926  245.7549
                     -0.0926   -0.4078  302.3793
                           0         0    1.0000]

Aplique la transformación geométrica estimada a la imagen desalineada. Especifique el argumento nombre-valor OutputView para asegurarse de que la imagen registrada tenga el mismo tamaño que la imagen de referencia.

Rfixed = imref2d(size(fixed));
movingReg = imwarp(moving,tformEstimate,OutputView=Rfixed);

Muestre la imagen original y la imagen registrada en un montaje. Se puede ver que imregcorr ha gestionado correctamente las diferencias de rotación y escalado entre las imágenes. La imagen registrada, movingReg, está muy cerca de estar alineada con la imagen original, fixed. Sin embargo, aún persiste cierta desalineación. imregcorr puede gestionar bien las distorsiones de rotación y escala, pero no la distorsión de estiramiento.

imshowpair(fixed,movingReg,"montage");

Figure contains an axes object. The hidden axes object contains an object of type image.

Visualice la imagen alineada superpuesta sobre la imagen original utilizando imshowpair. En esta vista, imshowpair utiliza el color para resaltar las áreas de desalineación.

imshowpair(fixed,movingReg,"falsecolor");

Figure contains an axes object. The hidden axes object contains an object of type image.

Para finalizar el registro, utilice imregister, pasando la transformación estimada devuelta por imregcorr como condición inicial. imregister es más efectivo si las dos imágenes están aproximadamente alineadas al inicio de la operación. La transformación estimada por imregcorr proporciona esta información para imregister. El ejemplo utiliza el optimizador predeterminado y los valores métricos para un registro de dos imágenes tomadas con el mismo sensor, que es una configuración monomodal.

[optimizer,metric] = imregconfig("monomodal");
movingRegistered = imregister(moving,fixed,"affine", ...
    optimizer,metric,InitialTransformation=tformEstimate);

Muestre el resultado de este registro. Observe que imregister consigue un registro muy preciso, dada la buena condición inicial proporcionada por imregcorr.

imshowpair(fixed,movingRegistered,Scaling="joint");

Figure contains an axes object. The hidden axes object contains an object of type image.

Consulte también

| | |

Temas