- ベストアンサー
jpegのDCT変換がうまくいかない理由とは?
- jpegのDCT変換について質問があります。DCT変換を使用してjpegを作成する際、プログラムを作成しましたが、変換結果が期待通りになりませんでした。
- DCT変換の式やプログラムは正しく実装されているはずですが、変換結果が異なる理由が分かりません。
- 参考にしたサイトのDCT変換の例と同じ値になるはずなのに、異なる結果になってしまいます。どのような原因が考えられるでしょうか?
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
ちょっとだけ補足しておきます。 > int(floor(cu*cv*sum/4+0.5)); floor は「引数値を超えない最大の整数」を返す関数であり、 それに0.5足した値を入れることで、四捨五入になります。 修正前> double long d = before[x][y]; 修正後> double long d = before[y][x]; 修正前> after[u][v] = int(cu*cv*sum/4); 修正後> after[v][u] = int(floor(cu*cv*sum/4+0.5)); 修正前> cout << after[i][j] << ","; 修正後> cout << after[j][i] << ","; この3行の修正で、質問者さんが挙げたリンク先の実行例と同じ結果になることは確認済です。
その他の回答 (2)
- mtaka2
- ベストアンサー率73% (867/1179)
浮動小数点数を整数化するときの問題じゃないですかね。 int にキャストすると切り捨てになってしまいいますので、 > floor(cu*cv*sum/4+0.5) としましょう。 それと、 before の初期化値の57,49,44,39,…が、y=0で、x=0,1,2,3…に対応するのなら、 配列アクセスは before[y][x] になります。 (このように、C言語で二次元配列を使うときは、yの方を最初の添え字に使う場合が多いです。) それにあわせて、配列アクセスは全て > double long d = before[y][x]; > after[v][u] = int(floor(cu*cv*sum/4+0.5)); > cout << after[j][i] << ","; のようにするべきでしょう。
お礼
doubleの切捨てに問題があるということですね? 私もそこは気になっていました。 その観点でもう少しプログラムいじってみます。 ご解答ありがとうございました。
- mtaka2
- ベストアンサー率73% (867/1179)
浮動小数点数を整数化するときの問題じゃないですかね。 int にキャストすると切り捨てになってしまいいますので、 > floor(cu*cv*sum/4+0.5) としましょう。 それと、 before の初期化値の57,49,44,39,…が、y=0で、x=0,1,2,3…に対応するのなら、 配列アクセスは before[y][x] になります。 (このように、C言語で二次元配列を使うときは、yの方を最初の添え字に使う場合が多いです。) それにあわせて、配列アクセスは全て > double long d = before[y][x]; > after[v][u] = int(floor(cu*cv*sum/4+0.5)); > cout << after[j][i] << ","; のようにするべきでしょう。
お礼
やっとできました。 正解まで載せていただいて、ありがとうございました。