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.

Desblurring imágenes utilizando el algoritmo de Lucy-Richardson

Este ejemplo muestra cómo utilizar el algoritmo de Lucy-Richardson para enfoque vibración imágenes. Se puede utilizar eficazmente cuando se conoce la función de dispersión de puntos PSF (operador de desenfoque), pero poca o ninguna información está disponible para el ruido. La imagen borrosa y ruidosa es restaurada por el algoritmo iterativo, acelerado y amortiguado de Lucy-Richardson. Puede utilizar las características del sistema óptico como parámetros de entrada para mejorar la calidad de la restauración de la imagen.

Paso 1: leer imagen

El ejemplo se lee en una imagen RGB y la recorta para que sea 256-by-256-by-3. La función puede manejar matrices de cualquier dimensión.deconvlucy

I = imread('board.tif'); I = I(50+(1:256),2+(1:256),:); figure; imshow(I); title('Original Image'); text(size(I,2),size(I,1)+15, ...     'Image courtesy of courtesy of Alexander V. Panasyuk, Ph.D.', ...     'FontSize',7,'HorizontalAlignment','right'); text(size(I,2),size(I,1)+25, ...     'Harvard-Smithsonian Center for Astrophysics', ...     'FontSize',7,'HorizontalAlignment','right');

Paso 2: simular un desenfoque y ruido

Simular una imagen de la vida real que podría ser borrosa debido al movimiento de la cámara o la falta de enfoque. La imagen también podría ser ruidosa debido a perturbaciones aleatorias. El ejemplo simula el desenfoque mediante la conformación de un filtro Gaussiano con la imagen verdadera (utilizando).imfilter El filtro gaussiano representa entonces una función de dispersión de puntos,.PSF

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

El ejemplo simula el ruido añadiendo un ruido Gaussiano de varianza a la imagen borrosa (utilizando).Vimnoise La varianza de ruido se utiliza posteriormente para definir un parámetro de amortiguación del algoritmo.V

V = .002; BlurredNoisy = imnoise(Blurred,'gaussian',0,V); figure; imshow(BlurredNoisy); title('Blurred & Noisy');

Paso 3: restaura la imagen borrosa y ruidosa

Restaure la imagen borrosa y ruidosa que proporciona el PSF y usando solamente 5 iteraciones (el valor por defecto es 10). La salida es una matriz del mismo tipo que la imagen de entrada.

luc1 = deconvlucy(BlurredNoisy,PSF,5); figure; imshow(luc1); title('Restored Image, NUMIT = 5');

Paso 4: iterar para explorar la restauración

La imagen resultante cambia con cada iteración. Para investigar la evolución de la restauración de imágenes, puede hacer la deconvolución en pasos: realizar un conjunto de iteraciones, ver el resultado y, a continuación, reanudar las iteraciones desde donde se detuvieron. Para ello, la imagen de entrada debe pasarse como parte de una matriz de celdas. Por ejemplo, inicie el primer conjunto de iteraciones pasando en lugar de como parámetro de imagen de entrada.{BlurredNoisy}BlurredNoisy

luc1_cell = deconvlucy({BlurredNoisy},PSF,5);

En ese caso, la salida, se convierte en una matriz de celdas.luc1_cell La salida de celda consta de cuatro matrices numéricas, donde la primera es la imagen, la segunda es la imagen restaurada de la clase Double, la tercera matriz es el resultado de la iteración de una antes de la última, y la cuarta matriz es un parámetro interno del conjunto iterado.BlurredNoisy La segunda matriz numérica de la matriz de celdas de salida, Image, es idéntica a la matriz de salida del paso 3, imagen, con una posible excepción de su clase (la salida de celda siempre da la imagen restaurada de la clase Double).luc1_cell{2}luc1

Para reanudar las iteraciones, tome la salida de la llamada de función anterior, la matriz de celdas, y párela en la función.luc1_celldeconvlucy Utilice el número predeterminado de iteraciones (= 10).NUMIT La imagen restaurada es el resultado de un total de 15 iteraciones.

luc2_cell = deconvlucy(luc1_cell,PSF); luc2 = im2uint8(luc2_cell{2}); figure; imshow(luc2); title('Restored Image, NUMIT = 15');

Paso 5: control de amplificación de ruido por amortiguación

La última imagen,, es el resultado de 15 iteraciones.luc2 Aunque es más agudo que el resultado anterior de 5 iteraciones, la imagen desarrolla una apariencia "moteada". Las manchas no corresponden a ninguna estructura real (compárela con la imagen verdadera), sino que son el resultado de ajustar el ruido en los datos demasiado de cerca.

Para controlar la amplificación de ruido, utilice la opción de amortiguación especificando el parámetro. tiene que ser de la misma clase que la imagen de entrada.DAMPARDAMPAR El algoritmo amortigua los cambios en el modelo en las regiones donde las diferencias son pequeñas en comparación con el ruido. El utilizado aquí es igual a 3 desviaciones estándar del ruido.DAMPAR Observe que la imagen es más suave.

DAMPAR = im2uint8(3*sqrt(V)); luc3 = deconvlucy(BlurredNoisy,PSF,15,DAMPAR); figure; imshow(luc3); title('Restored Image with Damping, NUMIT = 15');

La siguiente parte de este ejemplo explora los parámetros de entrada de la función deconvlucy, utilizando una imagen de estrella simulada (por simplicidad y velocidad).WEIGHTSUBSMPL

Paso 6: crear imagen de muestra

El ejemplo crea una imagen en blanco y negro de cuatro estrellas.

I = zeros(32); I(5,5) = 1; I(10,3) = 1; I(27,26) = 1; I(29,25) = 1; figure; imshow(1-I,[],'InitialMagnification','fit'); ax = gca; ax.Visible = 'on'; ax.XTickLabel = []; ax.YTickLabel = []; ax.XTick = [7 24]; ax.XGrid = 'on'; ax.YTick = [5 28]; ax.YGrid = 'on'; title('Data');

Paso 7: simular un desenfoque

El ejemplo simula un desenfoque de la imagen de las estrellas mediante la creación de un filtro gaussiano, y la Convolving con la imagen verdadera.PSF

PSF = fspecial('gaussian',15,3); Blurred = imfilter(I,PSF,'conv','sym');

Ahora simular una cámara que sólo puede observar parte de las imágenes de las estrellas (sólo se ve el desenfoque). Cree una matriz de funciones de ponderación, WEIGHT, que esté formada por las que se encuentran en la parte central de la imagen borrosa (píxeles "buenos", situadas dentro de las líneas discontinuas) y ceros en los bordes (píxeles "defectuosos", los que no reciben la señal).

WT = zeros(32); WT(6:27,8:23) = 1; CutImage = Blurred.*WT;

Para reducir el timbre asociado a los bordes, aplique la función edgetaper con el PSF dado.

CutEdged = edgetaper(CutImage,PSF); figure; imshow(1-CutEdged,[],'InitialMagnification','fit'); ax = gca; ax.Visible = 'on'; ax.XTickLabel = []; ax.YTickLabel = []; ax.XTick = [7 24]; ax.XGrid = 'on'; ax.YTick = [5 28]; ax.YGrid = 'on'; title('Observed');

Paso 8: proporcionar la matriz de peso

El algoritmo pondera cada valor de píxel según la matriz WEIGHT mientras restaura la imagen. En nuestro ejemplo, solo se usan los valores de los píxeles centrales (donde WEIGHT = 1), mientras que los valores de píxel "malos" se excluyen de la optimización. Sin embargo, el algoritmo puede colocar la potencia de la señal en la ubicación de estos píxeles "malos", más allá del borde de la vista de la cámara. Observe la precisión de las posiciones de las estrellas resueltas.

luc4 = deconvlucy(CutEdged,PSF,300,0,WT); figure; imshow(1-luc4,[],'InitialMagnification','fit'); ax = gca; ax.Visible = 'on'; ax.XTickLabel = []; ax.YTickLabel = []; ax.XTick = [7 24]; ax.XGrid = 'on'; ax.YTick = [5 28]; ax.YGrid = 'on'; title('Restored');

Paso 9: proporcione un PSF más fino muestreado

deconvlucy puede restaurar la imagen submuestreada dado un PSF muestreado más fino (más fino por los tiempos de SUBSMPL). Para simular la imagen mal resuelta y PSF, el ejemplo bins la imagen y el PSF original, dos píxeles en uno, en cada dimensión.Blurred

Binned = squeeze(sum(reshape(Blurred,[2 16 2 16]))); BinnedImage = squeeze(sum(Binned,2)); Binned = squeeze(sum(reshape(PSF(1:14,1:14),[2 7 2 7]))); BinnedPSF = squeeze(sum(Binned,2)); figure; imshow(1-BinnedImage,[],'InitialMagnification','fit'); ax = gca; ax.Visible = 'on'; ax.XTick = []; ax.YTick = []; title('Binned Observed');

Restaure la imagen infrmuestreada, utilizando el PSF submuestreado,.BinnedImageBinnedPSF Observe que la imagen distingue solo 3 estrellas.luc5

luc5 = deconvlucy(BinnedImage,BinnedPSF,100); figure; imshow(1-luc5,[],'InitialMagnification','fit'); ax = gca; ax.Visible = 'on'; ax.XTick = []; ax.YTick = []; title('Poor PSF');

En el siguiente ejemplo se restaura la imagen infrmuestreada (), esta vez utilizando el PSF más fino (definido en una cuadrícula más fina de SUBSMPL-Times).BinnedImage La imagen reconstruida () resuelve la posición de las estrellas con mayor precisión.luc6 Observe cómo distribuye el poder entre las dos estrellas en la esquina inferior derecha de la imagen. Esto sugiere la existencia de dos objetos brillantes, en lugar de uno, como en la restauración anterior.

luc6 = deconvlucy(BinnedImage,PSF,100,[],[],[],2); figure; imshow(1-luc6,[],'InitialMagnification','fit'); ax = gca; ax.Visible = 'on'; ax.XTick = []; ax.YTick = []; title('Fine PSF');

Consulte también

| | |

Temas relacionados