在Matlab中使用FFT去除图像中的图案和噪声
image-processing
matlab
11
0

我正在使用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分量。显然,这种方法不是最好的。

在此处输入图片说明

我正在阅读有关做一个高通滤波器的信息,但这似乎消除了傅立叶图像中的所有外部值。这是基于我之前的测试(我没有包含这些图像)。

您是否建议您突出显示除直流分量以外的高强度值。理想情况下,我希望使蒙版看起来像:

在此处输入图片说明

来源: 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')
参考资料:
Stack Overflow
收藏
评论
共 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),
收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题