7月1日のゼミ発表に間に合わないといけないので至急お願いします!!
現在,画像処理について学んでいるものです.
今回,アフィン変換についてのプログラムを作成しているのですが,途中で行き詰まりエラーが出て動きません.
エラーメッセージは以下に記します.
In function "affine"
65:error:添字をつけられた値が配列でもポインタでもありません
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
以下に作成したプログラムを途中ですが書いておくので,アフィン変換のプログラムが動くように手直しのほどお願いします!!
#include <stdio.h>
#include <math.h>
#define X_SIZE 2000 /*画像の横サイズを定義*/
#define Y_SIZE 2000 /*画像の縦サイズを定義*/
#define PI 3.141592 /*円周率*/
unsigned char screen[Y_SIZE][X_SIZE][3], /*unsigned:符号無しの整数型、char:文字データ、screen[Y_SIZE][X_SIZE][3]:3次配列*/
img_work[Y_SIZE][X_SIZE][3], /*screen[y][x][color(b=0,g=1,r=2と割り当てられる)] 0~255を値として取る*/
image_in[Y_SIZE][X_SIZE][3],
image_out[Y_SIZE][X_SIZE][3];
int main()
{
FILE *fp; /*ファイルポインタの宣言*/
unsigned char header[54]; /*unsigned:符号無しの整数型、char:文字データ、header[54]:0~53の1次配列*/
int thresh; /*閾値(0~255)*/
char input_file[128],gray_file[128],hist_file[128],ttv_file[128],affine_file[128]; /*ファイル名の配列を定義*/
unsigned char Light[256]={0}; /*ヒストグラム白黒濃淡配列を定義*/
/*------------画像ファイルを読み込む------------*/
printf("処理を行う画像ファイル名を入力してください.(拡張子:bmp)\n---");
scanf("%s",input_file); /*入力ファイル名を指定*/
printf("処理を行う画像ファイルは「 %s 」です.\n\n",input_file);
fp=fopen(input_file,"rb"); /* 処理する画像をオープンする
Windowsビットマップ形式 X_SIZE*Y_SIZEピクセル,24ビットカラー、rb:バイナリデータの読み込みに使用 */
if((fp=fopen(input_file,"rb"))==NULL){ /*ファイルが開けない場合のエラー表示*/
printf("画像ファイルが正常に開けませんでした.\n");
exit(1);
}
fread(header,1,54,fp); /* ヘッダ(54バイト)を飛ばす */
fread(screen,1,X_SIZE*Y_SIZE*3,fp); /* 残りはデータ(最下行から順に入る) */
fclose(fp);
/*------------カラー画像をグレースケールに変換する------------*/
int X,Y,k,col;
for(X=0;X<X_SIZE;X++){
for(Y=0;Y<Y_SIZE;Y++){
for(col=0;col<=2;col++){
img_work[Y][X][col]=0.1145*screen[Y][X][0]
+0.5866*screen[Y][X][1]+0.2989*screen[Y][X][2];
}
}
}
/*---アフィン変換(--- 拡大縮小,回転,移動(線形補間法)------------------------------
image_in: 入力画像配列
image_out: 出力画像配列
deg: 回転角(度)
zx: 拡大率(x方向)
zy: 拡大率(y方向)
px: 移動量(x方向)
py: 移動量(y方向)
-----------------------------------------------------------------------------*/
void affine(unsigned char image_in[Y_SIZE][X_SIZE],
unsigned char image_out[Y_SIZE][X_SIZE],
float deg, float zx, float zy, float px, float py)
{
image_in[Y_SIZE][X_SIZE][3]=img_work[Y][X][col];
int i, j, m, n;
float x, y, u, v, p, q;
double r;
float c, s;
int xs = X_SIZE/2;
int ys = Y_SIZE/2;
int d;
r = deg*PI/180;
c = (float)cos(r);
s = (float)sin(r);
printf("x方向の移動量を入力してください\n");
scanf("%lf",&px);
printf("y方向の移動量を入力してください\n");
scanf("%lf",&py);
printf("x方向の拡大率を入力してください\n");
scanf("%lf",&zx);
printf("y方向の拡大率を入力してください\n");
scanf("%lf",&zy);
printf("回転角を入力してください\n");
scanf("%lf",°);
printf("入力されたパラメータは以下の通りです\n");
printf("x方向移動量:%lf y方向移動量:%lf\nx方向拡大率:%lf y方向拡大率:%lf\n 回転角:%lf\n",px,py,zx,zy,deg);
for (i = -ys; i < ys; i++) {
for (j = -xs; j < xs; j++) {
v = i - py;
u = j - px;
y = (u*s + v*c) / zy;
x = (u*c - v*s) / zx;
if (y > 0) m = (int)y;
else m = (int)(y-1);
if (x > 0) n = (int)x;
else n = (int)(x-1);
q = y - m;
p = x - n;
if ( (m >= -ys) && (m < ys) && (n >= -xs) && (n < xs) )
d = (int)((1.0-q)*((1.0-p)*image_in[m +ys][n +xs]
+ p*image_in[m +ys][n+1+xs])
+ q*((1.0-p)*image_in[m+1+ys][n +xs]
+ p*image_in[m+1+ys][n+1+xs]));
else
d = 0;
if (d < 0) d = 0;
if (d > 255) d = 255;
image_out[i+ys][j+xs] = d;
}
}
}
/*------------アフィン変換した画像を保存する------------*/
printf("アフィン変換する画像ファイル名を入力してください.(拡張子:bmp)\n---");
scanf("%s",affine_file); /*アフィン変換するファイル名を指定*/
fp=fopen(affine_file,"wb"); /*2値化した画像を書き込むファイルをオープンする*/
if((fp=fopen(affine_file,"wb"))==NULL){ /*ファイルが開けない場合のエラー表示*/
printf("画像ファイルが正常に開けませんでした.\n");
exit(1);
}
fwrite(header,1,54,fp); /* ヘッダ */
fwrite(img_work,1,X_SIZE*Y_SIZE*3,fp); /* データ */
fclose(fp);
printf("アフィン変換した画像ファイル「 %s 」を保存しました.\n",affine_file);
printf("全ての作業が終了しました.\n");
return 0;
}