使用matlab进行频率域复原,先产生周期噪声的图像,再用带阻滤波器处理上面的图像
时间: 2024-01-24 14:03:34 浏览: 103
首先,我们可以使用 Matlab 中的 `imnoise` 函数生成周期噪声的图像。下面是一个示例代码:
```matlab
I = imread('lena.png');
I = im2double(I);
[m,n] = size(I);
% 产生周期噪声
f = 10;
[X,Y] = meshgrid(1:n,1:m);
noise = sin(2*pi*f*X/n) + sin(2*pi*f*Y/m);
I_noisy = I + 0.1*noise;
figure;
subplot(1,2,1); imshow(I); title('原始图像');
subplot(1,2,2); imshow(I_noisy); title('带周期噪声的图像');
```
上述代码中,我们首先读入了 Lena 图像,并将其转换为双精度类型。然后,我们使用 `meshgrid` 函数产生了一个网格,并利用 `sin` 函数产生了一个周期为 10 的噪声。最后,将噪声加到原始图像上,并显示出来。
接下来,我们可以使用带阻滤波器对上面的图像进行处理,去除周期噪声。这里我们使用 `ifft2` 函数将图像转换到频域,然后设计一个带阻滤波器,最后使用 `ifft2` 函数将滤波后的频域图像转换回空域。下面是一个示例代码:
```matlab
% 频率域复原
F = fft2(I_noisy);
F_shift = fftshift(F);
[m,n] = size(F);
% 设计带阻滤波器
D0 = 20;
W = 5;
H = zeros(m,n);
for i = 1:m
for j = 1:n
D = sqrt((i-m/2)^2 + (j-n/2)^2);
if (D >= (D0-W/2)) && (D <= (D0+W/2))
H(i,j) = 0;
else
H(i,j) = 1;
end
end
end
% 滤波
G_shift = F_shift .* H;
G = ifftshift(G_shift);
I_filtered = real(ifft2(G));
figure;
subplot(1,3,1); imshow(I); title('原始图像');
subplot(1,3,2); imshow(I_noisy); title('带周期噪声的图像');
subplot(1,3,3); imshow(I_filtered); title('经过带阻滤波器后的图像');
```
上述代码中,我们首先使用 `fft2` 函数将带噪声的图像转换到频域,并使用 `fftshift` 函数将频域图像移动到中心位置。然后,我们设计了一个带阻滤波器,其中 $D_0$ 表示截止半径,$W$ 表示截止带宽。最后,我们将滤波器应用到频域图像上,并使用 `ifft2` 函数将滤波后的频域图像转换回空域。最后,我们显示了原始图像、带周期噪声的图像以及经过带阻滤波器处理后的图像。可以看到,经过处理后的图像中周期噪声被大大减少。
阅读全文