如何在 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');