画像処理で回転させるには?

解決


ぱっつんぱっつん  2006-12-11 17:48:18  No: 63897  IP: 192.*.*.*

C言語で画像処理をする場合、画像を90°、180°、270°と画像を回転させるにはどのようにしたらいいですか?
for文の中身がわからないです。簡単な方法でもいいので教えて下さい。

編集 削除
keichan  2006-12-11 18:13:56  No: 63898  IP: 192.*.*.*

3x3ピクセルを紙に書いて各ピクセルに対してどう回転させたらいいのか
まずは考えてみてください。

編集 削除
ぱっつんぱっつん  2006-12-12 08:35:29  No: 63899  IP: 192.*.*.*

今一想像力がわかないです。頭ではどうすればいいか分かるんですけどそれを
文字でどうすればいいかわからないんです。
何度も試せば試すほど、こんがらがっちゃって。

編集 削除
超初心者  2006-12-12 09:31:47  No: 63900  IP: 192.*.*.*

俺的考えかたを示そう。
俺もこんがらがるから難しいこと判らない。

最初から完成されたループにしないで
かなり展開して考えてから
それがループになるか考える。

どうせ後からこれじゃ実現できないので大幅改造とか
こうしたほうが良かったとか修正が出てくるので
いきなり完成されたプログラムコードを
上から(for)下へ(forの中身)の順に書けるのは
簡単なものや経験のあるものに限られるし。

条件とか、目的とか、仕様とか、まとめる。

右90°回転する

a[y座標][x座標] 元画像
w 幅
h 高さ

b[y座標][x座標] 回転画像
h 幅
w 高さ

紙とかワープロに書く。
(本当は絵が簡単に書けるものがいいんだけど
重くて描きにくくてエラーがよく出て高価なソフトばかり)
書かなくても出来るけど間違えていないか徹底して洗い出すため。
急用で別件処理して、しばらくすると忘れるとかあるしね。

右90°回転するということは元画像の最上部が
回転画像の右端になるということだから
b[  0][h-1] = a[0][  0]
b[  1][h-1] = a[0][  1]
b[  2][h-1] = a[0][  2]
b[  3][h-1] = a[0][  3]
b[...][h-1] = a[0][...]
b[w-1][h-1] = a[0][w-1]
それじゃ次に元画像の上から2行目は
回転画像の右から2列目になる
b[  0][h-2] = a[1][  0]
b[  1][h-2] = a[1][  1]
b[  2][h-2] = a[1][  2]
b[  3][h-2] = a[1][  3]
b[...][h-2] = a[1][...]
b[w-1][h-2] = a[1][w-1]
最後は
b[  0][0] = a[h-1][  0]
b[  1][0] = a[h-1][  1]
b[  2][0] = a[h-1][  2]
b[  3][0] = a[h-1][  3]
b[...][0] = a[h-1][...]
b[w-1][0] = a[h-1][w-1]

編集 削除
ぱっつんぱっつん  2006-12-12 10:44:07  No: 63901  IP: 192.*.*.*

内容的に理解できました。
for(x=0;x<x_size;x++){
for(y=0;y<y_size;y++){


このようにして求めてます。今度は中身を簡単に一つにまとめることができません。for文の中をどのようにしたら短くて、簡単に90°回転できますか教えて下さい。先程の説明なんとなく理解できました。ありがとうございます。

編集 削除
PATIO  2006-12-12 11:45:51  No: 63902  IP: 192.*.*.*

最初から短くしようなんて思わないでとにかく何とかなりそうなコードを
まず考えて、そこから改良するとかしないと先に進めないと思いますけれど。

頭の中の物をいかにしてコードにするかがプログラミングなので
その作業を放棄しちゃうとプログラミングにならないです。
自分でやら無いと多分なんでそうなるのか理解できないだろうし。
特に最終的な状態まで仕上がったソースはどうしてそうなったのかまで
理解してないと応用が出来ないですよ。

ヒント:
角度と元のXとYを与えて転送先のXとYが返せる関数を作れれば、
多分処理がすっきりするのではないかな。

編集 削除
ぱっつんぱっつん  2006-12-12 12:07:22  No: 63903  IP: 192.*.*.*

頭では理解できるけど、それをいざ文字にしようとするとうまくできません。
どうすればいいのでしょうか??
お願いします。他のプログラムはちゃんと書けたのですが、その中身がうまくいかないんです。

編集 削除
tetrapod  2006-12-12 13:27:10  No: 63904  IP: 192.*.*.*

いきなり文字で考えるからだよ。簡単な図を書いてみればいい。右回転なら
元図形  先図形
ABC  GDA
DEF→HEB
GHI  IFC
後は元A位置を先A位置に変換する変換式を考えればいい。

for (y=0;y<ys;++y) for (x=0; x<xs; ++x) {
  newimage[*1][*2]=oldimage[y][x];
}
*1 *2 に適切な計算式を入れれば回転も反転もできるよね。

大サービスだ!上下反転なら b[ys-y-1][x]=a[y][x]

編集 削除
ぱっつんぱっつん  2006-12-13 14:48:22  No: 63905  IP: 192.*.*.*

なんとか回転させることができました。ありがとうございます。
90°と270°回転がなかなかできません。想像力がないんでしょうか。
画面が黒くなったりばっかです。

編集 削除
ぱっつんぱっつん  2006-12-13 15:08:42  No: 63906  IP: 192.*.*.*

できました

編集 削除