我是图像处理的初学者。任何信号,无论是 1D、2D 还是任何多维信号,都可以使用正弦和余弦波形(谐波)数的组合来表示。同样,任何图像都可以称为正弦信号的函数。
我想查看图像中存在的波形/谐波数量的单个模式。例如,以下链接包含其中的少数http://www.cs.toronto.edu/~rfm/factored/filters_out.png。那么Matlab/OpenCV中是否有任何代码或结果可以轻松理解任何图像中存在的这些分量(正弦和余弦函数(谐波))?
我是图像处理的初学者。任何信号,无论是 1D、2D 还是任何多维信号,都可以使用正弦和余弦波形(谐波)数的组合来表示。同样,任何图像都可以称为正弦信号的函数。
我想查看图像中存在的波形/谐波数量的单个模式。例如,以下链接包含其中的少数http://www.cs.toronto.edu/~rfm/factored/filters_out.png。那么Matlab/OpenCV中是否有任何代码或结果可以轻松理解任何图像中存在的这些分量(正弦和余弦函数(谐波))?
这个问题经常被问到。如果您没有掌握 1d 中的 fft,则可能难以掌握更高的维度。但从逻辑上讲,一旦你看到它,它就很有意义。在图像的情况下,频域表示什么?
基本上急剧变化(高对比度噪声)通常具有高频。更平滑的梯度具有较低的频率。就像一个快速的速成课程
编辑
抱歉,我认为另一篇文章有代码,它只是与代码无关的概念性内容。无论如何我会告诉你matlab(因为你的标签里面写着matlab)而且我比openCV更熟悉
function fft_im = createFFTIm(grayscale_im)
fft_im = fft2(grayscale_im);
figure()
subplot(2,2,1:2);imshow(grayscale_im); title('original');
%fftshift puts the 0 frequency in the middle of the plotting area, normally
%it would be split, part of it in the 4 corners of the image
%we add 1 because log(0) is -inf, which we dont want
%we scale it jsut to show the colors better
subplot(2,2,3);imagesc(log(1+abs(fftshift(fft_im)))); colormap(gray);
title('magnitude spectrum');
subplot(2,2,4);imagesc(angle(fft_im)); colormap(gray);
title('phase spectrum');
end
编辑#2我稍微修改了代码
这里有两个例子

请注意,以国际象棋为例,幅度谱中有可见的峰值。就像常规 fft 一样,这些峰值对应于特定频率的单波。由于输出图像是周期性的,因此在相应频率处存在强正弦波。您还注意到,由于图像接近对称,相位也是周期性的。该阶段负责对图像不对称这一事实进行建模
编辑#3 这将图形分解为单独的元素。在代码中,我将其限制为 4x4 像素子块(图的左上部分),但您可以将其一直更改为图像的大小(尽管对于任何大图像,这将非常慢)
正如我在评论中所说,我一次处理一个像素的图像,并对这 1 个像素的图像中的每一个进行 FFT2。图像本身仍然与原始大小相同,只是填充了一个像素值
function fft_im = decomposedcreateFFTIm(grayscale_im)
%i only did a small 16 pixel sub block of the image, 4x4 pixels from
%the upper left corner of the image
max_rows_to_process = 4;
max_cols_to_process = 4;
[m,n] = size(grayscale_im);
%this is used to isolate pixels, for individual analysis
zer_array = zeros(m,n);
figure(1);title('magnitude')
figure(2);title('phase')
%i only did a small 16 pixel sub block of the image, 4x4 pixels from
%the upper right corner of the image
m=4;n=4;
%for all rows
for ii=1:1:max_rows_to_process
%for all columns
for jj=1:1:max_cols_to_process
curr_idx = (ii-1)*max_cols_to_process + jj;
%creates an image with only one pixel
indiv_pix_pic = zer_array;
indiv_pix_pic(ii,jj) = grayscale_im(ii,jj);
%does fft
fft_im = fft2(indiv_pix_pic);
%fftshift puts the 0 frequency in the middle of the plotting area, normally
%it would be split, part of it in the 4 corners of the image
%we add 1 because log(0) is -inf, which we dont want
%we scale it jsut to show the colors better
figure(2)
subplot(max_rows_to_process,max_cols_to_process,curr_idx);
imagesc(angle(fft_im)); colormap(gray);
figure(1)
subplot(max_rows_to_process,max_cols_to_process,curr_idx);
imagesc(log(1+abs(fftshift(fft_im)))); colormap(gray);
end
end
end
震级

阶段

如果您想查看傅里叶变换的结果,那么这并不难。
MxN 图像的 FFT 是复数的 MxN 数组。每个复数值代表一个特定频率的正弦波的幅度和相位 - 或者更准确地说是一对频率(水平和垂直),因为它是一个 2D FFT。(顺便说一句:余弦波只是具有不同相位的正弦波,因此我们可以将结果视为正弦波的总和)
要查看大小,请取这些复数的绝对值。然后将结果重新缩放为 0 .. 255 或 0.0 ... 1.0(后者在 Matlab 下可能更好)。您现在有一个 MxN 数字数组,它与图像相同。因此,将其显示为图像。
如果结果几乎是黑色并带有一些白点,您可能需要应用某种形式的对比度增强(例如直方图均衡)来查看其他任何内容。
生成的“图像”将从上到下和从左到右对称。中心的值是“DC”或零频率分量。当您远离中心时,您会看到更高频率的正弦波。边缘的频率是可能的最高频率 - 对应于原始图像中交替的黑白像素。
对于大多数真实世界的图像,被视为图像的 FFT 结果将是一个基本上没有特征的灰色糊状物。这只是告诉您图像包含许多不同频率的混合,或者换句话说,图像中的对象具有各种不同的大小和方向。