%% clc; clear; close all; %% filename = 'demo-1'; im = imread([filename, '.jpg']); [u, v] = size(im); figure;subplot(221);imshow(im);title('原始图像');axis on h=double(im); t=1; a=0.1; b=0.1; %中心化 for i=1:u for j=1:v im(i,j)=im(i,j)*(-1)^(i+j); end end F = fft2(im); F=double(F); x=-1*u/2:u/2; x(x==0)=[]; y=-1*v/2:v/2; y(y==0)=[]; for i=1:length(x) for j=1:length(y) v=pi*(x(i)*a+y(j)*b); if v==0 v=1*10^-10; h(i,j)=(t/v)*sin(v)*exp(1)^(-1i*v); else h(i,j)=(t/v)*sin(v)*exp(1)^(-1i*v); end end end S=F.*h; S = ifft2(S); subplot(222);imshow(S,[]);axis on %% SNR = 100;%信噪比 N = randn(size(S)); S_var = var(S(:)); ratio = S_var/SNR; N = sqrt(ratio)*N; noisF = S+N; 补充上述matlab代码在不调用内部函数的条件下实现维纳滤波还原原图像
时间: 2023-10-19 14:07:31 浏览: 88
在不调用内部函数的条件下实现维纳滤波还原原图像,您可以使用以下补充的 MATLAB 代码:
```matlab
clc;
clear;
close all;
filename = 'demo-1';
im = imread([filename, '.jpg']);
[u, v] = size(im);
figure;
subplot(221);
imshow(im);
title('原始图像');
axis on
h=double(im);
t=1;
a=0.1;
b=0.1;
% 中心化
for i=1:u
for j=1:v
im(i,j)=im(i,j)*(-1)^(i+j);
end
end
F = fft2(im);
F = double(F);
x = -1*u/2:u/2;
x(x==0)=[];
y = -1*v/2:v/2;
y(y==0)=[];
for i = 1:length(x)
for j = 1:length(y)
v = pi*(x(i)*a + y(j)*b);
if v == 0
v = 1*10^-10;
h(i,j) = (t/v)*sin(v)*exp(1)^(-1i*v);
else
h(i,j) = (t/v)*sin(v)*exp(1)^(-1i*v);
end
end
end
S = F.*h;
S = ifft2(S);
subplot(222);
imshow(S,[]);
axis on
% 添加高斯噪声
SNR = 100; % 信噪比
N = randn(size(S));
S_var = var(S(:));
ratio = S_var/SNR;
N = sqrt(ratio)*N;
noisyF = S + N;
% 维纳滤波
SNR_inverse = 1/SNR;
noiseVar = ratio;
K = abs(h).^2 ./ (abs(h).^2 + noiseVar ./ abs(F).^2);
restoredF = K .* F;
restoredImage = abs(ifft2(restoredF));
subplot(223);
imshow(noisyF, []);
title('加噪声图像');
axis on
subplot(224);
imshow(restoredImage, []);
title('还原图像');
axis on
```
这段代码首先读取图像并进行运动模糊处理,然后进行频域滤波操作以还原模糊图像。接下来,根据给定的信噪比,添加高斯噪声,并使用维纳滤波方法对加噪声的图像进行还原处理。
请注意,该代码中的 Wiener 滤波器是通过计算频域中的点扩散函数(PSF)和噪声方差来构造的。然后使用计算得到的滤波器对频域图像进行滤波,最后通过 IFFT 转换回空域以获得还原图像。
请确保将代码中的 `'demo-1.jpg'` 替换为实际图像文件的路径。
阅读全文