周期噪声滤波
设计思路
周期噪声通常表现为图像中的重复模式,如条纹或波纹,这种噪声可通过频域分析清楚地识别并滤除。设计思路基于将图像从空间域转换到频域,利用傅里叶变换找到并可视化这些周期性模式。接着使用带阻滤波器或陷波滤波器来精确地消除这些特定的频率成分,从而消除或减少噪声影响,最后通过逆傅里叶变换将处理过的频域图像转换回空间域,得到清晰的图像。
实现方法
实验的实施可以通过以下步骤进行:首先,使用傅里叶变换将输入图像从空间域转换到频域。分析得到的频谱图,识别出明显的峰值,这些峰值代表周期噪声的频率成分。设计适当的带阻或陷波滤波器,应用在这些特定的频率上,以滤除噪声。滤波后,使用逆傅里叶变换将频域图像转换回空间域。通过比较滤波前后的图像,验证噪声滤除的效果。
matlab代码
我们先查看图片的整体频域图像
% 读取图像
img = imread('R.jpg');
grayImg = rgb2gray(img);
% 进行傅里叶变换
F = fft2(double(grayImg));
F_shift = fftshift(F); % 中心化频谱
% 计算幅度谱并进行对数变换以增强显示效果
magnitudeSpectrum = log(1 + abs(F_shift));
% 显示原始图像
figure;
subplot(1, 2, 1);
imshow(grayImg);
title('Original Image');
% 显示频域图
subplot(1, 2, 2);
imshow(magnitudeSpectrum, []);
title('Magnitude Spectrum');
我们发现频域中有异常的亮光,然后我们分别查看x轴和y轴的频域,查看异常频率
% 读取并转换图像为灰度
img = imread('R.jpg');
grayImg = rgb2gray(img);
% 计算沿x轴和y轴的一维傅里叶变换
F_x = fftshift(fft(double(grayImg), [], 2)); % 沿x轴(每一行)
F_y = fftshift(fft(double(grayImg), [], 1)); % 沿y轴(每一列)
% 计算幅度谱
magnitudeSpectrumX = abs(F_x);
magnitudeSpectrumY = abs(F_y);
% 获取频率向量
freqX = linspace(-0.5, 0.5, size(grayImg, 2)) * size(grayImg, 2);
freqY = linspace(-0.5, 0.5, size(grayImg, 1)) * size(grayImg, 1);
% 显示x轴的频谱图
figure;
plot(freqX, magnitudeSpectrumX(floor(size(grayImg, 1)/2) + 1, :)); % 取中间一行
title('Frequency Spectrum along X-axis');
xlabel('Frequency (cycles per pixel)');
ylabel('Magnitude');
% 显示y轴的频谱图
figure;
plot(freqY, magnitudeSpectrumY(:, floor(size(grayImg, 2)/2) + 1)); % 取中间一列
title('Frequency Spectrum along Y-axis');
xlabel('Frequency (cycles per pixel)');
ylabel('Magnitude');
我们分别从x轴和y轴发现了异常值,通过设计一个对应的带阻滤波器去去除这些异常值。
% 读取并转换图像为灰度
img = imread('R.jpg');
grayImg = rgb2gray(img);
% 进行傅里叶变换
F = fft2(double(grayImg));
F_shift = fftshift(F); % 中心化频谱
% 获取图像的尺寸
[rows, cols] = size(grayImg);
% 初始化滤波器为全1,即无阻断效果
filter = ones(rows, cols);
% 设定x轴和y轴的阻带
x_bands = [48 53; 58 65; 70 77; 80 83; 102 107; 109 115; 117 148; 152 159; 164 166; 173 178; 195 199; 318 321]; % x轴的阻带
y_bands = [44 54; 69 77; 115 130; 164 176; 187 189; 241 243; 256 261]; % y轴的阻带
% 中心索引
xc = floor(cols / 2) + 1;
yc = floor(rows / 2) + 1;
% 应用x轴阻带
for i = 1:size(x_bands, 1)
filter(:, xc+x_bands(i, 1):xc+x_bands(i, 2)) = 0;
filter(:, xc-x_bands(i, 2):xc-x_bands(i, 1)) = 0;
end
% 应用y轴阻带
for i = 1:size(y_bands, 1)
filter(yc+y_bands(i, 1):yc+y_bands(i, 2), :) = 0;
filter(yc-y_bands(i, 2):yc-y_bands(i, 1), :) = 0;
end
% 应用滤波器
F_filtered = F_shift .* filter;
% 进行逆傅里叶变换
result = ifft2(ifftshift(F_filtered));
result = real(result); % 取实部
% 显示结果
figure;
subplot(2,3,1);
imshow(log(1 + abs(F_shift)), []);
title('Original Frequency Spectrum');
subplot(2,3,2);
imshow(filter, []);
title('Filter Design');
subplot(2,3,3);
imshow(log(1 + abs(F_filtered)), []);
title('Filtered Frequency Spectrum');
subplot(2,3,4);
imshow(grayImg, []);
title('Original Image');
subplot(2,3,5);
imshow(result, []);
title('Filtered Image');
维纳滤波
设计思路
维纳滤波的设计思路基于最小均方误差原则,旨在恢复由模糊和噪声退化的图像。它通过在频域内综合考虑退化图像、退化过程(如模糊)、原始图像的功率谱以及噪声的功率谱来实现。滤波器权衡了信号与噪声的比例,强化了图像的重要特征,同时抑制了噪声主导的频率成分。
实现方法
实现维纳滤波包括几个关键步骤:首先,执行受损图像的傅里叶变换以获得其频域表示。接着,基于估计或已知的退化函数、原始图像和噪声的功率谱构建维纳滤波器。然后,将此滤波器应用于退化图像的频域表示,进行滤波操作。最后,通过逆傅里叶变换将处理后的数据转换回空间域以获得恢复后的图像。
% 读取图像
img = imread('G.jpg');
gray_img = rgb2gray(img);
double_gray_pic = im2double(gray_img);
% 添加运动模糊
H_motion = fspecial('motion', 18, 90);
motion_blur = imfilter(double_gray_pic, H_motion, 'conv', 'circular');
% 添加高斯噪声
noise_mean = 0;
noise_var = 0.001;
motion_blur_noise = imnoise(motion_blur, 'gaussian', noise_mean, noise_var);
% 计算噪声信号比
signal_var = var(double_gray_pic(:));
nsr = noise_var / signal_var;
% 使用维纳滤波进行复原
restored_image = deconvwnr(motion_blur_noise, H_motion, nsr);
% 显示结果
figure;
subplot(1,3,1);
imshow(gray_img, []);
title('Original Gray Image');
subplot(1,3,2);
imshow(motion_blur_noise, []);
title('Motion Blur with Noise');
subplot(1,3,3);
imshow(restored_image, []);
title('Restored Image Using Wiener Filter');