Esta página es para la versión anterior. La página correspondiente en inglés se eliminó en la versión actual.

Desenfocar imágenes mediante el algoritmo de convolución ciega

En este ejemplo se muestra cómo utilizar la decircunvolución ciega para desenfocar imágenes. El algoritmo de decircunvolución ciega se puede utilizar eficazmente cuando no se conoce ninguna información sobre la distorsión (desenfoque y ruido). El algoritmo restaura la imagen y la función de dispersión de puntos (PSF) simultáneamente. El algoritmo de Richardson-Lucy, acelerado y amortiguado, se utiliza en cada iteración. Las características del sistema óptico adicional (p.ej. cámara) pueden utilizarse como parámetros de entrada que podrían ayudar a mejorar la calidad de la restauración de la imagen. Las restricciones PSF se pueden pasar a través de una función especificada por el usuario.

Paso 1: Leer imagen

El ejemplo se lee en una imagen de intensidad. La función deconvblind puede controlar matrices de cualquier dimensión.

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

Paso 2: Simular un desenfoque

Simular una imagen de la vida real que podría ser borrosa (por ejemplo, debido al movimiento de la cámara o la falta de enfoque). El ejemplo simula el desenfoque convolución un filtro de Gauss con la imagen verdadera (usando imfilter). El filtro de Gauss representa entonces una función de dispersión de puntos, PSF.

PSF = fspecial('gaussian',7,10); Blurred = imfilter(I,PSF,'symmetric','conv'); figure;imshow(Blurred);title('Blurred Image');

Paso 3: Restaurar la imagen borrosa usando PSFs de varios tamaños

Para ilustrar la importancia de conocer el tamaño de la verdadera PSF, este ejemplo realiza tres restauraciones. Cada vez que la reconstrucción del PSF comienza desde una matriz uniforme (una matriz de unos).

La primera restauración, J1 y P1, utiliza un array subdimensionado, UNDERPSF, para una conjetura inicial del PSF. El tamaño de la matriz UNDERPSF es de 4 píxeles más corto en cada dimensión que la verdadera PSF.

UNDERPSF = ones(size(PSF)-4); [J1, P1] = deconvblind(Blurred,UNDERPSF); figure;imshow(J1);title('Deblurring with Undersized PSF');

La segunda restauración, J2 y P2, utiliza una matriz de unos, OVERPSF, para una PSF inicial que es de 4 píxeles más largo en cada dimensión que la verdadera PSF.

OVERPSF = padarray(UNDERPSF,[4 4],'replicate','both'); [J2, P2] = deconvblind(Blurred,OVERPSF); figure;imshow(J2);title('Deblurring with Oversized PSF');

La tercera restauración, J3 y P3, utiliza una serie de unos, INITPSF, para una PSF inicial que es exactamente del mismo tamaño que el PSF verdadero.

INITPSF = padarray(UNDERPSF,[2 2],'replicate','both'); [J3, P3] = deconvblind(Blurred,INITPSF); figure;imshow(J3);title('Deblurring with INITPSF');

Paso 4: Analizando el PSF restaurado

Las tres restauraciones también producen un PSF. Las siguientes imágenes muestran cómo el análisis de la PSF reconstruida podría ayudar a adivinar el tamaño adecuado para el PSF inicial. En el PSF verdadero, un filtro de Gauss, los valores máximos están en el centro (blanco) y disminuyen en los bordes (negro).

figure; subplot(221);imshow(PSF,[],'InitialMagnification','fit'); title('True PSF'); subplot(222);imshow(P1,[],'InitialMagnification','fit'); title('Reconstructed Undersized PSF'); subplot(223);imshow(P2,[],'InitialMagnification','fit'); title('Reconstructed Oversized PSF'); subplot(224);imshow(P3,[],'InitialMagnification','fit'); title('Reconstructed true PSF');

El PSF reconstruido en la primera restauración, P1, obviamente no encaja en el tamaño restringido. Tiene una fuerte variación de la señal en las fronteras. La imagen correspondiente, J1, no muestra ninguna claridad mejorada frente a la imagen borrosa, Blurred.

El PSF reconstruido en la segunda restauración, P2, se vuelve muy liso en los bordes. Esto implica que la restauración puede manejar un PSF de menor tamaño. La imagen correspondiente, J2, muestra algunas desborrosas pero está fuertemente corrompida por el timbre.

Finalmente, el PSF reconstruido en la tercera restauración, P3, es algo intermedio entre P1 y P2. El array, P3, se asemeja muy bien a la verdadera PSF. La imagen correspondiente, J3, muestra una mejoría significativa; sin embargo todavía es corrompido por el zumbido.

Paso 5: Mejorando la restauración

El sonido de la imagen restaurada, J3, se produce a lo largo de las áreas de fuerte contraste de intensidad en la imagen y a lo largo de los bordes de la imagen. En este ejemplo se muestra cómo reducir el efecto de timbre especificando una función de ponderación. El algoritmo pondera cada píxel según el array WEIGHT mientras restaura la imagen y el PSF. En nuestro ejemplo, empezamos por encontrar los píxeles "afilados" usando la función Edge. Por ensayo y error, determinamos que un nivel de umbral deseable es 0,3.

WEIGHT = edge(Blurred,'sobel',.08);

Para ensanchar el área, usamos imdilate y pasamos en un elemento de estructuración, se.

se = strel('disk',2); WEIGHT = 1-double(imdilate(WEIGHT,se));

Los píxeles cercanos a los bordes también tienen asignado el valor 0.

WEIGHT([1:3 end-(0:2)],:) = 0; WEIGHT(:,[1:3 end-(0:2)]) = 0; figure; imshow(WEIGHT); title('Weight array');

La imagen se restaura llamando a deconvblind con la matriz WEIGHT y un mayor número de iteraciones (30). Casi todo el zumbido está suprimido.

[J, P] = deconvblind(Blurred,INITPSF,30,[],WEIGHT); figure;imshow(J);title('Deblurred Image');

Paso 6: Uso de restricciones adicionales en la restauración del PSF

En el ejemplo se muestra cómo se pueden especificar restricciones adicionales en el PSF. La función, FUN, devuelve una matriz PSF modificada que deconvblind utiliza para la siguiente iteración.

En este ejemplo, FUN modifica el PSF al recortarlo mediante P1 y P2 número de píxeles en cada dimensión y, a continuación, rellenar la matriz de nuevo a su tamaño original con ceros. Esta operación no cambia los valores en el centro del PSF, pero efectivamente reduce el tamaño del PSF por 2*P1 y 2*P2 pixels.

P1 = 2; P2 = 2; FUN = @(PSF) padarray(PSF(P1+1:end-P1,P2+1:end-P2),[P1 P2]);

La función anónima, FUN, se pasa a deconvblind último. Consulte la sección parametrización de funciones, en la documentación matemática de MATLAB, para obtener información acerca de cómo proporcionar parámetros adicionales a la función FUN.

En este ejemplo, el tamaño del PSF inicial, OVERPSF, es 4 píxeles mayor que el PSF verdadero. El ajuste P1 = 2 y P2 = 2 como parámetros en FUN efectivamente hace que el espacio valioso en OVERPSF sea del mismo tamaño que el PSF verdadero. Por lo tanto, el resultado, JF y PF, es similar al resultado de la descircunvolución con el tamaño de PSF y no FUN llamada, J y P, del paso 4.

[JF, PF] = deconvblind(Blurred,OVERPSF,30,[],WEIGHT,FUN); figure;imshow(JF);title('Deblurred Image');

Si hubiéramos utilizado el PSF inicial de gran tamaño, OVERPSF, sin la función de restricción, FUN, la imagen resultante sería similar al resultado insatisfactorio, J2, alcanzado en el paso 3.

Note, que cualquier parámetro no especificado antes de FUN puede ser omitido, como DAMPAR y READOUT en este ejemplo, sin requerir un soporte de lugar, ([]).