0

我正在关注这篇文章,以使用傅立叶变换生成具有特定频率分布的粉红噪声。我需要能够给它一个图像以匹配输出噪声大小的频率和尺寸。我遇到的问题是我当前生成的代码有时会在噪音中生成水平黑条。我已将问题追溯到“pinktransformed = Fouriertransformed / f**2”行,其中在给定某些图像作为输入的情况下发生除以零错误。大多数输入图像不会发生这种情况。

这是黑条的示例

我认为我遇到的问题是我对 f 的值不正确。现在我只是将图像的傅立叶变换用作f,但我认为这是不对的。上面的链接说

f 是一个数组,其中包含与傅立叶变换的每个 bin 对应的频率。您的原始图像在图像中占据空间位置并将其转换为“能量”,即白噪声。您正在进行傅里叶变换,这意味着虽然该值仍然是能量,但数组中的位置对应于空间“频率”或 1/波长。这些被称为波矢量,对应于平面波。您需要将每个位置除以该位置的波矢量的大小。

我认为如果我刚刚为 f 创建了这个正确的值,我当前的代码就可以工作,但我只是不明白将每个位置除以该位置的波矢量的大小意味着什么。我必须在我的代码中修改什么来解决这个问题?

这是我当前的函数(img 作为 PIL Image 加载,然后转换为 numpy 数组,dim 是 2 元组):

def generatenoise(img,dim):
     whitenoise = np.random.uniform(0,256,(img.shape[0],img.shape[1],3))
     fouriertransformed = np.fft.fftshift(np.fft.fft2(whitenoise))
     f = np.fft.fftshift(np.fft.fft2(img))
     pinktransformed = fouriertransformed / f**2
     pinknoise = np.fft.ifft2(np.fft.ifftshift(pinktransformed)).real
     pinknoise = np.resize(pinknoise, (dim[0],dim[1],3))

return pinknoise
4

0 回答 0