[WP]no.016 画像回転


以前に作成した簡易bmp読み書きライブラリ
http://shonen9th.blog.fc2.com/blog-entry-54.html


入力された画像を中心を原点として任意角度に回転させます。滅茶苦茶簡単。


画像を読み込み、画像サイズを得る。

四隅の座標が得られるので、回転行列を利用して回転。

変換後の四隅の座標から、出力画像が取るべき画像サイズを求める。

出力画像の各ピクセルに対して
 ピクセルの座標を 回転行列の逆行列を利用して逆変換。
 その座標が元の画像の外であればbgcolorで、そうでなければ対応する色を置く。


回転行列は直行行列なので、逆行列=転置行列。


#include <stdio.h>
#include <math.h>

#include "libeasybmp.h"


void bcopy(void *from,void *to,size_t size){
for (;size--!=0;)
*(char*)(to+size)=*(char*)(from+size);
}

int main(int argc,char **argv){
Image *img,*imgo;
RGB bgcolor;
float arg,cs,sn;
int cx,cy;
int rect[2][4];
int i,j,x,y,x2,y2,w,h;

if (argc != 3){
printf("usage:exe filename deg\n");
return 1;
}

img = loadbmp(argv[1]);

if (img == 0){
printf("loadbmp error\n");
return 1;
}

sscanf(argv[2],"%f",&arg);

// deg=>rad
arg=arg/180.0*M_PI;

// 計算しておく
cs=cos(arg);
sn=sin(arg);

// 中心座標
cx = img->width/2;
cy = img->height/2;

// 枠を平行移動
rect[0][0]=-cx;rect[1][0]=-cy;
rect[0][1]=-cx;rect[1][1]=img->height-cy;
rect[0][2]=img->width-cx;rect[1][2]=img->height-cy;
rect[0][3]=img->width-cx;rect[1][3]=-cy;

// 回転後の座標を得る
for (i=0;i<4;i++){
//printf("%d %d\n",rect[0][i]-cx,rect[1][i]-cy):
x=(int)(cs*rect[0][i]-sn*rect[1][i]);
y=(int)(sn*rect[0][i]+cs*rect[1][i]);
rect[0][i]=x;
rect[1][i]=y;
//printf("%d %d\n",x,y);
}

// 回転後確保すべき画像サイズw,h
for (j=0;j<2;j++){
y=x=rect[j][0];
for (i=1;i<4;i++){
x=(rect[j][i]>x)?rect[j][i]:x;
y=(rect[j][i]<y)?rect[j][i]:y;
}
*(j==0?&w:&h)=x-y;
}

// printf("%d %d\n",w,h);

// 出力用画像
imgo = createimage(w,h);

bgcolor.r=0;
bgcolor.g=0;
bgcolor.b=0;

for (y=0;y<h;y++){
for (x=0;x<w;x++){
x2=(int)( cs*(x-w/2)+sn*(y-h/2)+cx);
y2=(int)(-sn*(x-w/2)+cs*(y-h/2)+cy);
if (x2<0 || y2<0 || img->width<=x2 || img->height<=y2){
bcopy(&bgcolor,&(imgo->data[x+w*y]),(size_t)3);
}else{
bcopy(&(img->data[x2+img->width*y2]),&(imgo->data[x+w*y]),(size_t)3);
}
}
}

savebmp(imgo,"result.bmp");

freeimage(img);
freeimage(imgo);
return 0;
}
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

tag : C 画像解析

コメントの投稿

非公開コメント

プロフィール

舞葉(ぶよう)

Author:舞葉(ぶよう)
github.io
はてなブログ(競プロ)

古い記事のソースコードは色分けしていないので、高機能テキストエディタに貼り付けたほうが見やすいかも。

検索フォーム
このブログについて
自分がつまづいた話題、なんとなく書きたいと思ったこと、ググったけど殆ど資料なかったぞオイ な話等をアップする予定。通りすがりでも、参考になっていただければと。プログラムの例外入力、メモリリークは責任負いません。投稿された記事は修正・削除する場合があります。
カテゴリ
タグ

HSP3アルゴリズムとデータ構造c++RubyJavaUnity画像解析C機械学習C#LinuxcodeIQKinectMinecraftTonyuSystemraspberrypiPythonHTML5音声制御Simulinkruby俺ルール通信制御Javascriptシミュレーション

counter-shinobi
固定記事
最新記事
最新コメント
月別アーカイブ
ブロとも申請フォーム

この人とブロともになる

アクセスランキング
[ジャンルランキング]
コンピュータ
1467位
アクセスランキングを見る>>

[サブジャンルランキング]
プログラミング
265位
アクセスランキングを見る>>