【问题标题】:Wiener filter failed for blurry image by same size convolution维纳滤波器通过相同大小的卷积对模糊图像失败
【发布时间】:2019-05-27 05:23:18
【问题描述】:

我正在 MATLAB 中测试维纳滤波器以恢复模糊图像。我正在使用 conv2() 来模糊原始图像。如果我对 conv2() 使用“完整”选项,一切正常。但是当我更改为“相同”或“有效”时,恢复的图像中突然出现了很多伪影,维纳滤波器失败了。请参阅下面的模糊图像,从“完整”卷积恢复,从“相同”卷积恢复。

这是我对 Wiener 过滤器的实现:

% load image
img = rgb2gray(imread('cameraman.jpg'));
[W, H] = size(img);
dim = 300;
img_fft = fft2(img,dim,dim);
% create blur kernel
kernel = ones(5) / 25;
kernel_fft = fft2(kernel,dim,dim);
% The option here makes huge difference 'same'/'full'/'valid'
img_blur = conv2(img,kernel,'same');
img_blur_fft = fft2(img_blur,dim,dim);
% Wiener filtering
k = 1e-5;
kernel_fft_conj = conj(kernel_fft);
img_wiener_freq = kernel_fft_conj .* img_blur_fft ./ (kernel_fft .* kernel_fft_conj + k);
img_wiener_ifft = ifft2(img_wiener_freq);
img_wiener_ifft = img_wiener_ifft(1:W,1:H);

在现实生活中,模糊图像从来没有圆形或全卷积的形式,我怎样才能正确实现维纳滤波器,使其不依赖于图像的边界?

【问题讨论】:

    标签: matlab image-processing filtering convolution deconvolution


    【解决方案1】:

    您为正则化参数k 选择了一个非常小的值。这在'full' 的情况下工作得很好,因为没有噪音并且输入与预期完全匹配。但是,在'same' 的情况下,输入不完全匹配。如果您要使用循环卷积(例如通过傅里叶域中的乘法),那么您也会得到精确的结果。

    正则化参数的存在是为了防止小的偏差炸毁和破坏整个输出图像。

    我使用k = 1e-2 得到了合理的结果(1e-1 使图像模糊,1e-3 仍然在整个图像中显示很多伪影,但可以进一步微调这个值,我没有放更多比这更努力)。


    这是我使用的代码,有一些重要的区别:

    img = imread('cameraman.tif');
    % create blur kernel
    kernel = ones(5) / 25;
    % The option here makes huge difference 'same'/'full'/'valid'
    img_blur = conv2(img,kernel,'same');
    img_blur_fft = fft2(img_blur);
    % Wiener filtering
    kernel_fft = padarray(kernel,size(img)-size(kernel),0,'post');
    kernel_fft = circshift(kernel_fft,-floor(size(kernel)/2));
    kernel_fft = fft2(kernel_fft);
    k = 1e-2;
    kernel_fft_conj = conj(kernel_fft);
    img_wiener_freq = kernel_fft_conj .* img_blur_fft ./ (kernel_fft .* kernel_fft_conj + k);
    img_wiener_ifft = ifft2(img_wiener_freq);
    
    1. 请注意,我没有将大小参数用于fft2ifft2 函数。在这种情况下,最好不要用零填充图像。

    2. kernel 图像以非常特殊的方式填充。 FFT 假设原点位于输入的左上角像素中。 fft2(kernel,dim,dim) 导致用零填充内核的右侧和底部,但这会使内核相对于 FFT 的原点发生偏移。这种移动也会导致反卷积图像移动(仅移动 2 个像素,很难注意到,但请查看img_wiener_ifft-double(img) 以获取 OP 的代码和此代码以查看此移动)。

    【讨论】:

    • 感谢您的解释。我在看一些教科书的例子,看到了 Wiener 过滤运动模糊的几乎完美的结果,但似乎大多数都依赖于循环卷积的输入。我想知道在现实生活中,您使用 k=1e-2 得到的结果是否更符合我们的预期?
    • @Akahs:是的,这是您应该期待的。维纳反卷积不是最好的方法。有一些迭代方法通常会产生更好的结果。
    猜你喜欢
    • 2016-05-13
    • 1970-01-01
    • 2013-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-17
    相关资源
    最近更新 更多