2016-02-04 286 views
3

我想实现维纳滤波器对模糊图像执行去卷积。我的实现是这样的维纳滤波器的图像去模糊

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) 

此实现基于Wiki Page

使用的TIFF图像是:http://www.ece.rice.edu/~wakin/images/lena512color.tiff
但这里是低于PNG版本:

我有一个对角线内核和一些高斯加性噪声迷离输入图像的运动加入到它。 lena图片是512x512,模糊内核是11x11。

当我将wiener_filter应用于此图像时,结果如下所示。 enter image description here

我觉得这个deblurred图像质量不好。所以我想问一下我的实施是否正确。

非常感谢!

更新我添加噪音的方式。

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) 
+0

只是出于兴趣..当你对新(模糊)图像运行“锐化”卷积时会发生什么。它修复了吗? –

+0

我是图像处理新手。这里的锐化内核是什么意思?(lapacian矩阵+ 1以0s矩阵为中心)?谢谢。 @ VC.One – yc2986

+0

没关系,我测试过,它只是削尖(有角度)的运动模糊,所以它更清脆,但看起来“脏”。 –

回答

2

进行数据比较,你可以在

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

发现维纳滤波和unsupervisived维纳滤波的样本实现。如果你给你的原始图像数据,我们也许能够进一步帮助。

编辑:原文链接似乎下去,试试这个: http://scikit-image.org/docs/dev/auto_examples/filters/plot_restoration.html

+0

我的输入是这个链接提供的多彩莱纳图像:http://www.ece.rice.edu/~wakin/images/lena512color.tiff。我正在使用PIL Image加载此图像并将其转换为RGB。我添加了一个卷积噪声和另一个标准差较小的加性高斯噪声。 – yc2986

+1

@tfv:您的链接已关闭 – CpCd0y

+1

@ CpCd0y更正了上面列出的链接,谢谢。 – tfv

1

使用skimage.restoration.wiener,通常使用这样的:

>>> 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) 

我还用它:Deblur an image using scikit-image