Browse Source

i.segment: fix goodness of fit

git-svn-id: https://svn.osgeo.org/grass/grass/branches/releasebranch_7_0@62794 15284696-431f-4ddb-bdfa-cd5b030d7da7
Markus Metz 10 years ago
parent
commit
c0cdce99fc
1 changed files with 20 additions and 2 deletions
  1. 20 2
      imagery/i.segment/write_output.c

+ 20 - 2
imagery/i.segment/write_output.c

@@ -73,6 +73,8 @@ int write_output(struct globals *globals)
 	struct Ref Ref;		/* group reference list */
 	DCELL **inbuf;		/* buffers to store lines from each of the imagery group rasters */
 	int n, *in_fd;
+	struct FPRange *fp_range;	/* min/max values of each input raster */
+	DCELL *min, *max;
 
 	mean_fd = Rast_open_new(globals->out_band, FCELL_TYPE);
 	meanbuf = Rast_allocate_f_buf();
@@ -100,11 +102,23 @@ int write_output(struct globals *globals)
 
 	in_fd = G_malloc(Ref.nfiles * sizeof(int));
 	inbuf = (DCELL **) G_malloc(Ref.nfiles * sizeof(DCELL *));
+	fp_range = G_malloc(Ref.nfiles * sizeof(struct FPRange));
+	min = G_malloc(Ref.nfiles * sizeof(DCELL));
+	max = G_malloc(Ref.nfiles * sizeof(DCELL));
 
 	G_debug(1, "Opening input rasters...");
 	for (n = 0; n < Ref.nfiles; n++) {
 	    inbuf[n] = Rast_allocate_d_buf();
 	    in_fd[n] = Rast_open_old(Ref.file[n].name, Ref.file[n].mapset);
+
+	    /* returns -1 on error, 2 on empty range, quitting either way. */
+	    if (Rast_read_fp_range(Ref.file[n].name, Ref.file[n].mapset, &fp_range[n]) != 1)
+		G_fatal_error(_("No min/max found in raster map <%s>"),
+			      Ref.file[n].name);
+	    Rast_get_fp_range_min_max(&(fp_range[n]), &min[n], &max[n]);
+
+	    G_debug(1, "Range for layer %d: min = %f, max = %f",
+			n, min[n], max[n]);
 	}
 
 	G_message(_("Writing out goodness of fit"));
@@ -141,7 +155,11 @@ int write_output(struct globals *globals)
 
 			    /* get values for Rk = this cell */
 			    for (n = 0; n < Ref.nfiles; n++) {
-				globals->second_val[n] = inbuf[n][col];
+				if (globals->weighted == FALSE)
+				    /* scaled version */
+				    globals->second_val[n] = (inbuf[n][col] - min[n]) / (max[n] - min[n]);
+				else
+				    globals->second_val[n] = inbuf[n][col];
 			    }
 
 			    Rk.mean = globals->second_val;
@@ -161,7 +179,7 @@ int write_output(struct globals *globals)
 			    }
 			}
 			else {
-			    sim = 1 - sim / globals->max_diff;
+			    sim = 1 - sim;
 			    meanbuf[col] = sim;
 			    if (mingood > sim)
 				mingood = sim;