Main Content

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.

Descolorando imágenes usando el algoritmo Lucy-Richardson

En este ejemplo se muestra cómo utilizar el algoritmo Lucy-Richardson para desenfocar imágenes. Se puede utilizar eficazmente cuando se conoce la función de dispersión de puntos PSF (operador de desenfoque), pero hay poca o ninguna información disponible para el ruido. La imagen borrosa y ruidoso es restaurada por el algoritmo iterativo, acelerado y amortiguado 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 por 256 por 3. La función puede controlar 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 ruidoso debido a perturbaciones aleatorias. El ejemplo simula el desenfoque convolviendo un filtro gaussiano con la imagen verdadera (usando ).imfilter A continuación, el filtro gaussiano representa 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 más adelante 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: Restaurar la imagen borrosa y ásquina

Restaure la imagen borrosa y ruidoso que proporciona el PSF y utilizando solo 5 iteraciones (el valor predeterminado 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 la imagen, puede realizar la desconvolución en pasos: realice un conjunto de iteraciones, vea el resultado y, a continuación, reanude 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 uno 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, image , 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ásela a 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 mediante amortiguación

La imagen más reciente, , es el resultado de 15 iteraciones.luc2 Aunque es más nítida que el resultado anterior de 5 iteraciones, la imagen desarrolla una apariencia "moteada". Las manchas no corresponden a ninguna estructura real (compararla 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 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 (para simplificar 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 creando un filtro gaussiano y convolviéndolo con la imagen verdadera.PSF

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

Ahora simula una cámara que solo 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 consta de las que se encuentran en la parte central de la imagen borrosa ("píxeles buenos", situados dentro de las líneas discontinuas) y ceros en los bordes ("píxeles malos" - aquellos 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 de 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: Proporcione 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 utilizan los valores de los píxeles centrales (donde PESO 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

deconvlucy puede restaurar la imagen submuestreada dada una PSF muestreada más fina (más fina por los tiempos DE SIMP). Para simular la imagen mal resuelta y PSF, el ejemplo coloca 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 submuestreada, , utilizando el PSF submuestreado, .BinnedImageBinnedPSF Observe que la imagen distingue sólo 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 ejemplo siguiente se restaura la imagen submuestreada ( ), esta vez utilizando el PSF más fino (definido en una cuadrícula de subsMPL veces más fina).BinnedImage La imagen reconstruida ( ) resuelve la posición de las estrellas con mayor precisión.luc6 Observe cómo distribuye la potencia 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