精华内容
下载资源
问答
  • 图像复原中的维纳滤波逆滤波,运动模糊,效果很好,大家可以试试,移植简单
  • 压缩包里面有6个.m文件, blurring.m用于给图像增加抖动效果 inverseFilter.m是不考虑噪声的逆滤波 inverseFilterWithNoise.m是考虑噪声的逆滤波 wienerFiltering.m是维纳滤波 另外两个是辅助函数
  • 图像逆滤波与维纳滤波的matlab代码。包括测试图像与代码处理结果图。数字图像处理教材例子的复现。
  • 今天小编就为大家分享一篇python实现逆滤波与维纳滤波示例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • 逆滤波与维纳滤波

    2014-08-26 10:56:03
    对图像进行模糊处理,然后加白高斯噪声,用逆滤波维纳滤波恢复图像
  • 图像处理课程作业 可直接运行 附带评价指标:PSNR MSE ...并与逆滤波的方法进行对比。最后采用PSNR和MSE对维纳滤波的结果进行评价。 由于存在取整误差,就算去掉高斯噪声,逆滤波仍然难以完全还原原始图像。
  • 数字图像处理 逆滤波 维纳滤波 数字图像处理 逆滤波 维纳滤波 源代码 还有报告
  • 本文档包含有维纳滤波逆滤波的MATLAB代码以及实验结果分析。
  • 从构造大气湍流模型,运动模糊模型,gauss噪声模型开始,利用逆滤波和半径受限逆滤波还有维纳滤波处理,分成多个脚本函数文件易于调试,对比效果明显
  • winnerRestore,VC编写,含维纳滤波逆滤波和运动模糊及其恢复,
  • 维纳滤波

    万次阅读 2018-09-29 12:19:52
    上一节讲了逆滤波,这一次讲讲维纳滤波逆滤波在图像没有噪声的情况下是很好的,但在有噪声的情况下,噪声会被放大,所以维纳滤波就横空出世了,维纳滤波能很好的解决有噪声的图像修复。 维纳滤波是诺波特·维纳在...

    上一节讲了逆滤波,这一次讲讲维纳滤波,逆滤波在图像没有噪声的情况下是很好的,但在有噪声的情况下,噪声会被放大,所以维纳滤波就横空出世了,维纳滤波能很好的解决有噪声的图像修复。
    维纳滤波是诺波特·维纳在二十世纪四十年代提出的一种滤波器,即假定线性滤波器的输入为有用信号和噪声之和,两者均为广义平稳过程且知道它们的二阶统计特性,根据最小军方误差准则(滤波器的输出信号与需要信号之差的均方值最小),求得最佳线性滤波器的参数。
    维纳滤波器是一种自适应最小均方差滤波器。维纳滤波的方法是一种统计方法,它用的最优准则是基于图像和噪声各自的相关矩阵,它能根据图像的局部方差调整滤波器的输出,局部方差最大,滤波器的平滑作用就越强。
    公式如下:
    在这里插入图片描述
    其中戴帽子的f为我们维纳滤波后的图像,f为清晰的原始图像,g为待恢复的模糊图像(g上式没有,写出来为了说明的完整性)。
    这里戴帽子的f我们是不知道的,所以我们要根据这个优化式子求出f^\hat{f}.
    具体的推导过程这里不写,因为我也只看了个大概。
    求解的结果为:
    在这里插入图片描述
    其中,G(u,v)是退化图形的傅里叶变换;
    H(u,v)是退化函数;
    pn(u,v)=N(u,v)2p_n(u,v)=|N(u,v)|^2是噪声的功率谱;
    Pf(u,v)=F(u,v)2P_f(u,v)=|F(u,v)|^2是原始图像的功率谱;
    s=1λs=\frac{1}{λ},λ为一常数,是拉格朗日乘数。

    之前有说过维纳滤波需要知道原始图像和噪声的二阶统计特性,即要知道关于图像和噪声的先验知识,比如pf(u,v),pn(u,v)p_f(u,v),p_n(u,v),但是这恰恰也是我们不知道的,这也是维纳滤波器的局限所在,我们一般将上述两个公式的比值看做是常数带入进行计算,如下所示:
    在这里插入图片描述
    这是一种无可奈何的粗糙的近似,但是当噪声为白噪声即其功率谱为常数的时候,这种近似效果很不错。
    为了强化维纳滤波器的效果“基于维纳滤波的图像复原”这篇论文提出了两次维纳滤波的方法,第一次维纳滤波求出一个近似图像,然后由近似图像的和模糊图像估计噪声和原始图像的先验知识,最后根据该先验知识进行再次的维纳滤波。
    “Lucy - Richardson 与维纳滤波算法比较分析”,这篇文章指出在先加模糊函数在加噪声的情况下,维纳滤波的表现比LR滤波器的表现更为良好。

    在“维纳滤波图像复原技术的研究与改进”这篇文章中,作者指出,维纳算法可实现最小均方差复原,当图像的频率特性和噪声已知时,维纳滤波的效果较好;在峰值信噪较低时效果不好。这时由于三个问题限制了它的有效性。首先维纳滤波采用均方误差(MSE)准则,该准则对所有的误差(不管其在图像中的位置)都赋予同样的权,而人眼对暗处和高梯度区域的误差比其他区域的误差有较大的容忍性,所以,维纳滤波以一种并非适合人眼的方式对图像进行了平滑(第一个公式即求均方误差最小);其次,维纳滤波假设退化模型为线型空间不变系统,它不能处理具有空间可变点扩散函数的情形(比如物体运动不是匀速或者匀加速);最后,由于基于平稳随机场的模型,维纳滤波 不能处理有着非平稳信号和噪声的一般情形,大部分图像都是高度非平稳的,有着陡峭边缘分开的大块平坦区域(对非平稳过程而言,均值和方差是无法通过统计得到的,因为它们会随时间而变化)。

    参考文献:
    Lucy - Richardson 与维纳滤波算法比较分析
    维纳滤波图像复原技术的研究与改进

    最后推荐一篇非常不错的维纳滤波的博文:https://blog.csdn.net/baimafujinji/article/details/73882265

    展开全文
  • 逆滤波维纳滤波(附Matlab完整代码)

    万次阅读 多人点赞 2018-05-25 19:20:51
    一、实验目的 利用逆滤波维纳滤波,对Lena加噪运动模糊降质图像进行复原,比较不同参数选择对复原结果的影响。二、实验内容1) 输入Lena图像,对图像进行运动降质;降质模型:2) 对图像叠加高斯白噪声;3) 寻找...

    一、实验目的

            利用逆滤波和维纳滤波,对Lena加噪运动模糊降质图像进行复原,比较不同参数选择对复原结果的影响。

    二、实验内容

    1)     输入Lena图像,对图像进行运动降质;降质模型:


    2)     对图像叠加高斯白噪声;

    3)     寻找最佳逆滤波半径r;

    4)     逆滤波;

    5)     IFFT,展示结果;

    6)     再寻找最佳维纳滤波K值;

    7)     维纳滤波;

    8)     IFFT,展示结果。

    三、实验过程和数学原理

    1、逆滤波

            在无噪情况下,逆滤波是完美的:


        

            然而实际情况都有噪声:

            如果H(u,v)存在零点,那么在H(u,v)零点附近进行复原,会导致第二项变得很大很大,复原效果很差。

            理论上说,我们应该找出H(u,v)的所有零点,然后规避这些零点进行逆滤波。然而,降质模型零点十分分散(实际上是一条条斜线,实验中会看到),并且要作无数个圆区域,编程非常麻烦。

            实际编程中,我们采用如下思路:既然fft后的频谱中,信号频谱主要集中在低频分量,那么,我们用fftshift,将频谱移到中心;以频谱中心为圆心,规定一个圆区域,在圆内正常逆滤波;而圆外是大量的较小的噪声分量,不给任何机会,直接赋值为0。这样,我们就不需要考虑H(u,v)的零点影响了。

            此外,再通过PSNR最大准则,寻找最佳滤波半径R。实验结果如下:




            实验代码:

    function Imagerestoration
    %~~~~~~~~~~~~~~~~~~~~~~~~~~实验说明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
    % 1、由于T=5,a=b=1效果太差太差,几乎无法看到复原现象,因此本实验采用T=1,a=b=0.02降质模型。
    % 2、作为实验讲义的补充,本实验加入均值为0、方差为1e-3的AGWN模型。
    %       若方差过大,逆滤波效果也不理想。
    % 3、一定要对fftshift后的频谱进行运动模糊处理!!!否则现象都是错误的!!!
    %                                                                                                                                       2018-5-19 by XING
    %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
    clear;close all;clc;
    fprintf('-------------------------------逆滤波实验-------------------------------\n');
    I = im2double(imread('lena512.bmp'));% [0,1]
    [M,~] = size(I);% square
    
    % Display the original image.
    figure;
    subplot(1,3,1), imshow(I);
    title('\fontsize{20}原始图像');
    
    %% Simulate a Motion Blur:H(u,v)
    T=1;a=0.02;b=0.02;
    v=[-M/2:M/2-1];u=v';
    A=repmat(a.*u,1,M)+repmat(b.*v,M,1);
    H=T/pi./A.*sin(pi.*A).*exp(-1i*pi.*A);
    H(A==0)=T;% replace NAN
    
    %% Get the blurred Image
    % Warning: fftshift should be written
    F=fftshift(fft2(I));
    FBlurred=F.*H;
    
    % Display the blurred image
    IBlurred =real(ifft2(ifftshift(FBlurred)));
    subplot(1,3,2), imshow(uint8(255.*mat2gray(IBlurred)));
    title('\fontsize{20}运动模糊图像');
    
    %% Deblur perfectly without Noise
    FDeblurred=FBlurred./H;
    IDeblurred=real(ifft2(ifftshift(FDeblurred)));
    subplot(1,3,3), imshow(uint8(255.*mat2gray(IDeblurred)));
    title('\fontsize{20}无噪情况下直接逆滤波');
    
    %% Simulate Noise Model
    noise_mean = 0;
    noise_var = 1e-3;
    noise=imnoise(zeros(M),'gaussian', noise_mean,noise_var);
    FNoise=fftshift(fft2(noise));
    
    %% Get the Blurred_Noised Image
    FBlurred_Noised=FNoise+FBlurred;
    
    % Display the blurred_noised image
    IBlurred_Noised=real(ifft2(ifftshift(FBlurred_Noised)));
    figure;
    subplot(1,3,1), imshow(uint8(255.*mat2gray(IBlurred_Noised)));
    title('\fontsize{20}加噪运动模糊图像');
    
    %% Deblur when Ignoring Noise
    FDeblurred2=FBlurred_Noised./H;
    FH1=abs(FDeblurred2);
    IDeblurred2=real(ifft2(ifftshift(FDeblurred2)));
    subplot(1,3,2), imshow(uint8(255.*mat2gray(IDeblurred2)));
    title ('\fontsize{20}有噪情况下直接逆滤波');
    
    %% Find out the best Radius
    maxPSNR=0;
    bestRadius=0;
    tic;
    for Radius=33:1e-2:34 % 预实验bestr约为33.8左右
        FDeblurred2=zeros(M);
        
        for a=1:M
            for b=1:M
                if sqrt((a-M/2).^2+(b-M/2).^2)<Radius
                    FDeblurred2(a,b)=FBlurred_Noised(a,b)./H(a,b);
                end
            end
        end
        
        % Calculate PSNR and compare with the best
        IDeblurred2=real(ifft2(ifftshift(FDeblurred2)));
        PSNR=PSNRcal(IDeblurred2,I);
        if PSNR>maxPSNR
            maxPSNR=PSNR;
            bestRadius=Radius;
        end
    end
    
    fprintf(' 最佳滤波半径:            %.1f\n', bestRadius);
    fprintf(' 最大PSNR:              %d  dB\n', round(maxPSNR));
    fprintf(' 寻找最佳半径耗时:     %.1f s\n', toc);
    
    % Displace the best Restoration
    FDeblurred2=zeros(M);
    for a=1:M
        for b=1:M
            if sqrt((a-M/2).^2+(b-M/2).^2)<bestRadius
                FDeblurred2(a,b)= FBlurred_Noised(a,b)./H(a,b);
            end
        end
    end
    
    FH2=abs(FDeblurred2);
    
    IDeblurred2=real(ifft2(ifftshift(FDeblurred2)));
    subplot(1,3,3), imshow(uint8(255.*mat2gray(IDeblurred2)));
    title(['\fontsize{20}最佳半径为 ', num2str(bestRadius),'的圆内逆滤波']);
    
    fprintf('\n 半径逆滤波原理: \n');
    fprintf(' 1:通过fft2,使有效信号集中在低频区域,噪声集中在高频区域;\n');
    fprintf(' 2:通过fftshift,把频谱移到矩阵中心;\n');
    fprintf(' 3:以矩阵中心为圆心,规定一个半径为r的圆域;圆外直接赋0,抑制噪声;圆内正常逆滤波。\n');
    fprintf(' 这比寻找、避开H(u,v)的零点滤波,编程要简单很多,效果也不错!\n');
    
    fprintf('\n 实验结果说明: \n');
    fprintf(' 1:对于无噪运动模糊图像,逆滤波复原几乎完美 ^ ^\n');
    fprintf(' 2:对于有噪运动模糊图像,直接逆滤波是灾难,取半径滤波效果尚可。\n');
    fprintf('\n 同时说明: PSNR是多么不靠谱!\n');
    
    figure;
    subplot(1,2,1),imshow(im2double(uint8(FH1)));
    title ('\fontsize{20}有噪情况下直接逆滤波得到的图像频谱');
    subplot(1,2,2),imshow(im2double(uint8(FH2)));
    title ('\fontsize{20}圆内逆滤波得到的图像频谱');
    
    fprintf('\n~~~~~~~程序已暂停;按任意键进行维纳滤波实验~~~~~~~~\n');
    pause;

    2、维纳滤波

          理想维纳滤波器为:


          实际应用中,NSR难以被精确计算。因此,我们常常设为K,并寻找最佳K值。

          实验结果:


            实验代码:

    %% Deblur Image Using Wiener Filter
    fprintf('\n-------------------------------维纳滤波实验-------------------------------\n');
    fprintf(' 根据大量实验,我发现PSNR无法作为寻找最佳K值的标准:\n');
    fprintf(' 1:参数K将会停留在K=0处,即逆滤波;\n');
    fprintf(' 2:最大PSNR达到70dB以上,实际图像质量极差!\n');
    fprintf('\n 因此,我通过观察,选择了最佳K=0.05~\n');
    fprintf(' ps. 程序中保留了根据PSNR寻找K值的代码,有兴趣可以尝试 ^ ^\n');
    % Display the blurred_noised image again
    figure();
    subplot(1,3,1);
    imshow(uint8(255.*mat2gray(IBlurred_Noised)));
    title('\fontsize{20}加噪运动模糊图像');
    
    % Deblur with theoretic NSR
    buf=(abs(H)).^2; % Notice '.' !!!!!!!!
    NSR=FNoise./F;
    FDeblurred3=FBlurred_Noised./H.*buf./(buf+NSR);
    IDeblurred3=real(ifft2(ifftshift(FDeblurred3)));
    subplot(1,3,2), imshow(uint8(255.*mat2gray(IDeblurred3)));
    title('\fontsize{20}K=NSR的理论维纳滤波');
    
    % Find out the best K
    % tic;
    % maxPSNR=0;
    % beskK=0;
    % for K=0:1e-2:1
    %     FDeblurred2=zeros(M);
    %     FDeblurred3=FBlurred_Noised./H.*buf./(buf+bestK);
    %     IDeblurred3=real(ifft2(ifftshift(FDeblurred3)));
    %     
    %     % Calculate PSNR and compare with the best
    %     PSNR=PSNRcal(IDeblurred3,I);
    %     if PSNR>maxPSNR
    %         maxPSNR=PSNR;
    %         bestK=K;
    %     end
    % end
    % 
    % fprintf(' 最佳K值:                 %.2f\n', bestK);
    % fprintf(' 最大PSNR:             %d dB\n', round(maxPSNR));
    % fprintf(' 寻找最佳K值耗时:   %.1f s\n', toc);
    
    % Deblur with best K
    bestK=0.05;
    FDeblurred3=FBlurred_Noised./H.*buf./(buf+bestK);
    IDeblurred3=real(ifft2(ifftshift(FDeblurred3)));
    
    % Display the best restored Image
    subplot(1,3,3), imshow(uint8(255.*mat2gray(IDeblurred3)));
    title(['\fontsize{20}实际最佳K= ', num2str(bestK),'的维纳滤波']);
    
    fprintf('                                                                          Written by XING\n');
    fprintf('                                                                        2018-5-19 Beijing\n');
    end

            实验中用到的PSNR计算子程序:

    function PSNR=PSNRcal(I,I2)
    h=512;w=512;
    B=8;% 编码一个像素用8个二进制位
    MAX=2^B-1;% 图像有多少灰度级
    MES=sum(sum((I-I2).^2))/(h*w);% 均方差
    PSNR=20*log10(MAX/sqrt(MES));% 峰值信噪比
    end
    展开全文
  • 逆滤波算法
  • 对一副数字图像模拟出运动模糊效果并采用维纳滤波;模拟出大气湍流效果并采用逆滤波。MATLAB r2013a。
  • 逆滤波维纳滤波

    千次阅读 2020-06-09 15:27:41
    利用逆滤波维纳滤波,对Lena加噪运动模糊降质图像进行复原,比较不同参数选择对复原结果的影响。二、实验内容1)     输入Lena图像,对图像进行运动降质;降质模型:2) ...

    一、实验目的

            利用逆滤波和维纳滤波,对Lena加噪运动模糊降质图像进行复原,比较不同参数选择对复原结果的影响。

    二、实验内容

    1)     输入Lena图像,对图像进行运动降质;降质模型:


    2)     对图像叠加高斯白噪声;

    3)     寻找最佳逆滤波半径r;

    4)     逆滤波;

    5)     IFFT,展示结果;

    6)     再寻找最佳维纳滤波K值;

    7)     维纳滤波;

    8)     IFFT,展示结果。

    三、实验过程和数学原理

    1、逆滤波

            在无噪情况下,逆滤波是完美的:


        

            然而实际情况都有噪声:

            如果H(u,v)存在零点,那么在H(u,v)零点附近进行复原,会导致第二项变得很大很大,复原效果很差。

            理论上说,我们应该找出H(u,v)的所有零点,然后规避这些零点进行逆滤波。然而,降质模型零点十分分散(实际上是一条条斜线,实验中会看到),并且要作无数个圆区域,编程非常麻烦。

            实际编程中,我们采用如下思路:既然fft后的频谱中,信号频谱主要集中在低频分量,那么,我们用fftshift,将频谱移到中心;以频谱中心为圆心,规定一个圆区域,在圆内正常逆滤波;而圆外是大量的较小的噪声分量,不给任何机会,直接赋值为0。这样,我们就不需要考虑H(u,v)的零点影响了。

            此外,再通过PSNR最大准则,寻找最佳滤波半径R。实验结果如下:




            实验代码:

    function Imagerestoration
    %~~~~~~~~~~~~~~~~~~~~~~~~~~实验说明~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
    % 1、由于T=5,a=b=1效果太差太差,几乎无法看到复原现象,因此本实验采用T=1,a=b=0.02降质模型。
    % 2、作为实验讲义的补充,本实验加入均值为0、方差为1e-3的AGWN模型。
    %       若方差过大,逆滤波效果也不理想。
    % 3、一定要对fftshift后的频谱进行运动模糊处理!!!否则现象都是错误的!!!
    %                                                                                                                                       2018-5-19 by XING
    %~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
    clear;close all;clc;
    fprintf('-------------------------------逆滤波实验-------------------------------\n');
    I = im2double(imread('lena512.bmp'));% [0,1]
    [M,~] = size(I);% square
    

    % Display the original image.
    figure;
    subplot(1,3,1), imshow(I);
    title(’\fontsize{20}原始图像’);

    %% Simulate a Motion Blur:H(u,v)
    T=1;a=0.02;b=0.02;
    v=[-M/2:M/2-1];u=v;
    A=repmat(a.u,1,M)+repmat(b.v,M,1);
    H=T/pi./A.sin(pi.A).exp(-1ipi.*A);
    H(A==0)=T;% replace NAN

    %% Get the blurred Image
    % Warning: fftshift should be written
    F=fftshift(fft2(I));
    FBlurred=F.*H;

    % Display the blurred image
    IBlurred =real(ifft2(ifftshift(FBlurred)));
    subplot(1,3,2), imshow(uint8(255.*mat2gray(IBlurred)));
    title(’\fontsize{20}运动模糊图像’);

    %% Deblur perfectly without Noise
    FDeblurred=FBlurred./H;
    IDeblurred=real(ifft2(ifftshift(FDeblurred)));
    subplot(1,3,3), imshow(uint8(255.*mat2gray(IDeblurred)));
    title(’\fontsize{20}无噪情况下直接逆滤波’);

    %% Simulate Noise Model
    noise_mean = 0;
    noise_var = 1e-3;
    noise=imnoise(zeros(M),‘gaussian’, noise_mean,noise_var);
    FNoise=fftshift(fft2(noise));

    %% Get the Blurred_Noised Image
    FBlurred_Noised=FNoise+FBlurred;

    % Display the blurred_noised image
    IBlurred_Noised=real(ifft2(ifftshift(FBlurred_Noised)));
    figure;
    subplot(1,3,1), imshow(uint8(255.*mat2gray(IBlurred_Noised)));
    title(’\fontsize{20}加噪运动模糊图像’);

    %% Deblur when Ignoring Noise
    FDeblurred2=FBlurred_Noised./H;
    FH1=abs(FDeblurred2);
    IDeblurred2=real(ifft2(ifftshift(FDeblurred2)));
    subplot(1,3,2), imshow(uint8(255.*mat2gray(IDeblurred2)));
    title (’\fontsize{20}有噪情况下直接逆滤波’);

    %% Find out the best Radius
    maxPSNR=0;
    bestRadius=0;
    tic;
    for Radius=33:1e-2:34 % 预实验bestr约为33.8左右
    FDeblurred2=zeros(M);

    <span class="k" style="color:rgb(0,112,32);font-weight:bold;">for</span> <span class="n">a</span><span class="p">=</span><span class="mi" style="color:rgb(64,160,112);">1</span><span class="p">:</span><span class="n">M</span>
        <span class="k" style="color:rgb(0,112,32);font-weight:bold;">for</span> <span class="n">b</span><span class="p">=</span><span class="mi" style="color:rgb(64,160,112);">1</span><span class="p">:</span><span class="n">M</span>
            <span class="k" style="color:rgb(0,112,32);font-weight:bold;">if</span> <span class="nb" style="color:rgb(0,112,32);">sqrt</span><span class="p">((</span><span class="n">a</span><span class="o" style="color:rgb(102,102,102);">-</span><span class="n">M</span><span class="o" style="color:rgb(102,102,102);">/</span><span class="mi" style="color:rgb(64,160,112);">2</span><span class="p">)</span><span class="o" style="color:rgb(102,102,102);">.^</span><span class="mi" style="color:rgb(64,160,112);">2</span><span class="o" style="color:rgb(102,102,102);">+</span><span class="p">(</span><span class="n">b</span><span class="o" style="color:rgb(102,102,102);">-</span><span class="n">M</span><span class="o" style="color:rgb(102,102,102);">/</span><span class="mi" style="color:rgb(64,160,112);">2</span><span class="p">)</span><span class="o" style="color:rgb(102,102,102);">.^</span><span class="mi" style="color:rgb(64,160,112);">2</span><span class="p">)</span><span class="o" style="color:rgb(102,102,102);">&lt;</span><span class="n">Radius</span>
                <span class="n">FDeblurred2</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)=</span><span class="n">FBlurred_Noised</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">)</span><span class="o" style="color:rgb(102,102,102);">./</span><span class="n">H</span><span class="p">(</span><span class="n">a</span><span class="p">,</span><span class="n">b</span><span class="p">);</span>
            <span class="k" style="color:rgb(0,112,32);font-weight:bold;">end</span>
        <span class="k" style="color:rgb(0,112,32);font-weight:bold;">end</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold;">end</span>
    
    <span class="c" style="color:rgb(96,160,176);font-style:italic;">% Calculate PSNR and compare with the best</span>
    <span class="n">IDeblurred2</span><span class="p">=</span><span class="nb" style="color:rgb(0,112,32);">real</span><span class="p">(</span><span class="n">ifft2</span><span class="p">(</span><span class="n">ifftshift</span><span class="p">(</span><span class="n">FDeblurred2</span><span class="p">)));</span>
    <span class="n">PSNR</span><span class="p">=</span><span class="n">PSNRcal</span><span class="p">(</span><span class="n">IDeblurred2</span><span class="p">,</span><span class="n">I</span><span class="p">);</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold;">if</span> <span class="n">PSNR</span><span class="o" style="color:rgb(102,102,102);">&gt;</span><span class="n">maxPSNR</span>
        <span class="n">maxPSNR</span><span class="p">=</span><span class="n">PSNR</span><span class="p">;</span>
        <span class="n">bestRadius</span><span class="p">=</span><span class="n">Radius</span><span class="p">;</span>
    <span class="k" style="color:rgb(0,112,32);font-weight:bold;">end</span>
    

    end

    fprintf(’ 最佳滤波半径: %.1f\n’, bestRadius);
    fprintf(’ 最大PSNR: %d dB\n’, round(maxPSNR));
    fprintf(’ 寻找最佳半径耗时: %.1f s\n’, toc);

    % Displace the best Restoration
    FDeblurred2=zeros(M);
    for a=1:M
    for b=1:M
    if sqrt((a-M/2).^2+(b-M/2).^2)<bestRadius
    FDeblurred2(a,b)= FBlurred_Noised(a,b)./H(a,b);
    end
    end
    end

    FH2=abs(FDeblurred2);

    IDeblurred2=real(ifft2(ifftshift(FDeblurred2)));
    subplot(1,3,3), imshow(uint8(255.*mat2gray(IDeblurred2)));
    title([’\fontsize{20}最佳半径为 ', num2str(bestRadius),‘的圆内逆滤波’]);

    fprintf(’\n 半径逆滤波原理: \n’);
    fprintf(’ 1:通过fft2,使有效信号集中在低频区域,噪声集中在高频区域;\n’);
    fprintf(’ 2:通过fftshift,把频谱移到矩阵中心;\n’);
    fprintf(’ 3:以矩阵中心为圆心,规定一个半径为r的圆域;圆外直接赋0,抑制噪声;圆内正常逆滤波。\n’);
    fprintf(’ 这比寻找、避开H(u,v)的零点滤波,编程要简单很多,效果也不错!\n’);

    fprintf(’\n 实验结果说明: \n’);
    fprintf(’ 1:对于无噪运动模糊图像,逆滤波复原几乎完美 ^ ^\n’);
    fprintf(’ 2:对于有噪运动模糊图像,直接逆滤波是灾难,取半径滤波效果尚可。\n’);
    fprintf(’\n 同时说明: PSNR是多么不靠谱!\n’);

    figure;
    subplot(1,2,1),imshow(im2double(uint8(FH1)));
    title (’\fontsize{20}有噪情况下直接逆滤波得到的图像频谱’);
    subplot(1,2,2),imshow(im2double(uint8(FH2)));
    title (’\fontsize{20}圆内逆滤波得到的图像频谱’);

    fprintf(’\n~程序已暂停;按任意键进行维纳滤波实验~~\n’);
    pause;

    2、维纳滤波

          理想维纳滤波器为:


          实际应用中,NSR难以被精确计算。因此,我们常常设为K,并寻找最佳K值。

          实验结果:


            实验代码:

    %% Deblur Image Using Wiener Filter
    fprintf(’\n-------------------------------维纳滤波实验-------------------------------\n’);
    fprintf(’ 根据大量实验,我发现PSNR无法作为寻找最佳K值的标准:\n’);
    fprintf(’ 1:参数K将会停留在K=0处,即逆滤波;\n’);
    fprintf(’ 2:最大PSNR达到70dB以上,实际图像质量极差!\n’);
    fprintf(’\n 因此,我通过观察,选择了最佳K=0.05~\n’);
    fprintf(’ ps. 程序中保留了根据PSNR寻找K值的代码,有兴趣可以尝试 ^ ^\n’);
    % Display the blurred_noised image again
    figure();
    subplot(1,3,1);
    imshow(uint8(255.*mat2gray(IBlurred_Noised)));
    title(’\fontsize{20}加噪运动模糊图像’);

    % Deblur with theoretic NSR
    buf=(abs(H)).^2; % Notice ‘.’ !!!
    NSR=FNoise./F;
    FDeblurred3=FBlurred_Noised./H.buf./(buf+NSR);
    IDeblurred3=real(ifft2(ifftshift(FDeblurred3)));
    subplot(1,3,2), imshow(uint8(255.mat2gray(IDeblurred3)));
    title(’\fontsize{20}K=NSR的理论维纳滤波’);

    % Find out the best K
    % tic;
    % maxPSNR=0;
    % beskK=0;
    % for K=0:1e-2:1
    % FDeblurred2=zeros(M);
    % FDeblurred3=FBlurred_Noised./H.*buf./(buf+bestK);
    % IDeblurred3=real(ifft2(ifftshift(FDeblurred3)));
    %
    % % Calculate PSNR and compare with the best
    % PSNR=PSNRcal(IDeblurred3,I);
    % if PSNR>maxPSNR
    % maxPSNR=PSNR;
    % bestK=K;
    % end
    % end
    %
    % fprintf(’ 最佳K值: %.2f\n’, bestK);
    % fprintf(’ 最大PSNR: %d dB\n’, round(maxPSNR));
    % fprintf(’ 寻找最佳K值耗时: %.1f s\n’, toc);

    % Deblur with best K
    bestK=0.05;
    FDeblurred3=FBlurred_Noised./H.*buf./(buf+bestK);
    IDeblurred3=real(ifft2(ifftshift(FDeblurred3)));

    % Display the best restored Image
    subplot(1,3,3), imshow(uint8(255.*mat2gray(IDeblurred3)));
    title([’\fontsize{20}实际最佳K= ', num2str(bestK),‘的维纳滤波’]);

    fprintf(’ Written by XING\n’);
    fprintf(’ 2018-5-19 Beijing\n’);
    end

            实验中用到的PSNR计算子程序:

    function PSNR=PSNRcal(I,I2)
    h=512;w=512;
    B=8;% 编码一个像素用8个二进制位
    MAX=2^B-1;% 图像有多少灰度级
    MES=sum(sum((I-I2).^2))/(hw);% 均方差
    PSNR=20log10(MAX/sqrt(MES));% 峰值信噪比
    end

    展开全文
  • python实现逆滤波与维纳滤波

    万次阅读 热门讨论 2018-02-28 12:04:41
    构建运动模糊模型 现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不...也就是说,运动模糊图像是由同一图像在产生距离延迟后原图像想叠加而成。如果快门开启关闭的时间忽略不计,则有: ...

     构建运动模糊模型

            现假定相机不动,图像f(x,y)在图像面上移动并且图像f(x,y)除移动外不随时间变化。令x0(t)和y0(t)分别代表位移的x分量和y分量,那么在快门开启的时间T内,胶片上某点的总曝光量是图像在移动过程中一系列相应像素的亮度对该点作用之总和。也就是说,运动模糊图像是由同一图像在产生距离延迟后与原图像想叠加而成。如果快门开启与关闭的时间忽略不计,则有:

                                                                      g(x,y)=\int_{0}^{T}f[x-x_{0}(t)), y-y_{0}(t))]dt

            由于各种运动都是匀速直线运动的叠加,因而我们只需考虑匀速直线运动即可。但由于我们自身水平有限,且旨在探讨找到实现运动模糊复原方法的思想与方向,因而我们未能自行构建模型,而是借鉴了参考文献[1]中建立的运动模糊模型。关于本模型的理论依据参见参考文献[1].

            下面我们描述一下该模型函数motion_process(image_size,motion_angle),它包含两个参数:图像的尺寸大小image_size以及运动的角度motion_angle。

    例如,当运动位移为9、运动角度为45度时,则该模型函数的构建过程如下:

    1. 首先是创建与图像同等大小的全0矩阵,然后找到全0矩阵的中心行数center_position,再计算出运动角度的tan值与cot值,算出运动的偏移量offset。
    2. 再令α≤45°时,PSF[int(center_position+offset),int(center_position-offset)]=1
    3. α≥45°时,PSF[int(center_position-offset),int(center_position+offset)]=1

    则该模型对应的图像如下图所示:

    运动位移为9,运动角度分别为45°、30°、60°时,运动模糊模型对应的图像

    import matplotlib.pyplot as graph
    import numpy as np
    from numpy import fft
    import math
    import cv2
    
    # 仿真运动模糊
    def motion_process(image_size,motion_angle):
        PSF = np.zeros(image_size)
        print(image_size)
        center_position=(image_size[0]-1)/2
        print(center_position)
    
        slope_tan=math.tan(motion_angle*math.pi/180)
        slope_cot=1/slope_tan
        if slope_tan<=1:
            for i in range(15):
                offset=round(i*slope_tan)    #((center_position-i)*slope_tan)
                PSF[int(center_position+offset),int(center_position-offset)]=1
            return PSF / PSF.sum()  #对点扩散函数进行归一化亮度
        else:
            for i in range(15):
                offset=round(i*slope_cot)
                PSF[int(center_position-offset),int(center_position+offset)]=1
            return PSF / PSF.sum()
    
    #对图片进行运动模糊
    def make_blurred(input, PSF, eps):
        input_fft = fft.fft2(input)# 进行二维数组的傅里叶变换
        PSF_fft = fft.fft2(PSF)+ eps
        blurred = fft.ifft2(input_fft * PSF_fft)
        blurred = np.abs(fft.fftshift(blurred))
        return blurred
    
    def inverse(input, PSF, eps):       # 逆滤波
        input_fft = fft.fft2(input)
        PSF_fft = fft.fft2(PSF) + eps #噪声功率,这是已知的,考虑epsilon
        result = fft.ifft2(input_fft / PSF_fft) #计算F(u,v)的傅里叶反变换
        result = np.abs(fft.fftshift(result))
        return result
    
    def wiener(input,PSF,eps,K=0.01):        #维纳滤波,K=0.01
        input_fft=fft.fft2(input)
        PSF_fft=fft.fft2(PSF) +eps
        PSF_fft_1=np.conj(PSF_fft) /(np.abs(PSF_fft)**2 + K)
        result=fft.ifft2(input_fft * PSF_fft_1)
        result=np.abs(fft.fftshift(result))
        return result
    
    image = cv2.imread('you.jpg')
    image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    img_h=image.shape[0]
    img_w=image.shape[1]
    graph.figure(1)
    graph.xlabel("Original Image")
    graph.gray()
    graph.imshow(image)     #显示原图像
    
    graph.figure(2)
    graph.gray()
    #进行运动模糊处理
    PSF = motion_process((img_h,img_w), 60)
    blurred = np.abs(make_blurred(image, PSF, 1e-3))
    
    graph.subplot(231)
    graph.xlabel("Motion blurred")
    graph.imshow(blurred)
    
    result = inverse(blurred, PSF, 1e-3)   #逆滤波
    graph.subplot(232)
    graph.xlabel("inverse deblurred")
    graph.imshow(result)
    
    result=wiener(blurred,PSF,1e-3)     #维纳滤波
    graph.subplot(233)
    graph.xlabel("wiener deblurred(k=0.01)")
    graph.imshow(result)
    
    blurred_noisy=blurred + 0.1 * blurred.std() * \
               np.random.standard_normal(blurred.shape)   #添加噪声,standard_normal产生随机的函数
    
    graph.subplot(234)
    graph.xlabel("motion & noisy blurred")
    graph.imshow(blurred_noisy)      #显示添加噪声且运动模糊的图像
    
    result = inverse(blurred_noisy, PSF, 0.1+1e-3)    #对添加噪声的图像进行逆滤波
    graph.subplot(235)
    graph.xlabel("inverse deblurred")
    graph.imshow(result)
    
    result=wiener(blurred_noisy,PSF,0.1+1e-3)          #对添加噪声的图像进行维纳滤波
    graph.subplot(236)
    graph.xlabel("wiener deblurred(k=0.01)")
    graph.imshow(result)
    
    graph.show()
    

    参考文献

    [1] 何红英. 运动模糊图像恢复算法的研究与实现[D]. 西安科技大学硕士学位论文. 2011.

    [2] Rafael C.Gonzalez,Richard E.Woods,Steven L.Eddins. 数字图像处理的MATLAB实现(第2版)[M]. 阮秋琦,译. 北京:清华大学出版社,2013.

    [3] 陈建功. 运动模糊图像复原算法研究[D]. 南昌航空大学硕士学位论文. 2012.

    展开全文
  • 这是用matlab实现图像复原的程序,包括逆滤波维纳滤波、约束最小二乘方滤波。
  • 对已知图像进行模糊处理,用逆滤波维纳滤波恢复图像,有Matlab程序和自己试验后的结果及简要的分析讨论
  • 生成点扩散函数,点扩散函数就是运动模糊的退化模型,点扩散函数可以用于逆滤波与维纳滤波   def get_motion_dsf(image_size, motion_angle, motion_dis): PSF = np.zeros(image_size) # 点扩散函数 x_center ...
  • 逆滤波维纳滤波实现源代码(MATLAB)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 848
精华内容 339
关键字:

维纳滤波与逆滤波