用MATLAB进行图像处理

图像处理概念,算法和MATLAB

傅里叶变换,垂直线和水平线

一位读者最近在博客评论中问道,为什么一条垂直线(或边)在图像的傅里叶变换中会显示为一条水平线。我想我应该用我能想到的最简单的例子来解释这一点。

我将从一张常量黑色的图像开始,除了中间有一条垂直的直线。

X = 0 (200,200);X (:, 100) = 1;imshow (x)

接下来我将计算并显示2-D傅里叶变换的对数幅值。

X = fft2(X);imshow(fftshift(log(abs(X) + 1)), [])

有一个白纸黑字的问题,可以这么说:为什么在二维傅里叶变换中会有一条水平线?

尽管我要避免方程和其他复杂的东西在我的回答中,我必须解释一些关于一维和二维傅里叶变换的事情。

首先,“脉冲序列”的一维傅里叶变换的幅度是一个常数。一个“脉冲序列”是一个只有在一个地方非零的序列,就像下面这个:

X1 = [0 0 1 0 0]
X1 = 0 0 1 0 0

的一维傅里叶变换的大小x是不变的:

abs (fft (x1))
Ans = 1.0000 1.0000 1.0000 1.0000

第二,常数序列的一维傅里叶变换的幅度是一个脉冲。也就是说,傅里叶变换只有在一处是非零的。

X2 = [1 1 1 1 1 1]
X2 = 1 1 1 1 1 1
abs (fft (x2))
Ans = 5 0 0 0 0

最后,计算二维傅里叶变换在数学上等价于计算所有行的一维傅里叶变换然后计算结果所有列的一维傅里叶变换。顺序(行优先或列优先)实际上并不重要。

现在我们回到x我们的200 × 200矩阵中间有一条垂直线。每行x为脉冲序列:

情节(x (50,:))

所以如果我们计算所有行的傅里叶变换,它们都是常量(大小):

X_rows = fft(x, [], 2);plot(abs(X_rows(50,:))) ylim([0 2])

计算二维傅里叶变换的下一步是计算列的一维傅里叶变换X_rows.但是这些列是常数。这是第100列X_rows

plot(abs(X_rows(:, 100))) ylim([0 2])

正如我上面所说,常数序列的傅里叶变换是一个脉冲。如果将所有包含脉冲序列的结果列叠加起来,结果看起来像一条水平线。

X = fft(X_rows, [], 1);imshow(fftshift(log(abs(X) + 1)), [])

这是一步一步的计算解释。让我留给你更多概念性的解释(也就是简单的解释)。让我们把输入图像和二维傅里叶变换放在一起看。

Subplot (1,2,1)“x”) subplot(1,2,2) imshow(fftshift(log(abs(X) + 1)), []) title(fft2(x)的对数模

你可以考虑水平截面和垂直截面。的各横截面x是一个脉冲序列。脉冲序列的傅里叶变换是常数,所以傅里叶变换的水平截面是常数。

同样,每个垂直横截面x是一个常数序列。常数序列的傅里叶变换是一个脉冲序列,所以傅里叶变换的垂直截面是脉冲。所有的脉冲都彼此对齐,导致出现一条水平线。

这些解释对你有用吗?你知道另一种更好的解释方式吗?请在下方评论留言。




使用MATLAB®7.11发布

|
  • 打印
  • 发送电子邮件

评论

如欲留言,请点击在这里登录您的MathWorks帐户或创建一个新帐户。