Estoy tratando de implementar el Filtro de Wiener para realizar la deconvolución en imagen borrosa. Mi aplicación es como este

import numpy as np
from numpy.fft import fft2, ifft2

def wiener_filter(img, kernel, K = 10):
    dummy = np.copy(img)
    kernel = np.pad(kernel, [(0, dummy.shape[0] - kernel.shape[0]), (0, dummy.shape[1] - kernel.shape[1])], 'constant')
    # Fourier Transform
    dummy = fft2(dummy)
    kernel = fft2(kernel)
    kernel = np.conj(kernel) / (np.abs(kernel) ** 2 + K)
    dummy = dummy * kernel
    dummy = np.abs(ifft2(dummy))
    return np.uint8(dummy)

Esta aplicación se basa en la La Página De La Wiki.

La imagen TIFF se utiliza es de : http://www.ece.rice.edu/~wakin/images/lena512color.tiff

Pero aquí es una versión PNG a continuación :

El Filtro de Wiener para mejorar la imagen

Tengo una imagen de entrada de movimiento borrosa por una diagonal kernel y algunos gaussiano aditivo ruido añadido. La lena imagen es de 512×512 y la fusión del núcleo es 11×11.

Cuando aplico mi wiener_filter a esta imagen, el resultado es como este.
El Filtro de Wiener para mejorar la imagen.

Creo que este deblurred imagen no es de buena calidad. Así que me gustaría preguntar si mi aplicación es correcta.

Muchas gracias!

Actualización de la forma en que puedo añadir ruido.

from scipy.signal import gaussian, convolve2d

def blur(img, mode = 'box', block_size = 3):
    # mode = 'box' or 'gaussian' or 'motion'
    dummy = np.copy(img)
    if mode == 'box':
        h = np.ones((block_size, block_size)) / block_size ** 2
    elif mode == 'gaussian':
        h = gaussian(block_size, block_size / 3).reshape(block_size, 1)
        h = np.dot(h, h.transpose())
        h /= np.sum(h)
    elif mode == 'motion':
        h = np.eye(block_size) / block_size
    dummy = convolve2d(dummy, h, mode = 'valid')
    return np.uint8(dummy), h

def gaussian_add(img, sigma = 5):
    dummy = np.copy(img).astype(float)
    gauss = np.random.normal(0, sigma, np.shape(img))
    # Additive Noise
    dummy = np.round(gauss + dummy)
    # Saturate lower bound
    dummy[np.where(dummy < 0)] = 0
    # Saturate upper bound
    dummy[np.where(dummy > 255)] = 255
    return np.uint8(dummy)
  • acaba de salir de interés.. lo que sucede cuando se ejecuta un «enfocar» la convolución en el nuevo (borrosa) de la imagen. ¿Solución?
  • Soy nuevo en el procesamiento de la imagen. Es la nitidez del kernel que quieres decir aquí algo como (lapacian matriz + 1 centrado por 0 de la matriz)? Gracias. @VC.Uno
  • No importa la he probado y sólo agudiza el (ángulo) desenfoque de movimiento por lo que es más nítidas, pero también tiene un aspecto «sucio».
InformationsquelleAutor yc2986 | 2016-02-04

3 Comentarios

  1. 3

    Uso skimage.de la restauración.wiener, que se utiliza generalmente como:

    >>> from skimage import color, data, restoration
    >>> img = color.rgb2gray(data.astronaut())
    >>> from scipy.signal import convolve2d
    >>> psf = np.ones((5, 5)) / 25
    >>> img = convolve2d(img, psf, 'same')
    >>> img += 0.1 * img.std() * np.random.standard_normal(img.shape)
    >>> deconvolved_img = restoration.wiener(img, psf, 1100)

    También lo he usado en: Mejorar una imagen con scikit-imagen.

  2. 2

    Para la comparación de los datos, usted puede encontrar un ejemplo de aplicación de filtrado de Wiener y unsupervisived filtrado de Wiener en

    http://scikit-image.org/docs/dev/auto_examples/plot_restoration.html

    Si los datos de la imagen original, que puede ser capaz de ayudar.

    EDITAR: enlace Original parece estar abajo, intente esto:
    http://scikit-image.org/docs/dev/auto_examples/filters/plot_restoration.html

    • Mi entrada es un colorido lena imagen proporcionada por este enlace: ece.rice.edu/~wakin/images/lena512color.tiff. Yo estaba cargando esta imagen con PIL Imagen y convertir a RGB. He añadido un convolucional de ruido y otro de ruido aditivo gaussiano con un relativamente pequeño de la desviación estándar.
    • Su enlace es hacia abajo
    • Corregido el enlace que aparece arriba, gracias.
  3. 0

    Podríamos intentar sin supervisión weiner demasiado (deconvolución con una Wiener Caza de enfoque, donde el hyperparameters son automáticamente estimado, a partir de un punto de vista estocástico proceso iterativo (muestreador de Gibbs), como se describe aquí):

    deconvolved, _ = restoration.unsupervised_wiener(im, psf)

Dejar respuesta

Please enter your comment!
Please enter your name here