在matlab中使用FFT去除图像中的图案和噪声

Posted

技术标签:

【中文标题】在matlab中使用FFT去除图像中的图案和噪声【英文标题】:Removing pattern and noise in an image using FFT in matlab 【发布时间】:2013-12-30 03:11:09 【问题描述】:

我正在使用 clown.jpg 图像来消除它所具有的明显图案/噪音。

在对图像进行 FFT 之前,我所做的第一步是将其重新缩放为 2 次方的方形图像(即 256 x 256)。在 matlab 中使用 FFT 和 fftshift 可以进行快速傅里叶变换,其强度集中在图像中。下图是使用前面提到的函数的结果。

我成功地通过在 FFT 图像上手动将“星”归零来消除模式/噪声,如下所示:

通过 IFFT,我获得了更好的图片质量(未显示)。

我的问题是,是否有一种自动将“星星”归零的方法?我已经创建了一个将图像归零的间隔,因为我们不想移除最亮的“星”、DC 分量或低值。这样的阈值如下:

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) )

where fLog is the log(1+abs(Fourier image)) and .7 and .25 are the corresponding
interval percentages.

输出掩码(我将乘以傅立叶图像)如下所示。黑色对应 0 的值,白色对应 1。请注意,此掩码的过滤去除了一些“星”并保留了一些 DC 分量。显然这种方法不是最好的。

我正在阅读有关进行高通滤波器的信息,但这似乎会删除傅里叶图像中的所有外部值。这是基于我之前的测试(我没有包括那些图像)。

您有什么建议可以突出显示除 DC 分量之外的高强度值。理想情况下,我想让面具看起来像:

来源:http://users.accesscomm.ca/bostrum/Imaging/tips/tip1.html

在另一个站点中,提到使用“高通和水平校正 FFT 数据以仅保留代表光栅模式的杂散点”。我不清楚如何准确地做到这一点。

来源:http://www.robotplanet.dk/graphics/raster_removal/

我们将不胜感激。

这是我的源代码来帮助:

I = imread('clown.jpg'); % Read Image

% convert to grayscale
I = rgb2gray(I);

% normalize the image and conver to doubleI
I = double(mat2gray(I));

% Resize the image
I = imresize(I, [256 256]);

% get the size of the image
[rows,cols] = size(I);

% apply FFT
f = fftshift(fft2(I));

% used to plot the image
fLog = log(1 + abs(f));

% filter by a range based on fLog

filter = (fLog > .7*max(fLog(:)) ) | (fLog < .25*max(fLog(:)) );

B = abs(ifft2(f.*filter));

colormap(gray)
subplot(2,2,1),imagesc(I); title('Original Image')
subplot(2,2,2),imagesc(fLog); title('Fourier Image')
subplot(2,2,3),imagesc(filter); title('Zeroed Fourier Image')
subplot(2,2,4),imagesc(B); title('Cleaned Image')
annotation('textbox', [0 0.9 1 0.1], ...
    'String', 'Fourier Analysis on Clown Image', ...
    'EdgeColor', 'none', ...
    'HorizontalAlignment', 'center', ...
    'FontSize', 15, ...
    'FontWeight', 'bold')

【问题讨论】:

你知道直流分量在哪里,为什么不明确排除它们? 这是,顺便说一句,一个相当知名的技术。参见,例如,books.google.com/… 我以前从未见过人们移除“星星”,而只是在 fft 中适当位置附近的一个磁盘。 @MarkRansom 是的,确实如此,但是,我想知道是否有一些代码可以自动执行所有操作 @tom10 确实,它是众所周知的,而且光盘做得很好。但是,如果获得所有明亮值的正确形状,那么它将使图像更好。我只是想知道我提到的网站上的人如何能够如此清晰地戴上面具。所以我想如果他们这样做了,也许其他人也做过类似的事情,并且很乐意分享他们的方法。 【参考方案1】:

我试图检测频域中的局部最大值,并将它们与它们的邻域一起归零。它并不完全干净,但至少在某种程度上实现了一些自动归零。

我的代码:

I=I-mean(I(:));
f = fftshift(fft2(I));
fabs=abs(f);

roi=3;thresh=400;
local_extr = ordfilt2(fabs, roi^2, ones(roi));  % find local maximum within 3*3 range

result = (fabs == local_extr) & (fabs > thresh);

[r, c] = find(result);
for i=1:length(r)
    if (r(i)-128)^2+(c(i)-128)^2>400   % periodic noise locates in the position outside the 20-pixel-radius circle
        f(r(i)-2:r(i)+2,c(i)-2:c(i)+2)=0;  % zero the frequency components
    end
end

Inew=ifft2(fftshift(f));
imagesc(real(Inew)),colormap(gray),

【讨论】:

非常有趣的算法。它通过使用正方形作为掩码来工作。不完全是我想要的,但它是一个自动化的过程。谢谢分享 在执行此操作时考虑制作“钝边”蒙版的效果。这会导致在空间域中出现一种称为“振铃”的现象。您应该始终制作锥形掩模以在变换域中切出频率。 看起来不错!对于那些(像我一样)不熟悉 Matlab 的人来说,在代码中添加一些 cmets 会很棒。为什么要减去图像媒体? (line I=I-mean(I(:));)【参考方案2】:

我最近为我的作业写了我的陷波滤波器,我努力寻找一个示例代码,这是我的代码,我希望它会有所帮助。谢谢大家。

它是去除周期性噪声的理想陷波抑制滤波器。

I = imread('clown.jpg'); %read image
I = imresize(I, [256 256]); %resize image
[m,n] = size(I);%get size of image as m and n
[X,Y]=meshgrid(1:256,1:256); % it is a meshgrid for circle mask
filter=ones(m,n); % filter initially only ones in it
%according to notch filter equation it will find point on image is on    imaginary circle.i found circle coordinates.
for i=1:m-1
  for j=1:n-1
  d0 = i-130)^2 + (j-130)^2 <= 32^2 && (i-130)^2 + (j-130)^2 >=20^2; 
      if d0
         filter(i,j)=0;
     else
         filter(i,j)=1;
     end
   end
 end
f = fftshift(fft2(I));
G = abs(ifft2(f.*filter));
figure(1),imshow(G,[]);

【讨论】:

以上是关于在matlab中使用FFT去除图像中的图案和噪声的主要内容,如果未能解决你的问题,请参考以下文章

均值滤波去除图像噪声的matlab程序

中值滤波去除图像噪声的matlab程序

matlab在空域与频域中去除周期噪声椒盐噪声的简单应用

图像去噪基于matlab回归的非局部均值算法图像去噪含Matlab源码 1898期

使用傅里叶变换从图像中去除周期性噪声

图像去噪基于matlab GUI HSI彩色图像去噪含Matlab源码 1786期