使用 matlab 数字图像处理(九)—— 去卷积(deconvolution,逆滤波复原)

在没有噪声的情况下,频域退化模型可由下式给出:

G(u,v)=H(u,v)F(u,v)

  • G(u,v) :退化图像;
  • H(u,v) :退化函数;
  • F(u,v) :原始图像。

则原始图像可通过退化图像和退化函数得到:

F(u,v)=G(u,v)H(u,v)

也即,如果已知退化图像和退化传递函数的频域表示就可以求得原始图像的频域表达式,随后取傅里叶逆变换即可得到原始图像:

f(x,y)=F1[F(u,v)]=F1[G(u,v)H(u,v)]

这就是所谓的去卷积(deconvolution),或叫逆滤波法。在有噪声的情况下:
G(u,v)=H(u,v)F(u,v)+N(u,v)

所以:

F(u,v)=G(u,v)H(u,v)N(u,v)H(u,v)

然而退化过程的传递函数(一般为系统特性)是不可知的,且噪声项也无法精确得到。且上式中, H(u,v) 充当分母,在很多情况下传递函数的值为 0 或接近 0,此时得到的结果往往是极度不准确的。一种解决方法是,仅对半径在一定范围内的傅里叶系数进行运算,由于通常低频系数值较大,高频系数接近于0,这种方法能大大减少遇到 0 的概率

仿真测试

  • (1)原始图像退化

    clear all; close all;
    clc
    
    I = imread('pout.tif');
    f = im2double(I);
    subplot(1, 3, 1), imshow(f), title('原始图像')
    F = fftshift(fft2(f));
    
    [M, N] = size(F);
    [u, v] = meshgrid(1:N, 1:M);
    k = 0.0025;
    H = exp(-k*((v-M/2).^2+(u-N/2).^2).^(5/6));
    
    G = F.*H;
    g = ifft2(ifftshift(G));
    g = uint8(abs(g)*255);
    subplot(1, 3, 2), imshow(g), title('退化图像')
    
    I = deconv(g, H, 128);       % 可尝试不同的半径,1281087848
    subplot(1, 3, 3), imshow(I), title('复原图像')
  • (2)去卷积函数的实现:

    function I_new = deconv(I, H, thresh)
    
    if size(I, 3) == 3,
        I = rgb2gray(I);
    end
    I = im2double(I);
    G = fftshift(fft2(I));
    [M, N] = size(G);
    F = G;
    [x, y] = meshgrid(1:N, 1:M);
    if thresh > M/2,
        F = G./(H+eps);
    else
        idx = (x-N/2).^2 + (y-M/2).^2 < thresh^2;
        F(idx) = G(idx)./(H(idx)+eps);
    end
    I_new = ifft2(ifftshift(F));
    I_new = uint8(abs(I_new)*255);

你可能感兴趣的:(数字图像处理)