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