プロが教えるわが家の防犯対策術!

画像を2次元フーリエ変換した後に画像を2次元逆フーリエ変換した際にできた画像が,元の画像に元の画像を左右反転した画像と,上下反転,上下反転後左右に反転した画像が合成されたような画像になってしまいます.なぜこのような画像が出力されてしまうのかお教えください.
使用言語: C
添付画像: 元は'あ'です

// 転置
double *_image_re, *_image_im;
_image_re = (double*)malloc(sizeof(double) * x * y); //メモリの確保
if (_image_re == NULL){
printf("メモリ領域の確保に失敗しました.\n");
exit(1);
}
_image_im = (double*)malloc(sizeof(double) * x * y); //メモリの確保
if (_image_im == NULL){
printf("メモリ領域の確保に失敗しました.\n");
exit(1);
}

for (int i = 0; i < y; i++){
for (int j = 0; j < x; j++){
*(_image_re + x * i + j) = *(double_Dft_image_re + x * i + j);
*(_image_im + x * i + j) = *(double_Dft_image_im + x * i + j);
}
}
for (int i = 0; i < x; i++){
for (int j = 0; j < y; j++){
*(double_Dft_image_re + y * i + j) = *(_image_re + x * j + i);
*(double_Dft_image_im + y * i + j) = *(_image_im + x * j + i);
}
}

// x方向に
for (int i = 0; i < x; i++){
for (int j = 0; j < y; j++){
*(_image_re + y * i + j) = *(double_Dft_image_re + y * i + j);
*(_image_im + y * i + j) = *(double_Dft_image_im + y * i + j);
}
}
for (int i = 0; i < x; i++){
for (int j = 0; j < y; j++){
re = im = 0.0;
a = 2.0 * PI * (double)j / (double)y;

for (int jj = 0; jj < y; jj++){
b = a * (double)jj;
re += (*(_image_re + y * i + jj) * cos(b) - *(_image_im + y * i + jj) * sin(b)) / y;
im += (*(_image_re + y * i + jj) * sin(b) + *(_image_im + y * i + jj) * cos(b)) / y;
}

*(double_Idft_image_re + y * i + j) = re;
*(double_Idft_image_im + y * i + j) = im;
}
}


// 転置
for (int i = 0; i < y; i++){
for (int j = 0; j < x; j++){
*(_image_re + y * j + i) = *(double_Idft_image_re + y * j + i);
*(_image_im + y * j + i) = *(double_Idft_image_im + y * j + i);
}
}
for (int i = 0; i < y; i++){
for (int j = 0; j < x; j++){
*(double_Idft_image_re + x * i + j) = *(_image_re + y * j + i);
*(double_Idft_image_im + x * i + j) = *(_image_im + y * j + i);
}
}

// x方向に
for (int i = 0; i < y; i++){
for (int j = 0; j < x; j++){
*(_image_re + x * i + j) = *(double_Idft_image_re + x * i + j);
*(_image_im + x * i + j) = *(double_Idft_image_im + x * i + j);
}
}
for (int i = 0; i < y; i++){
for (int j = 0; j < x; j++){
re = im = 0.0;
a = 2.0 * PI * (double)j / (double)x;

for (int jj = 0; jj < x; jj++){
b = a * (double)jj;
re += (*(_image_re + x * i + jj) * cos(b) - *(_image_im + x * i + jj) * sin(b)) / x;
im += (*(_image_re + x * i + jj) * sin(b) + *(_image_im + x * i + jj) * cos(b)) / x;
}

*(double_Idft_image_re + x * i + j) = re;
*(double_Idft_image_im + x * i + j) = im;
*(Idft_image_re + x * i + j) = (unsigned char)re;
*(Idft_image_im + x * i + j) = (unsigned char)im;
}
}

「画像の2次元フーリエ変換」の質問画像

質問者からの補足コメント

  • 解決策もできればお教えくださいm(_ _)m

      補足日時:2018/12/29 00:58
  • うーん・・・

    この画像を与えてグレーに加工し,離散フーリエかけてます.
    ちなみに離散フーリエ変換のコードは以下のものなのですが,一応虚部は与えているかと思います.
    (-_-;)
    for (int jj = 0; jj < x; jj++){
    b = 2.0 * PI * (double)j * (double)jj / (double)x ;
    re += *(double_image + x * i + jj) * cos(b);
    im += -*(double_image + x * i + jj) * sin(b);
    }

    「画像の2次元フーリエ変換」の補足画像2
    No.2の回答に寄せられた補足コメントです。 補足日時:2018/12/29 13:16

A 回答 (2件)

たぶん現象的には


https://ja.wikipedia.org/wiki/%E6%8A%98%E3%82%8A …
だと思う.

どういう画像を与えているかわからないけど, 「虚部は全部 0」でスタートしているなら
得られた周波数成分のうち高周波部分の半分は冗長
なので, 逆変換するときにそこを (0 にすることで) 捨てればいい... んだったかな?
この回答への補足あり
    • good
    • 0

プログラムは読んでないけどたぶんエイリアス.

    • good
    • 1
この回答へのお礼

解答どうもです(^▽^)

お礼日時:2018/12/29 01:00

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!