画像処理について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
OK

画像処理について

#1

投稿記事 by OK » 11年前

エラーをどう処理すればいいか分かりません

1>c:\users\owner\desktop\asd\asd\kadai11.c(305): error C2143: 構文エラー : ';' が '型' の前にありません。
1>c:\users\owner\desktop\asd\asd\kadai11.c(315): error C2109: 配列または、ポインターでない変数に添字が使われました。
1>c:\users\owner\desktop\asd\asd\kadai11.c(315): error C2198: 'load_image_data' : 呼び出しに対する引数が少なすぎます。
1>c:\users\owner\desktop\asd\asd\kadai11.c(435): error C2109: 配列または、ポインターでない変数に添字が使われました。
1>c:\users\owner\desktop\asd\asd\kadai11.c(436): error C2109: 配列または、ポインターでない変数に添字が使われました。
1>c:\users\owner\desktop\asd\asd\kadai11.c(437): error C2109: 配列または、ポインターでない変数に添字が使われました。
1>c:\users\owner\desktop\asd\asd\kadai11.c(438): error C2109: 配列または、ポインターでない変数に添字が使われました。
1>c:\users\owner\desktop\asd\asd\kadai11.c(443): error C2109: 配列または、ポインターでない変数に添字が使われました。

コード:

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



#define Y_SIZE	512			/* 縦の最大画素数 */
#define X_SIZE	512			/* 横の最大画素数 */
#define HIGH	255			/* 最大階調値 */
#define LOW		0			/* 最小階調値 */
#define Level	256			/* 階調数(=最大階調値+1) */
#define FileName	    256 /* ファイル名の最大長 */
#define MaxBufferSize 640   /* 利用するバッファ最大長 */




unsigned char image[Y_SIZE][X_SIZE];       /* 入力画像用配列 */
unsigned char label_image[Y_SIZE][X_SIZE]; /* ラベリング用配列 */
unsigned char image2[Y_SIZE][X_SIZE];
unsigned char image3[Y_SIZE][X_SIZE];
unsigned char eye[Y_SIZE][X_SIZE];
unsigned char std_mesh[9][16];
unsigned char label_image[Y_SIZE][X_SIZE];
unsigned char kiri[Y_SIZE][X_SIZE];
unsigned char result[Y_SIZE][X_SIZE]={255};
unsigned char kakudai[Y_SIZE][X_SIZE]={255};
unsigned char name[FileName];

double ssd[10];//単純類似度を入れる配列
int x_size, y_size;                        /* image1 の横画素数,縦画素数 */
int Label=0;
int sum,a;

//ここから下に必要なグローバル変数を宣言する

void load_image_data(char f_name[FileName])
{/* この関数は.pgmファイルを読み込むための関数.pgm 画像,
 横画素数,縦画素数のデータをファイルから読み込み,
 image[ ][ ],x_size,y_size にそれぞれ代入する.*/
	       /* ファイル名用の文字配列 */
    char buffer[MaxBufferSize];  /* データ読み込み用作業変数 */
    FILE *fp;                    /* ファイルポインタ */ 
	int max_gray=0;              /* 最大階調値 */
    int i, j;
  	
   
    fp = fopen( f_name, "rb" );
    if ( NULL == fp ){
        printf("その名前のファイルは存在しません.\n");
        exit(1);
    }
   	
    fgets( buffer, MaxBufferSize, fp ); /* ファイルタイプ(=P5)の確認 */
    
	if ( buffer[0] != 'P' || buffer[1] != '5' ){
        printf("ファイルのフォーマットが P5 とは異なります.\n");
		printf("%c%c", buffer[0], buffer[1]);
        exit(1);
    }
	
	/* x_size, y_size の代入(#から始まるコメントは読み飛ばす) */
    x_size = 0;
    y_size = 0;
    while ( x_size == 0 || y_size == 0 ){
        fgets( buffer, MaxBufferSize, fp );
        if ( buffer[0] != '#' ){
            sscanf( buffer, "%d %d", &x_size, &y_size );
        }
    }    
	if ( x_size > X_SIZE || y_size > Y_SIZE ){
        printf("想定値 %d x %d を超えています.\n", Y_SIZE, X_SIZE);
        printf("もう少し小さな画像を使って下さい.\n");
        exit(1);
    }

	/* max_gray の代入(#から始まるコメントは読み飛ばす) */
    while ( max_gray == 0 ){
        fgets( buffer, MaxBufferSize, fp );
        if ( buffer[0] != '#' ){
            sscanf( buffer, "%d", &max_gray );
        }
    }
	if ( max_gray != HIGH ){
        printf("最大階調値が不適切です.\n");
        exit(1);
    }

    /* パラメータの画面への表示 */
    printf("横の画素数 = %d, 縦の画素数 = %d\n", x_size, y_size);
    printf("最大階調値 = %d\n",max_gray);   
    
    /* 画像データを読み込んで画像用配列に代入する */
    for (i=0; i<y_size; i++)
        for (j=0; j<x_size; j++)
            image[i][j] = (unsigned char)fgetc( fp );
           
    fclose(fp);
}

void save_image_data(unsigned char output_img[Y_SIZE][X_SIZE],int output_ysize,int output_xsize) 
{/* この関数は.pgmファイルを出力するための関数.output_img[ ][ ], 
  output_ysize, output_xsizeを,それぞれ pgm 画像,横画素数,
	縦画素数としてファイルに保存する.*/      

	 char f_name[FileName]; /* ファイル名用の文字配列 */
    FILE *fp;               /* ファイルポインタ */
    int i, j;
	
    
	/* 出力ファイルのオープン */
    printf("Output File (*.pgm) : ");  
    scanf("%s",f_name);
    fp = fopen(f_name, "wb");
    
    fputs( "P5\n", fp );                                  /* ファイル識別子 "P5" を先頭に出力する */
    fputs( "# Created by Image Processing\n", fp );       /* # で始まるコメント行(省略可能) */
   
    fprintf( fp, "%d %d\n", output_xsize, output_ysize ); /* 画像の横幅,縦幅の出力 */
    fprintf( fp, "%d\n", HIGH );                          /* 最大階調値の出力 */
   
   /* 画像データの出力 */
    for (i=0; i<output_ysize; i++)
        for (j=0; j<output_xsize; j++)
            fputc(output_img[i][j], fp);
      
    fclose(fp);
}

#if 0

void load_mesh_std(int a)
{/* この関数は.pgmファイルを読み込むための関数.pgm 画像,
 横画素数,縦画素数のデータをファイルから読み込み,
 image[ ][ ],x_size,y_size にそれぞれ代入する.*/
	
	char f_name[10][FileName]={"std0.pgm","std1.pgm","std2.pgm","std3.pgm","std4.pgm"
								,"std5.pgm","std6.pgm","std7.pgm","std8.pgm","std9.pgm"};/* ファイル名用の文字配列 */
    
	
	char buffer[MaxBufferSize];  /* データ読み込み用作業変数 */
    FILE *fp;                    /* ファイルポインタ */ 
	int max_gray=0;              /* 最大階調値 */
    int i, j;
	
    fp = fopen( f_name[a], "rb" );
    if ( NULL == fp ){
        printf("その名前のファイルは存在しません.\n");
        exit(1);
    }
   	
    fgets( buffer, MaxBufferSize, fp ); /* ファイルタイプ(=P5)の確認 */
    
	if ( buffer[0] != 'P' || buffer[1] != '5' ){
        printf("ファイルのフォーマットが P5 とは異なります.\n");
		printf("%c%c", buffer[0], buffer[1]);
        exit(1);
    }
	
	/* x_size, y_size の代入(#から始まるコメントは読み飛ばす) */
    x_size = 0;
    y_size = 0;
    while ( x_size == 0 || y_size == 0 ){
        fgets( buffer, MaxBufferSize, fp );
        if ( buffer[0] != '#' ){
            sscanf( buffer, "%d %d", &x_size, &y_size );
        }
    }    
	if ( x_size > X_SIZE || y_size > Y_SIZE ){
        printf("想定値 %d x %d を超えています.\n", Y_SIZE, X_SIZE);
        printf("もう少し小さな画像を使って下さい.\n");
        exit(1);
    }

	/* max_gray の代入(#から始まるコメントは読み飛ばす) */
    while ( max_gray == 0 ){
        fgets( buffer, MaxBufferSize, fp );
        if ( buffer[0] != '#' ){
            sscanf( buffer, "%d", &max_gray );
        }
    }
	if ( max_gray != HIGH ){
        printf("最大階調値が不適切です.\n");
        exit(1);
    }
	

    /* パラメータの画面への表示 */
    //printf("横の画素数 = %d, 縦の画素数 = %d\n", x_size, y_size);
    //printf("最大階調値 = %d\n",max_gray);   
    
    /* 画像データを読み込んで画像用配列に代入する */
    for (i=0; i<y_size; i++)
        for (j=0; j<x_size; j++)
            image[i][j] = (unsigned char)fgetc( fp );
           
    fclose(fp);

	//読み込んだ画像の二値化
	for(i=0 ; i<y_size ; i++)
		for(j=0 ; j<x_size ; j++){
			if(image[i][j]>100)
				image2[i][j]=255;
			else
				image2[i][j]=0;
		}
	//画像のメッシュ値を計算
	for(i=0;i<32;i++)
		for(j=0 ; j<32 ; j++)
			if(image2[i][j]==0)
				std_mesh[a][ (int)((i/8)*4 + (j/8)) ]++;

}

#endif

void Labeling(int i,int j)
{
	if((image2[i][j] == 0) && ( label_image[i][j] == 255)){
		label_image[i][j] = Label;
	}
	else
		return;

	Labeling(i - 1,j);
	Labeling(i,j - 1);
	Labeling(i,j + 1);
	Labeling(i + 1,j);
	Labeling(i - 1,j - 1);
	Labeling(i + 1,j - 1);
	Labeling(i - 1,j + 1);
	Labeling(i + 1,j + 1);
}



void kadai2_1(){
	int i,j;
	int a=0;
	int mesh_of_std[16];

	printf("Input File(*.pgm) : ");
    scanf("%s",name);
	load_image_data(name);

	//std配列の初期化
	for(i=0;i<16;i++)
			mesh_of_std[i]=0;

	//読み込んだstdを2値化
	for(i=0 ; i<y_size ; i++)
		for(j=0 ; j<x_size ; j++)
			if(image[i][j]>100)
				image2[i][j]=255;
			else
				image2[i][j]=0;


	//メッシュ特徴の計算
	for(i=0;i<32;i++)
		for(j=0 ; j<32 ; j++)
			if(image2[i][j]==0)
				mesh_of_std[ (int)((i/8)*4 + (j/8)) ]++;

	for(i=0;i<16;i++)
		printf("メッシュ特徴の%dつ目は%dです\n",i,mesh_of_std[i]);

	//メッシュの値を視覚的に表す
	for(i=0 ; i<4 ; i++)
			for(j=0 ; j<4 ; j++){
					eye[i][j] = (int)255 * mesh_of_std[i*4 + j]/64;
			}
	printf("メッシュ値を視覚的に表した画像を保存します\n");
	save_image_data(eye,4,4);
	
}


void kadai2_2()
{
	int i,j,a,tmp;
	int mesh[16];
	double max_ssd=0;//単純精度の最大値を入れる
	int temp,temp2,k;
	int bubble[10];

	int e,f,m,n;
	float x,y,p,q;
	double r;
	float c,s;
	int xs =X_SIZE/2;
	int ys =Y_SIZE/2;
	int d;
	int deg;
	int image_in;
	int image_out;
	int std_name;


	r = deg*3.141592/180.0;
	c = (float)cos(r);
	s = (float)sin(r);
	
	
char std_name[10][FileName]={"std0.pgm","std1.pgm","std2.pgm","std3.pgm","std4.pgm","std5.pgm","std6.pgm","std7.pgm","std8.pgm","std9.pgm"};/* ファイル名用の文字配列 */

	/* ファイル名用の文字配列 */
	//std_meshの初期化
	for(i=0;i<9;i++)
		for(j=0;j<16;j++)
			std_mesh[i][j]=0;

	//std0~std9のメッシュ値を計算する。
	for(a=0 ; a < 10 ; a++){
		load_image_data(std_name[a]);

		//読み込んだ画像の二値化
		for(i=0 ; i<y_size ; i++)
			for(j=0 ; j<x_size ; j++){
				if(image[i][j]>100)
					image2[i][j]=255;
				else
					image2[i][j]=0;
			}
	
		//画像のメッシュ値を計算
		for(i=0;i<32;i++)
			for(j=0 ; j<32 ; j++)
				if(image2[i][j]==0)
					std_mesh[a][ (int)((i/8)*4 + (j/8)) ]++;
	}
	
	//std0~std9までのメッシュ値を表示する
	for(i=0 ; i<10 ; i++){
			printf("********std%d************\n",i);
			for(j=0;j<16;j++){
				printf("std[%d]のメッシュ特徴の%dつ目は%dです\n",i,j,std_mesh[i][j]);
			}

	}
			printf("*****end******\n");

	//比較する画像をn0からn9の指定
	printf("n0からn9で選んでください(.pgm)\n");
    scanf("%s",name);
	load_image_data(name);

	//選択したnのメッシュを入れる配列を初期化
	for(i=0;i<16;i++)
			mesh[i]=0;

	//2値化
	for(i=0 ; i<y_size ; i++)
		for(j=0 ; j<x_size ; j++)
			if(image[i][j]>100){
				image2[i][j]=255;
				image3[i][j]=255;
				
			}
			else{
				image2[i][j]=0;
				image3[i][j]=0;
			}
	
	//膨張法
	for(i=0;i<y_size-1;i++)
		for(j=0;j<x_size-1;j++){
			if(image2[i-1][j-1]==0  || image2[i-1][j]==0  || image2[i-1][j+1] == 0 ||
				image2[i][j-1]==0   || image2[i][j+1] == 0|| image2[i+1][j-1] == 0 || 
				image2[i+1][j] == 0 || image2[i+1][j+1] ==0){
					image3[i][j] = 0;
			}
	}
	
	//収縮法
	for(i=0;i<y_size;i++)
		for(j=0;j<x_size;j++)
			image2[i][j]=0;

	for(i=0;i<y_size-1;i++)
		for(j=0;j<x_size-1;j++){
			if(image3[i-1][j-1]==255 || image3[i-1][j]==255  || image3[i-1][j+1] == 255 ||
				image3[i][j-1]==255  || image3[i][j+1] ==255 || image3[i+1][j-1] == 255 ||
				image3[i+1][j] == 255|| image3[i+1][j+1] ==255)
					image2[i][j] = 255;
		}

	//メッシュ特徴の計算
	for(i=0;i<32;i++)
		for(j=0 ; j<32 ; j++)
			if(image2[i][j]==0)
				mesh[ (int)((i/8)*4 + (j/8)) ]++;

	for(i=0;i<16;i++)
		printf("メッシュ特徴の%dつ目は%dです\n",i,mesh[i]);

	//単純類似度の計算
	for(i=0;i<10;i++){
				ssd[i]=(std_mesh[i][0]*mesh[0]   + std_mesh[i][1]*mesh[1]  + std_mesh[i][2]*mesh[2]   + std_mesh[i][3]*mesh[3]
						+std_mesh[i][4]*mesh[4]   + std_mesh[i][5]*mesh[5]  + std_mesh[i][6]*mesh[6]   + std_mesh[i][7]*mesh[7]
						+std_mesh[i][8]*mesh[8]   + std_mesh[i][9]*mesh[9]  + std_mesh[i][10]*mesh[10] + std_mesh[i][11]*mesh[11]
						+std_mesh[i][12]*mesh[12] + std_mesh[i][13]*mesh[13]+ std_mesh[i][14]*mesh[14] + std_mesh[i][15]*mesh[15])/
						(sqrt(
						std_mesh[i][0]*std_mesh[i][0]   + std_mesh[i][1]*std_mesh[i][1]  + std_mesh[i][2]*std_mesh[i][2]   + std_mesh[i][3]*std_mesh[i][3]
						+std_mesh[i][4]*std_mesh[i][4]   + std_mesh[i][5]*std_mesh[i][5]  + std_mesh[i][6]*std_mesh[i][6]   + std_mesh[i][7]*std_mesh[i][7]
						+std_mesh[i][8]*std_mesh[i][8]   + std_mesh[i][9]*std_mesh[i][9]  + std_mesh[i][10]*std_mesh[i][10] + std_mesh[i][11]*std_mesh[i][11]
						+std_mesh[i][12]*std_mesh[i][12] + std_mesh[i][13]*std_mesh[i][13]+ std_mesh[i][14]*std_mesh[i][14] + std_mesh[i][15]*std_mesh[i][15]
						)*
						sqrt(
						mesh[0]*mesh[0]   + mesh[1]*mesh[1]  + mesh[2]*mesh[2]   + mesh[3]*mesh[3]
						+mesh[4]*mesh[4]   + mesh[5]*mesh[5]  + mesh[6]*mesh[6]   + mesh[7]*mesh[7]
						+mesh[8]*mesh[8]   + mesh[9]*mesh[9]  + mesh[10]*mesh[10] + mesh[11]*mesh[11]
						+mesh[12]*mesh[12] + mesh[13]*mesh[13]+ mesh[14]*mesh[14] + mesh[15]*mesh[15]
						));
	}

	for(i=0;i<10;i++)
		if(max_ssd<ssd[i]){
			max_ssd = ssd[i];
			tmp = i;
		}

	
		for(e = -ys; e < ys; e++){
		for(f = -xs; f < ys; f++){
			y = f*s +e*c;
			x = f*c -e*s;
			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[e+ys][f+xs] = d;
	}
}




	printf("***********単純類似度*************\n");
	printf("----------------------------------\n");
	printf("|  std0  |        %lf       |\n",ssd[0]);
	printf("|  std1  |        %lf       |\n",ssd[1]);
	printf("|  std2  |        %lf       |\n",ssd[2]);
	printf("|  std3  |        %lf       |\n",ssd[3]);
	printf("|  std4  |        %lf       |\n",ssd[4]);
	printf("|  std5  |        %lf       |\n",ssd[5]);
	printf("|  std6  |        %lf       |\n",ssd[6]);
	printf("|  std7  |        %lf       |\n",ssd[7]);
	printf("|  std8  |        %lf       |\n",ssd[8]);
	printf("|  std9  |        %lf       |\n",ssd[9]);
	printf("----------------------------------\n");
	printf("最も類似しているもの : std%d.pgm\n",tmp);

	scanf("%d",&i);
}






int main(void){

	kadai2_1();
	kadai2_2();

	return 0;
}

アバター
あたっしゅ
記事: 664
登録日時: 13年前
住所: 東京23区
連絡を取る:

Re: 画像処理について

#2

投稿記事 by あたっしゅ » 11年前

C では(C++ と違って)、変数宣言は、ブロックの先頭でしかできません。

306 行を 299 行に移動するとか、
.c を .cpp にするとか。
VTuber:
東上☆海美☆(とうじょう・うみみ)
http://atassyu.php.xdomain.jp/vtuber/index.html
レスがついていないものを優先して、レスするみみ。時々、見当外れなレスしみみ。

中の人:
手提鞄あたッしュ、[MrAtassyu] 手提鞄屋魚有店
http://ameblo.jp/mratassyu/
Pixiv: 666303
Windows, Mac, Linux, Haiku, Raspbery Pi, Jetson Nano, 電子ブロック 持ち。

閉鎖

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