Commit dc9a97a8 authored by Andrey Filippov's avatar Andrey Filippov

Added "roundness" and dual-scene for 100m

parent 33f052a0
......@@ -916,6 +916,10 @@ public class ComboMatch {
zoom_lev, // int zoom_lev,
debugLevel); // final int debugLevel)
if (warp == null) {
System.out.println("Failed correlateOrthoPair()");
return false;
}
//maps_collection.ortho_maps[gpu_pair[1]]
if (process_correlation) {
if (update_match) {
......
......@@ -57,10 +57,41 @@ public class ItemMatch {
}
return match.getMatches();
}
public double [] getMatchValues(GroundObjectPattern groundObjectPattern) {
return getMatchValues(groundObjectPattern.getPatternPath());
}
/**
* Get ratio of the worst and best partial pattern correlation values
* @param groundObjectPattern
* @return
*/
public double getRoundness (GroundObjectPattern groundObjectPattern) {
return getRoundness(groundObjectPattern.getPatternPath());
}
public double getRoundness (String pattern_path) {
ItemPatternMatch match = pattern_matches.get(pattern_path);
if (match == null) {
System.out.println("No matches found for pattern "+pattern_path);
return Double.NaN;
}
double [] matches = match.getMatches();
double best = matches[1];
double worst = matches[1];
for (int i = 1; i < matches.length; i++) {
if (matches[i] < worst) {
worst = matches[i];
}
if (matches[i] > best) {
best = matches[i];
}
}
return worst/best;
}
public double getMatchValue(String pattern_path, int indx) {
ItemPatternMatch match = pattern_matches.get(pattern_path);
if (match == null) {
......
......@@ -2193,6 +2193,7 @@ public class OrthoMap implements Comparable <OrthoMap>, Serializable{
switch (ipatterns[n][i]) {
case 1: dbg_img[n][i] = 1.0; break;
case 2: dbg_img[n][i] = -1.0; break;
case 3: dbg_img[n][i] = -2.0; break;
}
}
}
......
......@@ -1185,6 +1185,7 @@ public class OrthoMapsCollection implements Serializable{
if (num_left < tp_tasks[0].length/4) {
num_elevations--;
System.out.println("too few tiles remain, try again. metric_error="+metric_error);
return null;
}
}
......@@ -1726,7 +1727,7 @@ public class OrthoMapsCollection implements Serializable{
ImageDtt.THREADS_MAX, // int threadsMax,
debugLevel-1); // int debug_level)
}
if (debugLevel > 1) {
if (debugLevel > 0) {
String [] dbg_titles = {"x-raw","x_filled","y-raw","y_filled"};
double [][] dbg_img = {vf[0], vf_filled[0],vf[1], vf_filled[1]};
ShowDoubleFloatArrays.showArrays(
......@@ -1781,7 +1782,7 @@ public class OrthoMapsCollection implements Serializable{
int abs_mode = 1; // 0 - keep, 1 keep type and if half +/-1, 2 - keep type, 3 - any, force full pattern
boolean abs_invert = true; // center has lower value than around
double abs_outliers_frac = 0.3;
boolean abs_obscure_warm = true; // obscured can only be by warmer objects
boolean abs_obscure_warm = false; // true; // obscured can only be by warmer objects
double abs_obscure_frac = 0.25; // obscured threshold between center and outer
// filters
......@@ -1800,6 +1801,7 @@ public class OrthoMapsCollection implements Serializable{
double filt_height = 0.2; // allow extra negative offset parallel to image offset, corresponding to object above ground
// double [] filt_full_half_frac = {0.7, 0.5}; // second probably not needed, it is for main
double [] filt_full_half_frac = {0.675, 0.5}; // second probably not needed, it is for main
double [] filt_roundness = {0.6, 0.0}; // second currently is not calculated/ used
double filt_abs_contrast = 80.0; // 50.0;
double filt_abs_easepart = 1.0; // 1.0-no ease for low AGL. Allow lower absolute contrast for partial patterns (high AGL)
boolean convolve_after = false; // true for old kernel tuning (kernel decimation before convolution)
......@@ -1816,7 +1818,7 @@ public class OrthoMapsCollection implements Serializable{
phaseCoeff[0] = 0.9;
// adv_radius = 20; // pix?
} else { // 100m defaults
min_corrs[0] = 0.0119;
min_corrs[0] = 0.009; // 119;
abs_edge_frac = 0.35;
abs_oversize = 2.2;
filt_abs_contrast = 60;
......@@ -1882,6 +1884,8 @@ public class OrthoMapsCollection implements Serializable{
gd.addNumericField("Maximal object height", filt_height, 5,7,"m", "Maximal object height to allow extra offset.");
gd.addNumericField("Full/half corr minimal ratio, main",filt_full_half_frac[0], 5,7,"","Minimal correlation with full pattern strength ratio to correlation with a half-pattern.");
gd.addNumericField("Full/half corr minimal ratio, other",filt_full_half_frac[1], 5,7,"","Minimal correlation with full pattern strength ratio to correlation with a half-pattern.");
gd.addNumericField("Minimal roundness of round, main", filt_roundness[0], 5,7,"","Minimal ratio of worst half-pattern correlation to the full-pattern ones. Only for full patterns.");
gd.addNumericField("Minimal absolute contrast", filt_abs_contrast, 5,7,"","Minimal absolute difference between center and peripheral areas of the main scene objects.");
gd.addNumericField("Ease absolute contrast for halves", filt_abs_easepart, 5,7,"","Ease absolute contast requirements for high AGL (low resolution).");
//
......@@ -1937,49 +1941,51 @@ public class OrthoMapsCollection implements Serializable{
filt_height = gd.getNextNumber();
filt_full_half_frac[0]=gd.getNextNumber();
filt_full_half_frac[1]=gd.getNextNumber();
filt_roundness[0]=gd.getNextNumber();
filt_abs_contrast= gd.getNextNumber();
filt_abs_easepart= gd.getNextNumber();
debugLevel= (int) gd.getNextNumber();
return patternMatchDual (
indices, // int [] indices, // null or which indices to use (normally just 2 for pairwise comparison)
affines, // double [][][] affines, // null or [indices.length][2][3]
warp, // FineXYCorr warp);
object_type, // String object_type,
min_corrs, // double [] min_corrs, // one per
phaseCoeff, // double [] phaseCoeff
min_corr_full_rel, // double min_corr_full_rel,
full_preference, // double full_preference,
max_min_ratio, // double max_min_ratio,
combine_full, // boolean[] combine_full,
corr_size, // int corr_size,
adv_radius, // double adv_radius, //
search_radius, // double search_radius, //
scale_warp, // double scale_warp,
extr_size, // int extr_size,
remove_dc, // boolean remove_dc,
abs_edge_frac, // double abs_edge_frac, // = 0.25;
abs_oversize, // double abs_oversize, // = 1.8;
abs_force_round, // boolean abs_force_round,
abs_mode, // int abs_mode, // = 1; // 0 - keep, 1 keep type and if half +/-1, 2 - keep type, 3 - any
abs_invert, // boolean abs_invert, // = true; // center has lower value than around
abs_outliers_frac, // double abs_outliers_frac,
abs_obscure_warm, // boolean abs_obscure_warm, // = true; // obscured can only be by warmer objects
abs_obscure_frac, // double abs_obscure_frac, // 0.25; // obscured threshold between center and outer
filt_keep, // boolean filt_keep,
filt_atonce, // boolean filt_atonce,
filt_frac_max, // double frac_max, // measure are at fraction of max
filt_max_radius, // double [][] filt_max_radius,
filt_elongation, // double [][] filt_elongation,
filt_other_rad, // double filt_other_rad, // should be no disconnected high peaks in this radius (only for halves multiplied)
filt_other_frac, // double [] filt_other_frac, // no pixels around max at filt_other_rad should be higher than this fraction of max
filt_dist, // double [] filt_dist,
filt_height, // double filt_height,
indices, // int [] indices, // null or which indices to use (normally just 2 for pairwise comparison)
affines, // double [][][] affines, // null or [indices.length][2][3]
warp, // FineXYCorr warp);
object_type, // String object_type,
min_corrs, // double [] min_corrs, // one per
phaseCoeff, // double [] phaseCoeff
min_corr_full_rel, // double min_corr_full_rel,
full_preference, // double full_preference,
max_min_ratio, // double max_min_ratio,
combine_full, // boolean[] combine_full,
corr_size, // int corr_size,
adv_radius, // double adv_radius, //
search_radius, // double search_radius, //
scale_warp, // double scale_warp,
extr_size, // int extr_size,
remove_dc, // boolean remove_dc,
abs_edge_frac, // double abs_edge_frac, // = 0.25;
abs_oversize, // double abs_oversize, // = 1.8;
abs_force_round, // boolean abs_force_round,
abs_mode, // int abs_mode, // = 1; // 0 - keep, 1 keep type and if half +/-1, 2 - keep type, 3 - any
abs_invert, // boolean abs_invert, // = true; // center has lower value than around
abs_outliers_frac, // double abs_outliers_frac,
abs_obscure_warm, // boolean abs_obscure_warm, // = true; // obscured can only be by warmer objects
abs_obscure_frac, // double abs_obscure_frac, // 0.25; // obscured threshold between center and outer
filt_keep, // boolean filt_keep,
filt_atonce, // boolean filt_atonce,
filt_frac_max, // double frac_max, // measure are at fraction of max
filt_max_radius, // double [][] filt_max_radius,
filt_elongation, // double [][] filt_elongation,
filt_other_rad, // double filt_other_rad, // should be no disconnected high peaks in this radius (only for halves multiplied)
filt_other_frac, // double [] filt_other_frac, // no pixels around max at filt_other_rad should be higher than this fraction of max
filt_dist, // double [] filt_dist,
filt_height, // double filt_height,
filt_full_half_frac, // double [] filt_full_half_frac,
filt_abs_contrast, // double filt_abs_contrast, // = 50.0;
filt_abs_easepart, // double filt_abs_easepart,
convolve_after, // boolean convolve_after,
debugLevel); // int debugLevel)
filt_roundness, // double [] filt_half_full_frac,
filt_abs_contrast, // double filt_abs_contrast, // = 50.0;
filt_abs_easepart, // double filt_abs_easepart,
convolve_after, // boolean convolve_after,
debugLevel); // int debugLevel)
}
public ImagePlus patternMatchDual (
......@@ -2017,6 +2023,7 @@ public class OrthoMapsCollection implements Serializable{
double [] filt_dist,
double filt_height,
double [] filt_full_half_frac,
double [] filt_roundness,
double filt_abs_contrast, // = 50.0;
double filt_abs_easepart,
boolean convolve_after, // mitigating kernels tuned for decimate before convolve
......@@ -2347,7 +2354,7 @@ public class OrthoMapsCollection implements Serializable{
if (num_non_overlap > 0) {
System.out.println("Removed "+num_non_overlap+" objects outside of the scenes overlap, "+match_sort.size()+" remain");
}
System.out.print(String.format("%4s: %9s %8s %3s"," # ", " x/y ", " best ","sub"));
System.out.print(String.format("%4s: %9s %8s %6s %3s"," # ", " x/y ", " best ","round", "sub"));
for (int j = 0; j < (corrs_out[scene_num].length + 1); j++) if (j != sort_pattern_index) {
System.out.print(String.format(" %8s ","match_"+j));
}
......@@ -2357,10 +2364,11 @@ public class OrthoMapsCollection implements Serializable{
ItemMatch match = matches_list.get(indx);
double [] match_values = match.getMatchValues(gops[scene_num]);
int [] icenter_xy = match.getIntXY();
System.out.print(String.format("%4d: %4d/%4d %8.5f %3d",
System.out.print(String.format("%4d: %4d/%4d %8.5f %6.3f %3d",
i,
icenter_xy[0],icenter_xy[1],
match.getMatchValue(gops[scene_num]), // ,sort_pattern_index),
match.getMatchValue(gops[scene_num]),
match.getRoundness (gops[scene_num]),
match.getPatternMatch(gops[scene_num]).getBestSub())); // 1-based
for (int j = 0; j < match_values.length; j++) if (j != sort_pattern_index) {
System.out.print(String.format(" %8.5f",match_values[j]));
......@@ -2564,9 +2572,10 @@ public class OrthoMapsCollection implements Serializable{
filt_dist, // double [] filt_dist,
filt_height, // double filt_height,
filt_full_half_frac,// double [] filt_full_half_frac,
filt_roundness, // double [] filt_roundness,
filt_abs_contrast, // double filt_abs_contrast,
filt_abs_easepart, // double filt_abs_easepart,
gops[scene_num], // GroundObjectPattern gop,
gops[scene_num], // GroundObjectPattern gop,
filt_other_frac, // double [] filt_other_frac, // null - disable, for all full (round) patterns.
filter_data, // double [][][][] filter_data,
zoom_level, // int zoom_level,
......@@ -2640,7 +2649,7 @@ public class OrthoMapsCollection implements Serializable{
if (indices.length > 1) {
// print updated table after some scenes may be removed by the filter
System.out.println("\nAfter first scene filtering:");
System.out.print(String.format("%4s: %9s %8s %8s %3s"," # ", " x/y ", " best ","contrast","sub"));
System.out.print(String.format("%4s: %9s %8s %8s %6s %3s"," # ", " x/y ", " best ","contrast","round", "sub"));
for (int j = 0; j < (corrs_out[scene_num].length + 1); j++) if (j != sort_pattern_index) {
System.out.print(String.format(" %8s ","match_"+j));
}
......@@ -2653,13 +2662,13 @@ public class OrthoMapsCollection implements Serializable{
int [] icenter_xy = match.getIntXY();
// double best_val = match.getMatchValue(gops[scene_num],sort_pattern_index);
// so it is updated after best subpattern could be changed in setAbsoluteContrasts()
double best_val = match.getMatchValue(gops[scene_num]);
//match_values[match.getPatternMatch(gops[scene_num]).getBestSub() -1];
System.out.print(String.format("%4d: %4d/%4d %8.5f %8.3f %3d",
System.out.print(String.format("%4d: %4d/%4d %8.5f %8.3f %6.3f %3d",
i,
icenter_xy[0],icenter_xy[1],
best_val,
match.getMatchValue(gops[scene_num]),
match.getAbsoluteContrast(),
match.getRoundness(gops[scene_num]),
match.getPatternMatch(gops[scene_num]).getBestSub())); // 1-based
for (int j = 0; j < match_values.length; j++) if (j != sort_pattern_index) {
System.out.print(String.format(" %8.5f",match_values[j]));
......@@ -2760,7 +2769,8 @@ public class OrthoMapsCollection implements Serializable{
filt_elongation, // double [][] filt_elongation,
filt_dist, // double [] filt_dist,
filt_height, // double filt_height,
filt_full_half_frac,// double [] filt_other_frac, // null - disable, for all full (round) patterns.
filt_full_half_frac,// double [] filt_other_frac, // null - disable, for all full (round) patterns.
filt_roundness, // double [] filt_roundness,
filt_abs_contrast, // double filt_abs_contrast,
filt_abs_easepart, // double filt_abs_easepart,
gops[scene_num], // GroundObjectPattern gop,
......@@ -2858,7 +2868,7 @@ public class OrthoMapsCollection implements Serializable{
Math.sqrt(scene_xy_offset[0]*scene_xy_offset[0]+scene_xy_offset[1]*scene_xy_offset[1])+" pix");
}
// System.out.println("Updated object list with main scene peak areas and secondary scene maximums, areas and maximum distances from the main");
System.out.print(String.format("%4s: %9s %8s %8s %3s"," # ", " x/y ", " best ","contrast","sub"));
System.out.print(String.format("%4s: %9s %8s %8s %6s %3s"," # ", " x/y ", " best ","contrast","round","sub"));
for (int j = 0; j < (corrs_out[scene_num].length + 1); j++) if (j != sort_pattern_index) {
System.out.print(String.format(" %8s ","match_"+j));
}
......@@ -2877,11 +2887,12 @@ public class OrthoMapsCollection implements Serializable{
ItemMatch match = matches_list.get(indx);
double [] match_values = match.getMatchValues(gops[scene_num]);
int [] icenter_xy = match.getIntXY();
System.out.print(String.format("%4d: %4d/%4d %8.5f %8.3f %3d",
System.out.print(String.format("%4d: %4d/%4d %8.5f %8.3f %6.3f %3d",
i,
icenter_xy[0],icenter_xy[1],
match.getMatchValue(gops[scene_num],sort_pattern_index),
match.getMatchValue(gops[scene_num]), // ,sort_pattern_index),
match.getAbsoluteContrast(),
match.getRoundness(gops[scene_num]),
match.getPatternMatch(gops[scene_num]).getBestSub())); // 1-based
for (int j = 0; j < match_values.length; j++) if (j != sort_pattern_index) {
System.out.print(String.format(" %8.5f",match_values[j]));
......@@ -2915,7 +2926,7 @@ public class OrthoMapsCollection implements Serializable{
// System.out.println(String.format("best_d=%7.5f, rad=%6.3f, elong=%6.3f, dist=%6.3f, dx=%6.3f, dy=%6.3f",
double o_fhr = filter_data[1][i][0][0]/filter_data[1][i][1][0];
System.out.print(String.format(
" %8.5f %6.3f %6.3f %6.3f %7.3f %7.3f %7.3f %7.3f %7.3f | %8.5f %6.3f %6.3f %6.3f %6.3f %6.3f %7.3f %7.3f %7s",
" %8.5f %6.3f %6.3f %6.3f %7.3f %7.3f %7.3f %7.3f %7.3f | %8.5f %6.3f %6.3f %6.3f %6.3f %6.3f %7.3f %7.3f",
// for second full - everything and parallel/perpendicular+elevation
filter_data[1][i][0][0], filter_data[1][i][0][1], filter_data[1][i][0][2], // full: corr, radius, elongation
filter_data[1][i][0][3], filter_data[1][i][0][4], filter_data[1][i][0][5], // full: dist, dx, dy
......@@ -3151,6 +3162,7 @@ public class OrthoMapsCollection implements Serializable{
double [] filt_dist,
double filt_height,
double [] filt_full_half_frac,
double [] filt_roundness,
double filt_abs_contrast,
double filt_abs_easepart,
GroundObjectPattern gop,
......@@ -3181,8 +3193,8 @@ public class OrthoMapsCollection implements Serializable{
int [] ixy = match.getIntXY();
String name = ixy[0]+"/"+ixy[1];
double abs_contrast = match.getAbsoluteContrast();
double roundness = match.getRoundness(gop);
int best_patt= match.getPatternMatch(gop).getBestSub(); // 1-based
// boolean is_partial = best_patt_indx[mn] != 0; // only apply to combined full/half correlations, just full may have nearby maximums near the same size
boolean is_partial = best_patt != 1; // only apply to combined full/half correlations, just full may have nearby maximums near the same size
double [] strength_full_half_ratio = new double[num_scenes];
for (int scene_num = 0; scene_num < num_scenes; scene_num++) if (filter_data[scene_num] != null){
......@@ -3199,7 +3211,12 @@ public class OrthoMapsCollection implements Serializable{
if (!remove[mn]) num_removed++;
remove[mn] = true;
}
if (!is_partial && (roundness < filt_roundness[0])) {
System.out.println(name+": filtered out by "+NAME_MO[0]+" scene because it is full/round, and its roundness = "+
roundness+ " < "+filt_roundness[0]);
if (!remove[mn]) num_removed++;
remove[mn] = true;
}
for (int hf = 0; hf < 2; hf++) {
for (int scene_num = 0; scene_num < num_scenes; scene_num++) if (filt_main_other[scene_num]){
if (Double.isNaN(filter_data[scene_num][mn][hf][0])) {
......@@ -3224,8 +3241,8 @@ public class OrthoMapsCollection implements Serializable{
NAME_FH[hf]+ " = "+corr_val+" < "+ min_corrs_other[scene_num][hf]);
if (scene_num == 0) {
System.out.println(
"For the main scene it could happen if the sub_pattern index changed after\n"+
"the absolute contrast evaluation.");
"For the main scene it could happen if the sub_pattern index changed after"+
" the absolute contrast evaluation.");
}
if (!remove[mn]) num_removed++;
remove[mn] = true;
......@@ -3408,7 +3425,7 @@ public class OrthoMapsCollection implements Serializable{
}
double [][] dir_contrasts = new double [try_sub.length][];
int best_index = -1;
for (int i = 0; i < try_sub.length; i++) if (try_sub[i]) {
for (int i = 0; i < try_sub.length; i++) if ((i==0) || try_sub[i]) {
dir_contrasts[i]= OrthoMap.getAbsoluteContrast(
extracted_objects[mn], // double [] data,
ipatterns[i], // int [] ipattern,
......@@ -3420,7 +3437,7 @@ public class OrthoMapsCollection implements Serializable{
dir_contrasts[i][0] *= -1;
}
boolean bad_obscurant = obscure_warm && (dir_contrasts[i][1] < 0);
if (!bad_obscurant && (dir_contrasts[i][0] > 0)) {
if (try_sub[i] && !bad_obscurant && (dir_contrasts[i][0] > 0)) {
if ((best_index < 0) || (dir_contrasts[i][0] > dir_contrasts[best_index][0])) {
best_index = i;
}
......@@ -3428,6 +3445,7 @@ public class OrthoMapsCollection implements Serializable{
}
if (best_index < 0) {
best_index = 0;
if (debugLevel > -3) {
System.out.println("setAbsoluteContrasts(): no candidates found (probably after removing bad obscurants) #"
+mn+", giving a chance as full pattern. Was (1 for full):"+
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment