图像复原原理及实现

补充知识

相关函数

  • 信号 X 是随时间变化的随机变量序列,不同时间起始点的序列X(s) X(t) 的相关函数可以表示为

R(s,t)=E[(Xtμt)(Xsμs)]σtσs

* 对于二阶稳态过程,即信号的均值和方差不随时间的变化而变化,则此时相关函数只是时间差 τ=st 的函数,可以简化为

R(τ)=E[(Xtμ)(Xsμ)]σ2

这即是统计学函数里面的 自相关函数
* 将相关函数离散化,可以得到

R(τ)=1Ni=0N1XiμσXi+τμσ

即两个向量的内积,它可以反映同一序列在不同时刻取值之间的相似程度。

标准互相关函数

  • Normalized Cross-Correlation, NCC
  • 两幅图像 f(x,y) , t(x,y) ,均值和方差分别为 (uf,σ2f) , (ut,σ2t) ,则NCC为

NCC=1N1x,yf(x,y)μfσft(x,y)μtσt

对图像减去均值并除以标准差,可以保证图片的亮度和对比度不变性,即NCC具有在亮度和对比度下的稳定性。

功率谱密度

  • power spectrum density, PSD
  • 功率谱密度是信号在某个频率下拥有的能量,一个信号的功率谱密度就是该信号自相关函数的傅立叶变换,将一个信号的psd对所有频率进行积分,得到的值即为信号的总能量。功率谱密度计算方法为

PXX(s)=F(s)F(s)=|F(s)|2

其中 F(s) F(s) f(t) 的傅立叶变换和 F(s) 的复共轭。

  • 每个信号的功率谱密度唯一,是信号的一种属性,在图像处理中,可以将图像看作信号,对图像的ROI进行标准化之后,再进行傅立叶变化,就可以得到图像的功率谱,在进行模板匹配等操作时,就有了一个可以匹配的模板属性,可以作为ROI的一个特征。
  • FFT可以为计算psd提供一个高效的计算手段

白噪声

  • 白噪声是一种功率谱密度为常数的随机信号或者随机过程,信号在各个频率上的能量相同,因此白噪声不具有周期性

参考内容

主要图像复原方法简介

图像复原处理的过程

  • 设原始图像 f(x,y) ,则退化后的图像可以表示为

g(x,y)=H[f(x,y)]+η(x,y)

其中 H 为退化函数,η(x,y)为加性噪声,复原的目标是得到基于退化图像的一个估计 f^(x,y) ,使得图像能够尽可能地贴近原始图像。
* 若H是线性的、空间不变的过程,则退化图像在空间频域中可以表示为

g(x,y)=h(x,y)f(x,y)+η(x,y)

进行傅立叶变换,有
G(u,v)=H(u,v)F(u,v)+N(u,v)

* 噪声模型有很多种,包括高斯噪声、椒盐噪声、泊松噪声等

直接逆滤波处理

  • 用于复原一幅退化图像的最简方法是构成以下形式的估计

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

然后进行逆傅立叶变换得到原图的估计。

可以将上面的公式写为

F^(u,v)=F(u,v)+N(u,v)H(u,v)

则即使知道了准确的 H(u,v) ,也无法恢复 F(u,v) ,因为还需要知道噪声信号。而且很多 H(u,v) 为0的情况也是一个很大的问题。可以将 H(u,v)=0 的点特殊处理一下,此时这种方法被称为 伪逆滤波
* 很少有使用价值

维纳滤波

  • 维纳滤波是一种线性图像复原方法,寻找一个使统计误差函数

e2=E{(ff^)2}
最小的估计 f^ ,在频域可以表示为

F^(u,v)=[1H(u,v)|H(u,v)|2|H(u,v)|2+Sη(u,v)/Sf(u,v)]G(u,v)

其中
H(u,v) 为退化函数, Sη Sf 是噪声与未退化图像的功率谱。信噪比为

SNR=Sf(u,v)Sη(u,v)

信噪比为无穷大时,表明没有噪声,则维纳滤波退化为逆滤波。

约束的最小二乘方(正则)滤波

  • 约束最小二乘滤波的核心是 H 对噪声敏感的问题。处理这个问题的一种方法是基于平滑度测量的最优性。复原过程中,需要寻找准则函数C的最小值。函数 C 定义为

C=x=0M1y=0N1[2f(x,y)]2

函数的约束条件为

gHf^=η2

这个最优化问题的频域解决办法由下式给出

F^(u,v)=[H(u,v)|H(u,v)|2+γ|P(u,v)|2]G(u,v)

其中 P(u,v) 是拉普拉斯算子 p(x,y) 的傅立叶变换,有

P=010141010

未知量有 γ η2 两个。若已知和噪声功率(标量)成比例的 η2 ,则通过迭代, γ 可以得出。

LR滤波

  • 是一种非线性滤波方法,也是找到模型的极大似然函数

代码及实现部分

  • 主要参考的是冈萨雷斯的数字图像处理matlab版

代码

%%
clc,clear,close all
% 原始图像
f = checkerboard(8);
% 噪声滤波器
PSF = fspecial('motion', 7, 45);
% 退化图像
gb = imfilter( f, PSF, 'circular' );
% 高斯滤波
noise = imnoise( zeros(size(f)), 'gaussian', 0, 0.001 );
% 将噪声加到原图上
g = gb + noise;

figure
subplot(221), imshow( f ), title('原图')
subplot(222), imshow( noise, [] ), title('高斯噪声')
subplot(223), imshow( gb ), title('退化图像')
subplot(224), imshow( g ), title('退化图像加高斯噪声')

%% 图像复原
% 噪信比默认为0,即信噪比相当于无穷大,即直接逆滤波的过程
fr1 = deconvwnr( g, PSF );

Sn = abs( fft2(noise) ) .^2;
nA = sum( Sn(:) ) / numel( noise );
Sf = abs( fft2(f) ) .^2;
fA = sum( Sf(:) ) / numel( f );
R = nA / fA;  % 平均噪信比计算
% 使用常数比例的维纳滤波进行复原
fr2 = deconvwnr( g, PSF, R );
% 使用自相关函数的维纳滤波进行复原
Ncorr = fftshift( real(ifft2(Sn)) );
Fcorr = fftshift( real(ifft2(Sf)) );
fr3 = deconvwnr( g, PSF, Ncorr, Fcorr );

figure
subplot(221), imshow( g ), title('模糊的运动图像')
subplot(222), imshow( fr1, [] ), title('直接逆滤波复原图像')
subplot(223), imshow( fr2, [] ), title('常数比例维纳滤波复原图像')
subplot(224), imshow( fr3, [] ), title('使用自相关函数的维纳滤波复原图像')

%% 约束最小二乘滤波
% 4 约等于  64*64*0.001
fr1 = deconvreg( g, PSF, 4 );

fr2 = deconvreg( g, PSF, 0.4, [1e-7, 1e7] );

figure
subplot(221), imshow( g ), title('模糊的运动图像')
subplot(222), imshow( fr1, [] ), title('仅噪声功率参数的正则滤波')
subplot(223), imshow( fr2, [] ), title('包含噪声和gamma范围的正则滤波')

%% Lucy-Richardson算法的迭代非线性复原
g = checkerboard(8);
ori = g;
PSF = fspecial( 'gaussian', 7, 10 );
SD = 0.01;
g = imnoise( imfilter(g, PSF), 'gaussian', 0, SD^2 );

damper = 10*SD;
lim = ceil( size(PSF, 1) / 2 );
weight = zeros( size(g) );
weight( lim+1:end-lim, lim+1:end-lim ) = 1;
numit = 5;
f5 = deconvlucy( g, PSF, numit, damper, weight );
numit = 20;
f20 = deconvlucy( g, PSF, numit, damper, weight );
numit = 50;
f50 = deconvlucy( g, PSF, numit, damper, weight );
numit = 100;
f100 = deconvlucy( g, PSF, numit, damper, weight );


figure
subplot(231), imshow( ori ), title('原始图像')
subplot(232), imshow( g, [] ), title('加两次高斯噪声的图')
subplot(233), imshow( f5, [] ), title('LR 5次迭代')
subplot(234), imshow( f20 ), title('LR 20次迭代')
subplot(235), imshow( f50, [] ), title('LR 50次迭代')
subplot(236), imshow( f100,[] ), title('LR 100次迭代')

结果

  • 原图+噪声

    这里写图片描述

  • 逆滤波和维纳滤波

    这里写图片描述

  • 正则滤波

    这里写图片描述

  • LR滤波

    这里写图片描述

任意模糊运动图像的复原

运动参数估计

  • 主要包括运动的角度和长度,运动的角度可以用Radon方法进行估计,运动的长度可以用倒谱法进行估计
  • 参考链接:http://www.cnblogs.com/yomman/p/3424494.html

  • 代码

    function [beta, len] = getMotionPara( img, showImg )
    % getMotionPara : 得到运动模糊图像的的参数估计
    %   img   : 输入的灰度图像
    %   beta  : 运动参数的角度
    %   len   : 运动参数的长度
    % 用这两个参数可以对图像进行复原
        if nargin <= 1
            showImg = false;
        end
        fg = fft2( img );
        spec = log(1+abs(fg));
        specCenter = fftshift( spec );
        thres = graythresh( specCenter );
        bw = edge( specCenter, 'canny', thres );
        th = 1:180;
        R = radon( bw, th );
        maxRadon = max(R(:));
        [~, n] = find( R == maxRadon );
        [M, N] = size( specCenter );
        beta = atan( tan(n*pi/180)*M/N)*180/pi;
    
        %利用倒谱的方法估计模糊尺度
        theta = beta;
        %――――――――――――――――――――――――――――
        %转化为倒谱域:Cep(g(x,y)) = invFT{log(FT(g(x,y)))}
        fin = fft2(img); %转化为频域
    
        lgfin = abs(log(1 + abs(fin))); %转化为对数,abs是求复数的模
        cin = ifft2(lgfin); %得到倒谱域的图像
        cinrot = imrotate(cin, -theta); %旋转图像,使模糊方向水平
    
        %计算每列的平均值
        for i=1:size(cinrot, 2)   %列数
            avg(i) = 0;
            for j=1:size(cinrot, 1)  %行数
                avg(i) = avg(i) + cinrot(j, i);
            end
            avg(i) = avg(i)/size(cinrot, 1); %第i列的平均值
        end
        avgr = real(avg);
    
        %用第一个负值计算模糊尺度
        index = 0;
        for i = 1:round(size(avg,2)),
            if real(avg(i))<0,
                index = i;
                break;
            end
        end
    
        %如果找到了模糊尺度,则:
        if index~=0
            len = index;
        else
    
        %如果没有找到模糊尺度(无负峰),则利用查找最低峰的方法再查找
            index = 1;
            startval = avg(index);
            for i = 1 : round(size(avg, 2)/2),
                if startval>avg(i),
                    startval = avg(i);
                    index = i;
                end
            end
            len = index;
        end
    
        if showImg
            subplot(221), imshow( img ), title('原图')
            subplot(222), imshow( specCenter, [] ), title('居中后的压缩频谱')
            subplot(223), imshow( bw ), title('频谱二值化图像')
            subplot(224), imshow( R ), title('Radon变换后图像')
        end
    
    end

滤波效果对比

  • 一些信噪比等的参数主要是通过尝试得出

  • 代码(main.m)

    %% 
    clc,clear,close all
    img = imread( '1.jpg' );
    gb = double(rgb2gray( img )) / 255;
    %% 运动参数估计
    [beta, len] = getMotionPara( gb );
    fprintf('PSF parameters, angle : %.2f, length : %.2f\n', beta, len);
    %% 图像噪声去除
    % 运动噪声滤波器估计
    PSF = fspecial('motion', len, beta);
    % 直接逆滤波求得结果
    % 逆滤波得到的结果很差,说明原图中有较多噪声,需要通过其他方法去除
    res1 = deconvwnr( gb, PSF );
    % 维纳滤波
    % 随便给的一个信噪比的值
    nsr = 0.01;
    res2 = deconvwnr( gb, PSF, nsr );
    % 约束最小二乘滤波
    % 尝试给出的一个噪声能量值
    noisePower = 10;
    res3 = deconvreg( gb, PSF, noisePower );
    
    figure
    subplot(231), imshow( img ), title('原图')
    subplot(232), imshow( res1, [] ), title('逆滤波复原后图像')
    subplot(233), imshow( res2, [] ), title('维纳后图像')
    subplot(234), imshow( res3, [] ), title('约束最小二乘复原后图像')
  • 效果图

    这里写图片描述

    这里写图片描述

  • 注:其实图像复原最重要的还是参数估计和噪声估计,不然复原效果会一直很差

  • 23
    点赞
  • 165
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 9
    评论
数字图像在获取的过程中,由于光学系统的像差、 光学成像衍射、 成像系统的非线性畸变、 摄影胶片的感光的非线性、 成像过程的相对运动、 大气的湍流效应、环境随机噪声等原因, 图像会产生一定程度的退化。因此,必须采取一定的方法尽可能地减少或消除图像质量的下降,恢复图像的本来面目, 这就是图像复原, 也称为图像恢复。 图像复原与图像增强有类似的地方, 都是为了改善图像。但是它们又有着明显的不同。图像复原是试图利用退化过程的先验知识使已退化的图像恢复本来面目,即根据退化的原因, 分析引起退化的环境因素,建立相应的数学模型, 并沿着使图 像降质的逆过程恢复图像。从图像质量评价的角度来看, 图像 复原就是提高图像的可理解性。而图像增强的目的是提高视感 质量,图像增强的过程基本上是一个探索的过程, 它利用人的心理状态和视觉系统去控制图像质量, 直到人们的视觉系统满意为止。 图像复原是利用退化现象的某种先验知识,建立退化现象的数学模型,再根据模型进行反向的推演运算,以恢复原来的景物图像。因而,图像复原可以理解为图像降质过程的反向过程。建立图像复原的反向过程的数学模型,就是图像复原的主 要任务。经过反向过程的数学模型的运算,要想恢复全真的景物图像比较困难。所以, 图像复原本身往往需要有一个质量标 准, 即衡量接近全真景物图像的程度,或者说,对原图像的估 计是否到达最佳的程度。 由于引起退化的因素众多而且性质不同,为了描述图像退化过程所建立的数学模型往往多种多样,而恢复的质量标准也往往存在差异性,因此图像复原是一个复杂的数学过程,图像复原的方法、技术也各不相同。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

littletomatodonkey

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值