/* -------------------------------
1999年05月29日 11時24分20秒
対応表を3種類出力する

ay1.cls: Average最大
ay2.cls: Overall最大
ay3.cls: Kappa最大
(ay4.cls: 特例措置)

comp6.c
1999年05月25日
Type指定付加
0=Average, 1=Overall, 2=Kappa
Typeごとの判断基準で、最も高い分類精度の項目をクラスタ順に
調査して割り当てる


植生項目自動割当て
Overall分類精度評価による最大値の対応表を使用

 ---------------------------------

植生図と分類結果の画素ごとの対応を調査
草地の割り当てを2位順で行った場合DN値判定をしない
変数名の整理した
1999年04月20日
1999年04月27日 10時44分02秒
広田湾付近の調査で、針葉樹と広葉樹の入れ替えでKHATが向上した
念のため、僅少差であった項目のメッセージを出力する
1位と2位の優先順位で
どちらも3割以上の場合、とりあえず1位を選ぶが、その事実があったことを表示

---------------------------------- */
#define Max_array=10000000  /* 植生図データ読み込み配列サイズ限界 */
#define Max_cluster=100     /* 教師無し分類のクラスタ最大数 */
#define Max_vegetation=100  /* 植生図項目の最大数 */
#define Max_band=6          /* 使用する衛星画像の最大バンド数 */

#include 
#include 
main(argv,argc)
int argv;
char *argc[];

{
	static int  ic,ii,total_data,dmax;
	static int  ix,iy,pnum,i,m,mm,n,j,k;
	static int  vegetation_max,cluster_max,flag;
	static int  pixel,line,veg_freq[10];
	static float f_x,f_y,f_z;
	/* 分類精度評価値 a_x;average o_x;overall k_x;kappa */
	static float a_x,o_x,k_x;
	/* コードブックの微分係数 1次、2次 */
	static int  deriv[Max_cluster][Max_band];
	static int  deriv1[Max_cluster][Max_band];
	static int  deriv2[Max_cluster][Max_band];
	/* コードブックの文字読みとり用 */
	static char f1[128]="",f2[32]="",f3[32]="";
	/* coinは一致数行列、priortyは優先順位割当表 rsは、画素数および割当番号 */
	static int  coin[Max_cluster][Max_vegetation];
	static int  priorty[Max_cluster][Max_vegetation];
	static int  priortys[Max_cluster][Max_vegetation]; /* save用 */
	/* 割当て結果の分類精度を格納 */
	static float  max_a,max_o,max_k;
	static float  ma,mo,mk;
	/* cls_aはAverage割当表、oはOvaerall,kはKappa格納用 */
	static int  next_p_num;
	/* 0=Average, 1=Ovaerall, 2=Kappa */
	static int  type; /* 0=Average, 1=Ovaerall, 2=Kappa */
	static int  cls_a[Max_cluster],cls_o[Max_cluster],cls_k[Max_cluster];
	/* clsは割当表、assign1は対角要素格納用、assgin2は行方向要素格納用 */
	static int  assign1[Max_cluster];
	static int  assign2[Max_cluster];
	static int  rs[Max_cluster][2];
	/* 植生項目ごとの総画素数 */
	static int  vg[Max_cluster];
	/* 植生データ、分類クラスタデータを一時格納する配列 */
	static int  vegetation[Max_array];
	static int  cluster[Max_array];
	static char fn[1024]="";
	FILE *fp1,*fp2,*fp3,*fp4;

	/* argument parameter read  */
	if (argv!=6){
		printf("--- Automatic Category Assignment Ver.7 ------\n");
		printf("Usage : comp7 PIXEL LINE veg_image class_image flag\n");
		printf("type=0 Average Type=1 Overall Type=2 Kappa \n");
		printf("flag=0 ; Output to 1 column  flag=1 ; table output\n");
		exit(1);
	}

	if (( fp1=fopen(argc[3],"r") )==NULL) {
		printf("Can't open Vegetation Inage\n");
		exit(1);
	}

	if (( fp2=fopen(argc[4],"r") )==NULL) {
		printf("Can't open Classification Image\n");
		exit(1);
	}

	sscanf(argc[1],"%d",&pixel);
	sscanf(argc[2],"%d",&line);
	sscanf(argc[5],"%d",&flag);

	total_data = pixel*line;

	/* Get Image */
	vegetation_max=0;    /* vegetation_max 植生図における最大数 */
	cluster_max=0;    /* cluster_max 分類結果における最大数 */
	for (i=0; ivegetation_max)? m:vegetation_max;
		m=getc(fp2);
		cluster[i]=m;
		cluster_max=(m>cluster_max)? m:cluster_max;
	}
	/* 全座標での対応値を調査 */
	for (i=0; i