图像复原-------逆滤波和维纳滤波介绍及MATLAB实现

由于受到光学系统的像差,成像设备与物体的相对运动等因素的影响,图像会出现一定的失真。要想得到高质量的图像,需要对已经退化后的图像进行复原。

图像退化模型

一般来说,图像的退化模型可以表示为
g ( x , y ) = h ( x , y ) ∗ f ( x , y ) + n ( x , y ) g\left( x,y \right)=h\left( x,y \right)*f\left( x,y \right)+n\left( x,y \right) g(x,y)=h(x,y)f(x,y)+n(x,y)
其中, g ( x , y ) g\left( x,y \right) g(x,y)表示退化后的图像, h ( x , y ) h\left( x,y \right) h(x,y)为点扩散函数, f ( x , y ) f\left( x,y \right) f(x,y)为原始图像, n ( x , y ) n\left( x,y \right) n(x,y)为引入的噪声。
在频域上面可以表示为
G ( u , v ) = H ( u , v ) F ( u , v ) + N ( u , v ) G\left( u,v \right)=H\left( u,v \right)F\left( u,v \right)+N\left( u,v \right) G(u,v)=H(u,v)F(u,v)+N(u,v)

逆滤波

逆滤波是一种常见且直观的图像恢复方法,它的主要过程是将退化后的图像从空间域变换到频域,进行逆滤波后在变换到空间域上从而实现图像的复原。
从上面的介绍可以得到,图像的退化模型为
g ( x , y ) = h ( x , y ) ∗ f ( x , y ) + n ( x , y ) = ∫ − ∞ + ∞ f ( α , β ) h ( x − α , y − β ) d α d β + n ( x , y ) \begin{aligned} & g\left( x,y \right)=h\left( x,y \right)*f\left( x,y \right)+n\left( x,y \right) \\ & \text{=}\int_{-\infty }^{+\infty }{f\left( \alpha ,\beta \right)h\left( x-\alpha ,y-\beta \right)d\alpha d\beta +n\left( x,y \right)} \end{aligned} g(x,y)=h(x,y)f(x,y)+n(x,y)=+f(α,β)h(xα,yβ)dαdβ+n(x,y)
将其变换到频域可以得到
G ( u , v ) = H ( u , v ) F ( u , v ) + N ( u , v ) G\left( u,v \right)=H\left( u,v \right)F\left( u,v \right)+N\left( u,v \right) 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 ) = F ( u , v ) − N ( u , v ) H ( u , v ) \begin{aligned} & {F}'\left( u,v \right)\text{=}\frac{G\left( u,v \right)}{H\left( u,v \right)}-\frac{N\left( u,v \right)}{H\left( u,v \right)} \\ & =F\left( u,v \right)-\frac{N\left( u,v \right)}{H\left( u,v \right)} \end{aligned} F(u,v)=H(u,v)G(u,v)H(u,v)N(u,v)=F(u,v)H(u,v)N(u,v)
F ( u , v ) = G ( u , v ) H ( u , v ) + N ( u , v ) H ( u , v ) = F ′ ( u , v ) + N ( u , v ) H ( u , v ) \begin{aligned} & {F}\left( u,v \right)\text{=}\frac{G\left( u,v \right)}{H\left( u,v \right)}+\frac{N\left( u,v \right)}{H\left( u,v \right)} \\ & =F'\left( u,v \right)+\frac{N\left( u,v \right)}{H\left( u,v \right)} \end{aligned} F(u,v)=H(u,v)G(u,v)+H(u,v)N(u,v)=F(u,v)+H(u,v)N(u,v)
将其进行傅里叶反变换可以得到复原图像 f ⌢ ( x , y ) = F − 1 [ F ( u , v ) ] \overset{\scriptscriptstyle\frown}{f}\left( x,y \right)={{F}^{-1}}\left[ {F}\left( u,v \right) \right] f(x,y)=F1[F(u,v)]
但是仅仅知道 H ( u , v ) H\left( u,v \right) H(u,v)时,逆滤波复原存在一定的难度,而且逆滤波复原对信噪比的要求比较高。

维纳滤波

维纳滤波是另外一种比较常见的图像复原方法,计算复杂度相对较小并且考虑了噪声的影响。通常情况下,假设图像和噪声是相互独立的且至少存在一个均值为零,恢复图像和模糊图像两者的灰度级呈线性关系时,维纳滤波可表示为
F ′ ( u , v ) = ( 1 H ( u , v ) ∣ H ( u , v ) ∣ 2 ∣ H ( u , v ) ∣ 2 + K ) G ( u , v ) {F}'\left( u,v \right)=\left( \frac{1}{H\left( u,v \right)}\frac{|H\left( u,v \right){{|}^{2}}}{|H\left( u,v \right){{|}^{2}}+K} \right)G\left( u,v \right) F(u,v)=(H(u,v)1H(u,v)2+KH(u,v)2)G(u,v)
∣ H ( u , v ) ∣ 2 = H ˉ ( u , v ) H ( u , v ) |H\left( u,v \right){{|}^{2}}=\bar{H}\left( u,v \right)H\left( u,v \right) H(u,v)2=Hˉ(u,v)H(u,v)
K = S n ( u , v ) / S f ( u , v ) K={{S}_{n}}\left( u,v \right)/{{S}_{f}}\left( u,v \right) K=Sn(u,v)/Sf(u,v)
其中, S n ( u , v ) {{S}_{n}}\left( u,v \right) Sn(u,v)为噪声功率谱, S f ( u , v ) {{S}_{f}}\left( u,v \right) Sf(u,v)为原图像功率谱。当信噪比较大时, K → 0 K\to 0 K0,此时维纳滤波可转换为逆滤波;当信噪比较小时, K → + ∞ K\to +\infty K+,图像存在难以复原的问题。

仿真结果

在这里插入图片描述
从图中可以看出,经过逆滤波后的效果不如维纳滤波效果好,同时也能看出由于只知道点扩散函数,不知道噪声对最终的结果有较大的影响,相比之下,维纳滤波表现出更好的性能。
代码如下
主函数

clear;
close all;
clc;
N = 256;
x = double(imread('lenna.jpg'));
figure(1)
subplot(221)
imshow(x,gray(256));title('原始图像');
h = ones(4,4)/16;  %点扩散函数
sigma = 15;         %噪声方差

Xf = fft2(x);
Hf = fft2(h,N,N);
y = real(ifft2(Hf.*Xf))+sigma*randn(N,N); %退化图像
%y = filter2(h,x)+sigma*randn(N,N);	  %退化图像
subplot(222)
imshow(y,gray(256));title('退化图像');
gamma = 2;
eix = inverseFilter(y,h,gamma);
subplot(223)
imshow(eix,gray(256));title('逆滤波复原');
%% 广义维纳滤波
gamma = 1;
alpha = 1;
ewx = wienerFilter(y,h,sigma,gamma,alpha);
subplot(224)
imshow(ewx,gray(256));title('维纳滤波复原');

inverseFilter.m

function restored_x = inverseFilter(y,h,gamma)
%% 广义逆滤波
N = size(y,1);  %大小
Yf = fft2(y);   %频域变换
Hf = fft2(h,N,N); %点扩散函数
sHf = Hf.*(abs(Hf)>0)+1/gamma*(abs(Hf)==0);  %处理为零的情况
iHf = 1./sHf;     %求逆
iHf = iHf.*(abs(Hf)*gamma>1)+gamma*abs(sHf).*iHf.*(abs(sHf)*gamma<=1);
restored_x = real(ifft2(iHf.*Yf));   %复原图像
end

wienerFilter.m

function ex = wienerFilter(y,h,sigma,gamma,alpha)
%广义维纳滤波,当alpha=1时退化为维纳滤波

N = size(y,1);
Yf = fft2(y);
Hf = fft2(h,N,N);
Pyf = abs(Yf).^2/N^2;
sHf = Hf.*(abs(Hf)>0)+1/gamma*(abs(Hf)==0);
iHf = 1./sHf;
iHf = iHf.*(abs(Hf)*gamma>1)+gamma*abs(sHf).*iHf.*(abs(sHf)*gamma<=1);

Pyf = Pyf.*(Pyf>sigma^2)+sigma^2*(Pyf<=sigma^2);
Gf = iHf.*(Pyf-sigma^2)./(Pyf-(1-alpha)*sigma^2);
eXf = Gf.*Yf;
ex = real(ifft2(eXf));

end

  • 10
    点赞
  • 149
    收藏
    觉得还不错? 一键收藏
  • 18
    评论
以下是使用MATLAB实现的彩色模糊图像复原维纳滤波滤波、lucy-richardson的代码: ```matlab function img_restore = weiner_filter(img, psf, snr) [H, W, ~] = size(img); psf = psf / sum(psf(:)); psf_pad = zeros(H, W); psf_pad(1:size(psf, 1), 1:size(psf, 2)) = psf; psf_shift = fftshift(psf_pad); img_fft = fft2(img); psf_fft = fft2(psf_shift); psf_fft_abs = abs(psf_fft) .^ 2; snr = 10 ^ (snr / 10); weiner_filter = conj(psf_fft) ./ (psf_fft_abs + snr ./ img_fft); img_restore = real(ifft2(img_fft .* weiner_filter)); img_restore = uint8(max(min(img_restore, 255), 0)); end function img_restore = inverse_filter(img, psf) [H, W, ~] = size(img); psf = psf / sum(psf(:)); psf_pad = zeros(H, W); psf_pad(1:size(psf, 1), 1:size(psf, 2)) = psf; psf_shift = fftshift(psf_pad); img_fft = fft2(img); psf_fft = fft2(psf_shift); inverse_filter = conj(psf_fft) ./ (abs(psf_fft) .^ 2 + eps); img_restore = real(ifft2(img_fft .* inverse_filter)); img_restore = uint8(max(min(img_restore, 255), 0)); end function img_restore = lucy_richardson(img, psf, n_iter) [H, W, ~] = size(img); psf = psf / sum(psf(:)); psf_pad = zeros(H, W); psf_pad(1:size(psf, 1), 1:size(psf, 2)) = psf; psf_shift = fftshift(psf_pad); img_restore = ones(size(img)); for i = 1:n_iter error = real(ifft2(fft2(img_restore) .* conj(fft2(psf_shift))) - img); error = ifftshift(error); error_fft = fft2(error); img_restore = real(ifft2(conj(fft2(psf_shift)) .* error_fft)); img_restore = max(min(img_restore, 255), 0); end img_restore = uint8(img_restore); end ``` 其中,`weiner_filter`函数实现维纳滤波,`inverse_filter`函数实现滤波,`lucy_richardson`函数实现滤波lucy-richardson,`img`为输入的彩色模糊图像,`psf`为点扩散函数,`snr`为信噪比,`n_iter`为迭代次数。函数返回复原后的彩色图像。注意,这里使用了`uint8`类型,因此输出的图像像素值范围在[0, 255]之间。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值