如何在 matlab 中使用滤波器去除图像中的多频噪声?
How to remove multifrequency noise from image using filter in matlab?
我有一张包含多频噪声的图像,我使用了此 link 中的代码:
源图片:orig_image
但是我的最终图像噪声并没有被去除。
如你所知,我必须删除垂直方向的渐变。图像的频率表示如下:
fft of image
有没有人知道在 matlab 中消除这种噪音?
我应用 sobel 过滤器和中值过滤器但没有改进。
请注意,我的目标是删除对象内部的线条。
问候。
这是我曾经用于我曾经不得不做的作业的代码。这是一个比你的例子简单得多的例子。频域中总共只有 4 个分量导致噪声,因此只需手动将这 4 个分量设置为零 (hfreq) 即可解决我的问题。我不知道这对你的情况有多好,也许编写一个算法来找到合适的突出的 hfreqs 会有所帮助。 这是我使用的原始图像:
这是我使用的代码:
% filtering out the noisy image
clc
clear all
close all
image = imread('freqnoisy.png');
image = double(image);
image = image/(max(max(image)));
imshow(image) % show original image
Fimage = fft2(image);
figure
imshow(((fftshift(abs(Fimage)))),[0 5000]) %shows all frequency peaks that stick out
hfreq = ones(256);
hfreq(193,193)=0;
hfreq(65,65) = 0;
hfreq(119,105) = 0;
hfreq(139,153)= 0;
%
Fimage_filtered = fftshift(Fimage).*hfreq;
figure
imshow(abs(Fimage_filtered),[0 5000]) % show freq domain without undesired freq
filtered_im = ifft2(ifftshift(Fimage_filtered));
figure
imshow(filtered_im)
这就是您的输出结果:
你有两种噪点:不规则的水平线和椒盐色。只要对象不覆盖整个水平范围(在您的示例中不覆盖),摆脱线条就很容易。
我只是在左边采样了一个小的垂直条纹,只得到条纹,然后从整个图像中减去它们。使用中值滤波器去除椒盐噪声很简单。
结果:
代码:
% read the image
img = imread('http://i.stack.imgur.com/zBEFP.png');
img = double(img(:, :, 1)); % PNG is uint8 RGB
% take mean of columsn 100..200 and subtract from all columns
lines = mean(img(:, 100:200), 2);
img = img - repmat(lines, 1, size(img, 2));
% remove salt and pepper noise
img =medfilt2(img, [3,3], 'symmetric');
% display and save
imagesc(img); axis image; colormap(gray);
imwrite((img - min(img(:))) / (max(img(:)) - min(img(:))), 'car.png');
我有一张包含多频噪声的图像,我使用了此 link 中的代码:
这是我曾经用于我曾经不得不做的作业的代码。这是一个比你的例子简单得多的例子。频域中总共只有 4 个分量导致噪声,因此只需手动将这 4 个分量设置为零 (hfreq) 即可解决我的问题。我不知道这对你的情况有多好,也许编写一个算法来找到合适的突出的 hfreqs 会有所帮助。
这是我使用的代码:
% filtering out the noisy image
clc
clear all
close all
image = imread('freqnoisy.png');
image = double(image);
image = image/(max(max(image)));
imshow(image) % show original image
Fimage = fft2(image);
figure
imshow(((fftshift(abs(Fimage)))),[0 5000]) %shows all frequency peaks that stick out
hfreq = ones(256);
hfreq(193,193)=0;
hfreq(65,65) = 0;
hfreq(119,105) = 0;
hfreq(139,153)= 0;
%
Fimage_filtered = fftshift(Fimage).*hfreq;
figure
imshow(abs(Fimage_filtered),[0 5000]) % show freq domain without undesired freq
filtered_im = ifft2(ifftshift(Fimage_filtered));
figure
imshow(filtered_im)
这就是您的输出结果:
你有两种噪点:不规则的水平线和椒盐色。只要对象不覆盖整个水平范围(在您的示例中不覆盖),摆脱线条就很容易。
我只是在左边采样了一个小的垂直条纹,只得到条纹,然后从整个图像中减去它们。使用中值滤波器去除椒盐噪声很简单。
结果:
代码:
% read the image
img = imread('http://i.stack.imgur.com/zBEFP.png');
img = double(img(:, :, 1)); % PNG is uint8 RGB
% take mean of columsn 100..200 and subtract from all columns
lines = mean(img(:, 100:200), 2);
img = img - repmat(lines, 1, size(img, 2));
% remove salt and pepper noise
img =medfilt2(img, [3,3], 'symmetric');
% display and save
imagesc(img); axis image; colormap(gray);
imwrite((img - min(img(:))) / (max(img(:)) - min(img(:))), 'car.png');