復元する画像のフル フーリエ スペクトルがある場合、fftw3 を使用して画像を復元するにはどうすればよいですか? fftwf_complex **arr1 を fftwf_complex *arr2 に変換して fftwf_plan_dft_c2r_2d に入れようとしましたが、出力では予期しないノイズが発生しましたが、予期したイメージではありませんでした。
int size_s = 1030;
fftwf_complex **ifftshifted - 1030x1030 pixels image
fftwf_complex *result_prefin = fftwf_malloc(size_s * size_s * sizeof(fftwf_complex));
for (int i = 0; i < size_s; i ) {
for (int j = 0; j < size_s; j ) {
result_prefin[j i * size_s][0] = ifftshifted[i][j][0]; //real
result_prefin[j i * size_s][1] = ifftshifted[i][j][1]; //imaginary
}
}
逆高速フーリエ変換を行います。
floaf *result_ifft2 = malloc(size_s * size_s * sizeof(float));
fftwf_plan plan = fftwf_plan_dft_c2r_2d(size_s, size_s, result_prefin, result_ifft2, FFTW_ESTIMATE);
fftwf_execute(plan);
fftwf_destroy_plan(plan);
TIFF に保存するためのイメージの再作成:
float size_dim_fft = size_s*size_s;
float **result_ifft2_normal = (d_vector *)malloc(size_s * sizeof(float*));
for (int i = 0, offset = 0; i < size_s; i ) {
result_ifft2_normal[i] = (d_vector)malloc(size_s * sizeof(d_type));
for (int j = 0; j < size_s; j ) {
result_ifft2_normal[i][j] = result_ifft2[j offset]/size_dim_fft;
}
offset = size_s;
}
IFFTSHIFT を使用してスペクトルが IFFT 関数に入れられているため、FFTSHIFT を使用します。
float **result_fftshift = NULL;
shift2d(&result_ifft2_normal, &result_fftshift, 1030, 1030, 0);
write_tiff("restored.tif",result_fftshift,1030,1030);