2016-11-25 171 views
1

我想在python中实现一些将图像转换为其傅立叶域的功能,反之亦然,以实现图像处理任务。
我使用重复的1D-DFT实现了2D-DFT,并且它工作得很好,但是当我试图使用重复的反向1D-DFT实现2D反向DFT时,出现了一些奇怪的问题 - 当我将图像转换为其傅里叶域时,然后再返回到图像域,它看起来像图像被反射,并与它的反射合并,如在这里可以看到:使用1D变换实现二维逆傅里叶变换

这是输入:

img

这就是输出

img

这是负责乱七八糟的功能:

def IDFT2(fourier_image): 
    image = np.zeros(fourier_image.shape) 
    for col in range(image.shape[1]): 
     image[:, col] = IDFT1(fourier_image[:, col]) 

    for row in range(image.shape[0]): 
     image[row, :] = IDFT1(image[row,:]) 

    return image 

我做了什么错?我非常肯定IDFT1可以正常工作,常规2D-DFT也是如此。

+0

为什么你有你的结果IDFT1(fourier_image [:,col])列和IDFT1(图像[行,:])行而不是IDFT1(fourier_image [row,:])?请为IDFT1提供您的代码。 – DimKoim

+0

据我所知,在第二阶段(行),我需要操作上一阶段的输出(colums通过)。我错了吗? –

+0

@montecarlo您可能错误地编辑了图像(我将它们添加回来)。在标记代码中,'![bla bla] [1]'意味着从链接列表中首次链接到图像。 '!'表示没有它的图像只是链接 – Spektre

回答

2

我不使用Python的所以我不自信来分析你的代码,但我敢打赌,你最有可能忘记在某个阶段实现复杂的价值观....

它应该是:

  1. DFT从实际行到复杂域
  2. DFT结果列从复杂到复杂域
  3. 如果需要
  4. 任何或没有处理...
  5. 的iDFT行从复杂到复杂域
  6. 的iDFT结果列从复杂到真实域名应用规范化
  7. 如果需要
  8. 应用规范化

如果您仅使用真实复杂域DFT/iDFT在第二次通过(项目符号#2,#6),那么它会创建镜像,因为DFT真实值是一个镜像序列... Btw。如果您先处理行或列,则无关紧要...您也可以先在DFT和列中首先处理行iDFT结果应该相同+/-浮动错误...

更多信息请参见

和所有的子链接有特别的2D FFT and wrapping example这样你可以比较的东西的工作

+0

你是最正确的!行'np.real(signal).astype(np.float32)'将复数转换为真正的复数。删除该行解决了问题。 –

+0

@NadavBorenstein乐于帮助 – Spektre