|
@@ -23,7 +23,7 @@ int create_isegs(struct globals *globals)
|
|
|
|
|
|
if (globals->bounds_map == NULL) {
|
|
|
/* just one time through loop */
|
|
|
- successflag = globals->method(globals);
|
|
|
+ successflag = globals->method_fn(globals);
|
|
|
}
|
|
|
else {
|
|
|
/* outer processing loop for polygon constraints */
|
|
@@ -70,7 +70,7 @@ int create_isegs(struct globals *globals)
|
|
|
globals->col_max++;
|
|
|
|
|
|
if (have_bound)
|
|
|
- successflag = globals->method(globals);
|
|
|
+ successflag = globals->method_fn(globals);
|
|
|
} /* end outer loop for processing polygons */
|
|
|
|
|
|
/* restore NULL flag */
|
|
@@ -82,8 +82,114 @@ int create_isegs(struct globals *globals)
|
|
|
FLAG_SET(globals->null_flag, row, col);
|
|
|
}
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
return successflag;
|
|
|
}
|
|
|
+
|
|
|
+void find_four_neighbors(int p_row, int p_col,
|
|
|
+ int neighbors[8][2])
|
|
|
+{
|
|
|
+ /* north */
|
|
|
+ neighbors[0][0] = p_row - 1;
|
|
|
+ neighbors[0][1] = p_col;
|
|
|
+
|
|
|
+ /* east */
|
|
|
+ neighbors[1][0] = p_row;
|
|
|
+ neighbors[1][1] = p_col + 1;
|
|
|
+
|
|
|
+ /* south */
|
|
|
+ neighbors[2][0] = p_row + 1;
|
|
|
+ neighbors[2][1] = p_col;
|
|
|
+
|
|
|
+ /* west */
|
|
|
+ neighbors[3][0] = p_row;
|
|
|
+ neighbors[3][1] = p_col - 1;
|
|
|
+
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+void find_eight_neighbors(int p_row, int p_col,
|
|
|
+ int neighbors[8][2])
|
|
|
+{
|
|
|
+ /* get the 4 orthogonal neighbors */
|
|
|
+ find_four_neighbors(p_row, p_col, neighbors);
|
|
|
+
|
|
|
+ /* get the 4 diagonal neighbors */
|
|
|
+ /* north-west */
|
|
|
+ neighbors[4][0] = p_row - 1;
|
|
|
+ neighbors[4][1] = p_col - 1;
|
|
|
+
|
|
|
+ /* north-east */
|
|
|
+ neighbors[5][0] = p_row - 1;
|
|
|
+ neighbors[5][1] = p_col + 1;
|
|
|
+
|
|
|
+ /* south-west */
|
|
|
+ neighbors[6][0] = p_row + 1;
|
|
|
+ neighbors[6][1] = p_col - 1;
|
|
|
+
|
|
|
+ /* south-east */
|
|
|
+ neighbors[7][0] = p_row + 1;
|
|
|
+ neighbors[7][1] = p_col + 1;
|
|
|
+
|
|
|
+ return;
|
|
|
+}
|
|
|
+
|
|
|
+/* similarity / distance between two points based on their input raster values */
|
|
|
+/* assumes first point values already saved in files->bands_seg - only run Segment_get once for that value... */
|
|
|
+/* TODO: Segment_get already happened for a[] values in the main function. Could remove a[] from these parameters */
|
|
|
+double calculate_euclidean_similarity(struct ngbr_stats *Ri,
|
|
|
+ struct ngbr_stats *Rk,
|
|
|
+ struct globals *globals)
|
|
|
+{
|
|
|
+ double val = 0., diff;
|
|
|
+ int n = globals->nbands - 1;
|
|
|
+
|
|
|
+ /* squared euclidean distance, sum the square differences for each dimension */
|
|
|
+ do {
|
|
|
+ diff = Ri->mean[n] - Rk->mean[n];
|
|
|
+
|
|
|
+ val += diff * diff;
|
|
|
+ } while (n--);
|
|
|
+
|
|
|
+ /* the return value should always be in the range 0 - 1 */
|
|
|
+ if (val <= 0)
|
|
|
+ return 0.;
|
|
|
+
|
|
|
+ val /= globals->max_diff;
|
|
|
+
|
|
|
+#ifdef _OR_SHAPE_
|
|
|
+ if (globals->shape_weight < 1)
|
|
|
+ val = val * globals->shape_weight + (1 - globals->shape_weight) *
|
|
|
+ calculate_shape(rsi, rsk, nshared, globals);
|
|
|
+#endif
|
|
|
+
|
|
|
+ return val;
|
|
|
+}
|
|
|
+
|
|
|
+double calculate_manhattan_similarity(struct ngbr_stats *Ri,
|
|
|
+ struct ngbr_stats *Rk,
|
|
|
+ struct globals *globals)
|
|
|
+{
|
|
|
+ double val = 0.;
|
|
|
+ int n = globals->nbands - 1;
|
|
|
+
|
|
|
+ /* squared manhattan distance, sum the differences for each dimension */
|
|
|
+ do {
|
|
|
+ val += Ri->mean[n] - Rk->mean[n];
|
|
|
+ } while (n--);
|
|
|
+
|
|
|
+ /* the return value should always be in the range 0 - 1 */
|
|
|
+ if (val <= 0)
|
|
|
+ return 0.;
|
|
|
+
|
|
|
+ val /= globals->max_diff;
|
|
|
+
|
|
|
+#ifdef _OR_SHAPE_
|
|
|
+ if (globals->shape_weight < 1)
|
|
|
+ val = val * globals->shape_weight + (1 - globals->shape_weight) *
|
|
|
+ calculate_shape(rsi, rsk, nshared, globals);
|
|
|
+#endif
|
|
|
+
|
|
|
+ return val;
|
|
|
+}
|