找到图像中包含的谐波?

信息处理 图像处理 matlab fft 傅里叶变换 opencv
2022-02-24 06:11:57

我是图像处理的初学者。任何信号,无论是 1D、2D 还是任何多维信号,都可以使用正弦和余弦波形(谐波)数的组合来表示。同样,任何图像都可以称为正弦信号的函数。

我想查看图像中存在的波形/谐波数量的单个模式。例如,以下链接包含其中的少数http://www.cs.toronto.edu/~rfm/factored/filters_out.png那么Matlab/OpenCV中是否有任何代码或结果可以轻松理解任何图像中存在的这些分量(正弦和余弦函数(谐波))?

2个回答

这个问题经常被问到。如果您没有掌握 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 结果将是一个基本上没有特征的灰色糊状物。这只是告诉您图像包含许多不同频率的混合,或者换句话说,图像中的对象具有各种不同的大小和方向。