使用 DFT 计算图像的一阶导数

信息处理 自由度 Python
2022-02-05 17:40:08

我需要使用我构建的 DFT 函数(有效)计算灰度图像(二维数组)的一阶导数。不幸的是,结果似乎并不正确。

在傅立叶域中,导数 d/dx 为 F(u,v)* 2*pi*i/N * u,其中 u 是 x 轴变换,N 是矩阵维度之一的大小, v 是另一个。

附上代码。困扰我的是,我得到的结果与通过将 (1,-1) 或 (1,-1) 作为列向量的卷积进行微分不同。

def derivative(fourier_signal):
"""
Derivative in fourier domain is multiplying by u or v, and 2pi*i/N
:param fourier_signal:
:return:
"""
N = np.shape(fourier_signal)[ZERO]
M = np.shape(fourier_signal)[ONE]
u = np.arange(N)
v = np.arange(M)
du = fourier_signal * (u*TWO_PI*1j)/N
dv = fourier_signal * (v*TWO_PI*1j)/M
return du, dv


def fourier_der(im):
    # Calculate DFT2
    dft_image = DFT2(im)
    # Function that Multiply by rows by u, columns by y
    du, dv = derivative(dft_image)
    shifted_du, shifted_dv = np.fft.fftshift(du), np.fft.fftshift(dv)
    dx, dy = IDFT2(shifted_du), IDFT2(shifted_dv)

我不是在寻找关于如何做到这一点的简单答案,而是寻找关于为什么我的输出不正确的方向。

1个回答

它们是不相同的。使用一维符号,

离散时间(后向)一阶差分为x[n]x[n1]其频域 DTFT 等效值为

x[n]x[n1]X(ejω)ejωX(ejω)=X(ejω)(1ejω)

变成

x[n]x[n1]X[k](1ej2πNk)
使用 DFT 来实现它。

因此,实现一阶差分的离散时间系统的 FIR 脉冲响应为:

h[n]=δ[n]δ[n1]

连续变量函数的一阶导数x(t)x(t)在 CTFT 域中它变为:

x(t)jΩX(Ω)

其中模拟系统频率响应为

Hd(Ω)=jΩ

这不能以数字形式实现,但在采样周期下获得了带限近似T产生(带限)微分器的等效离散时间频率响应为

Hd(ejω)=jωT   ,    |ω|<π

相关的离散时间 (IIR) 脉冲响应为

hd[n]=IDTFT{Hd(ejω)}=IDTFT{jωT}

实际上你会截断和窗口hd[n]使用前。

所以他们不一样。