C言語 画像処理 アフィン変換

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
rampom
記事: 5
登録日時: 12年前
住所: 東京都

C言語 画像処理 アフィン変換

#1

投稿記事 by rampom » 12年前

緊急!!
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",&deg);

		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;
}
 

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: C言語 画像処理 アフィン変換

#2

投稿記事 by へにっくす » 12年前

まず言えることは、main関数の中にaffine関数が存在してるのはなぜですか?
C言語は学習中ということを引いても、ちょっとこういう書き方をすること自体、不思議というか…
また、変数の使い方もよくわかっていない印象があります。これを手直ししようとしてもおそらくはゼミの発表の場で突っ込まれるだけだと思います。
しかも今日中って…それを他人にやってもらうって…
普通ならお金を要求するところです。あきらめましょうね。
written by へにっくす

rampom
記事: 5
登録日時: 12年前
住所: 東京都

Re: C言語 画像処理 アフィン変換

#3

投稿記事 by rampom » 12年前

そこを何とかお願いします!!

アバター
へにっくす
記事: 634
登録日時: 13年前
住所: 東京都

Re: C言語 画像処理 アフィン変換

#4

投稿記事 by へにっくす » 12年前

お願いします!!と言われても、それで実現できてしまったら、他の学生も同じことを考えるでしょう。そうなった場合、学ぶ場など必要無いですよね?何しろ、お願いすれば、宿題をやってもらえるのですから。そうは思いませんか。
つまりここに頼むこと自体、お門違いなのです。
ここまでやって、ここが分からないので教えてもらえませんか、という質問ならお答えしますが、
rampom さんが書きました:アフィン変換のプログラムが動くように手直しのほどお願いします!!
これでは丸投げと同じです。そこのところをよく理解してください。
そもそも、緊急!!になる前にできることはあったはずです。友達に聞くなり、教授に聞くなりね。
それをしなかった貴方の責任です。おとなしく怒られなさい。
これが仕事だったら即クビですよ?
written by へにっくす

閉鎖

“C言語何でも質問掲示板” へ戻る