• ベストアンサー

アフィン変換後の画像に線が入ってしまいます。

C++でアフィン変換を行うプログラムを作成しました。 プログラム自体は回ったのですが、変換後の画像に線が入るようになりました。 これは一体何なのでしょうか?普通出るものなのでしょうか? プログラミングが何か間違っているのか、どうしても出てしまうものなのか、また出ないようにするにはどうしたら良いか等、教えてください。 変換後の画像にフィルタをかけて消す方法も考えましたが、あまりに画像がぼけてしまうので、最初から出ないようにする方法があれば教えていただけると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

> これがいわゆる『元画像 のX,Yに対応するX',Y'、という計算でやる』ということなのでしょうか? そうです。 これはプログラミングの問題ではなく、アルゴリズムの問題です。 もっとも単純な解決法としては、元画像の(X, Y) に対応する (X', Y') を計算するのではなく、変換後の (X', Y') に対応する元画像の (X, Y) を求めるという方法を使います。これを最近傍法といいます。 詳しくは画像処理について勉強して下さい。 キーワード: 補間、最近傍法、バイリニア法、バイキュービック法…

yunogaudi
質問者

お礼

連絡が遅くなり申し訳ありません。 記載されている方法を試したところ、無事に線の無いきれいな画像が得られました。 とりあえずこの画像で十分研究は進められるのでこれでいきます。 余裕ができたらバイリニア、バイキュービックについても勉強して試していきたいと思います。 ありがとうございました。

その他の回答 (1)

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

具体的にどんな手法でやってますか? ドットで表現された画像を変形する際に注意しないといけないのは「座標は整数しか使えない」ということです。 元画像 のX,Yに対応するX',Y'、という計算でやると、X',Y'に使われない座標が出ることがあります。

yunogaudi
質問者

補足

せっかく回答していただいたのに返事が遅くなり申し訳ありません。 『元画像 のX,Yに対応するX',Y'、という計算でやる』の意味があまりよくわかっていません。 画像は全て256×256×256の画像です。 あらかじめ4×4のアフィン変換のパラメータの配列を用意し、値を入れておきます。 そして変換前の座標を1つ1つパラメータに当てはめて、変換後の座標を出します。 最後に変換前の座標のピクセル値を変換後の座標の位置へ移動させるという風にしています。 参考に、プログラムを貼り付けておきます。 void TClass_AFFINE3D::ConvertCoordinate (double** matrix, double x, double y, double z, double *cx, double *cy, double *cz) { *cx = matrix[0][0] * x + matrix[1][0] * y + matrix[2][0] * z + matrix[3][0] * 1; *cy = matrix[0][1] * x + matrix[1][1] * y + matrix[2][1] * z + matrix[3][1] * 1; *cz = matrix[0][2] * x + matrix[1][2] * y + matrix[2][2] * z + matrix[3][2] * 1; } void TClass_AFFINE3D::affine_3d_main_using_matrix_info( short ***img_in,short ***img_out,int x_size,int y_size,int z_size,double **matrix) { int i,j,n; double cx; double cy; double cz; double out_cx,out_cy,out_cz; // 座標変換 for(n = 0; n < z_size; n++) { for (i = 0; i < y_size; i++) { for (j = 0; j < x_size; j++) { cx=j; cy=i; cz=n; //matrix数値入力による変換 ConvertCoordinate(matrix, cx, cy, cz, &out_cx, &out_cy, &out_cz); cx=out_cx; cy=out_cy; cz=out_cz; int i_cx,i_cy,i_cz; i_cx=(int)cx; i_cy=(int)cy; i_cz=(int)cz; if(i_cx>=0&&i_cx<x_size&&i_cy>=0&&i_cy<y_size&&i_cz>=0&&i_cz<z_size){ img_out[i_cz][i_cy][i_cx]=img_in[n][i][j]; } else{ } } } } } これがいわゆる『元画像 のX,Yに対応するX',Y'、という計算でやる』ということなのでしょうか? 対処法は何かありますでしょうか? まだまだプログラミングは初心者のため、初歩的なことなのかもしれませんが教えていただけると幸いです。