この投稿に従って、フーリエ変換を使用して特定の周波数分布を持つピンク ノイズを生成します。周波数に一致する画像と、出力ノイズのサイズの寸法を与えることができる必要があります。私が抱えている問題は、現在のコードがノイズの中に水平の黒いバーを生成することがあるということです。この問題を「pinktransformed = fouriertransformed / f**2」という行までたどりました。ここでは、特定の画像を入力として指定すると、ゼロ除算エラーが発生します。これは、ほとんどの入力画像では発生しません。
私が抱えている問題は、 f の値が正しくないことだと思います。現在、画像のフーリエ変換を f として使用しているだけですが、それは正しくないと思います。上記のリンクは言う
f は、フーリエ変換の各ビンに対応する周波数を含む配列です。元の画像は画像内の空間位置を取り、それをホワイト ノイズである「エネルギー」に変換します。フーリエ変換を行っています。つまり、値はまだエネルギーですが、配列内の位置は空間「周波数」または 1/波長に対応しています。これらは波動ベクトルと呼ばれ、平面波に対応します。各位置をその位置での波動ベクトルの大きさで割る必要があります。
f に対してこの正しい値を作成した場合、現在のコードは機能すると思いますが、各位置をその位置での波動ベクトルの大きさで割ることの意味がわかりません。これを解決するには、コードで何を変更する必要がありますか?
これが私の現在の関数です(imgはPILイメージとしてロードされ、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