Loading src/main/java/com/elphel/imagej/vegetation/VegetationLMA.java +25 −12 Original line number Diff line number Diff line Loading @@ -57,6 +57,10 @@ public class VegetationLMA { public double alpha_lpf = 0; public double terr_lpf = 0; public double veget_lpf = 0; public double boost_parallax = 1; public double um_sigma = 0; // just use in debug image names public double um_weight = 0; // data used to calculate lpf pull of the alpha pixel to average of four neighbors. Below similar (weaker pull) for terrain and vegetation // to smooth areas where there is no data from available images. public int [][] alpha_neibs; // corresponds to parameters for alpha (num_pars_vegetation_alpha), each has 4 ortho neibs, -1 - border, >= 0 Loading @@ -69,8 +73,8 @@ public class VegetationLMA { public int debug_index; public double [][] debug_image; public static double [] debug_alpha_scales = {100,150}; public String debug_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma/"; public static double [] debug_alpha_scales = {0,50}; // {100,150}; public String debug_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma_um/"; public int [] indices; public int [][] cpairs = null; Loading Loading @@ -127,6 +131,8 @@ public class VegetationLMA { final double terr_lpf, // pull terrain to average of 4 neighbors (very small) final double veget_lpf, // pull vegetation to average of 4 neighbors (very small - maybe not needed) final double boost_parallax, // increase weight of scene with maximal parallax relative to the reference scene final double um_sigma, // just use in debug image names final double um_weight, final String parameters_read_path, final int debugLevel) { this.woi = woi; Loading @@ -135,6 +141,10 @@ public class VegetationLMA { this.alpha_lpf = alpha_lpf; this.terr_lpf = terr_lpf; this.veget_lpf = veget_lpf; this.boost_parallax = boost_parallax; this.um_sigma = um_sigma; // just use in debug image names this.um_weight = um_weight; final double [] scene_weights = setupSceneWeights( boost_parallax); // double boost_parallax) int min_scenes_uses = min_scenes; Loading Loading @@ -509,7 +519,10 @@ public class VegetationLMA { if (debug_level > -2) { // String save_dir = debug_path; String debug_title = "parameters_vector-x"+woi.x+"-y"+woi.y+"-w"+woi.width+"-h"+woi.height; debug_title +="-al"+alpha_loss+"-alo"+alpha_offset+"-alp"+alpha_lpf+"-tl"+terr_lpf+"-vl"+veget_lpf; debug_title +="-al"+alpha_loss+"-alo"+alpha_offset+"-alp"+alpha_lpf+"-tl"+terr_lpf+"-vl"+veget_lpf+"-bp"+boost_parallax; if (um_weight > 0) { debug_title +="-um"+um_sigma+"_"+um_weight; } boolean save_all = (debug_image != null); boolean show_this = debug_level > 3; boolean show_all = debug_level > 4; Loading Loading @@ -684,7 +697,7 @@ public class VegetationLMA { threshold_terrain, // final double alpha_threshold, // discard images with too low transparency vector); // final double [] vector) double [] terrain_masked = tvas[0].clone(); double [] vegetation_masked = tvas[0].clone(); double [] vegetation_masked = tvas[1].clone(); for (int i = 0; i < terrain_masked.length; i++) { if (!(terrain_weights_max[0][i] >= min_terrain)) terrain_masked[i] = Double.NaN; if (!(terrain_weights_max[1][i] >= min_max_terrain)) terrain_masked[i] = Double.NaN; Loading src/main/java/com/elphel/imagej/vegetation/VegetationModel.java +97 −40 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.math3.analysis.interpolation.PiecewiseBicubicSplineInterpolatingFunction; import com.elphel.imagej.cameras.CLTParameters; import com.elphel.imagej.common.DoubleGaussianBlur; import com.elphel.imagej.common.ShowDoubleFloatArrays; import com.elphel.imagej.orthomosaic.OrthoMap; import com.elphel.imagej.tileprocessor.ErsCorrection; Loading Loading @@ -631,6 +632,42 @@ public class VegetationModel { titles, // String [] titles, debugLevel); // int debugLevel) } public static void unsharpMaskMulti( final double [][] data, final int width, final double um_sigma, final double um_weight) { final int height = data[0].length / width; final int num_images = data.length; final Thread[] threads = ImageDtt.newThreadArray(QuadCLT.THREADS_MAX); final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { double [] data_orig = new double [width * height]; for (int nimg = ai.getAndIncrement(); nimg < num_images; nimg = ai.getAndIncrement()) { double [] data_slice = data[nimg]; System.arraycopy(data_slice, 0, data_orig,0,data_orig.length); (new DoubleGaussianBlur()).blurDouble( data_slice, // width, height, um_sigma, // double sigmaX, um_sigma, // double sigmaY, 0.01); // double accuracy) for (int i = 0; i < data_orig.length; i++) { data_slice[i] = data_orig[i] - um_weight * data_slice[i]; } } } }; } ImageDtt.startAndJoin(threads); } public static void testVegetationLMA( int width, double [] terrain_average, // full image average terrain (no nulls) Loading @@ -640,7 +677,47 @@ public class VegetationModel { String [] titles, int debugLevel) { boolean diff_mode = true; if (debugLevel > 3) { Rectangle woi50 = new Rectangle(143,317,35,35); int min_scenes = 10; double default_alpha = 0.8; double reg_weights = 0.25; // fraction of the total weight used for regularization double alpha_loss = 10000.0; // 1000.0; // 100.; // 10.0; // quadratic loss when alpha reaches -1.0 or 2.0 double alpha_offset = 0.02; // 0.03; // if >0, start losses above 0.0 and below 1.0; double alpha_lpf = 10; // 20; // 6.0; // 3.0; // 2.0; // 1.5; // 5.0; // 0.5; // pull to average of 4 neighbors double terr_lpf = 0.1; // pull terrain to average of 4 neighbors (very small) double veget_lpf = 0.1; // pull vegetation to average of 4 neighbors (very small - maybe not needed) double boost_parallax = 1.0; // 5; boolean exit_loop = debugLevel < 1000; boolean next_run = false; boolean read_pars = false; // true; // false; // true; double threshold_terrain = 0.05; double min_max_terrain= 0.1; double min_terrain = 0.001; double min_vegetation = 0.5; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma/parameters_vector_data_1000-0.03.tiff"; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_1000-0.03.tiff"; String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_x143-y317-w35-h35-live_10000_0.02_3.0.tiff"; final boolean um_en = true; final double um_sigma = 1.0; final double um_weight = 0.8; if (um_en) { double [][] um_data = new double [terrain_rendered.length+2][]; System.arraycopy(terrain_rendered, 0, um_data, 0, terrain_rendered.length); um_data[terrain_rendered.length + 0] = terrain_average; um_data[terrain_rendered.length + 1] = vegetation_average; unsharpMaskMulti( um_data, // final double [][] data, SHOULD not have NaN width, // final int width, um_sigma, // final double um_sigma, um_weight); // final double um_weight) } if ((debugLevel > 3) || um_en) { double [][][] dbg_img = new double[3][vegetation_offsets.length][vegetation_offsets[0].length]; for (int n = 0; n < 2; n++) { for (int nscene = 0; nscene < vegetation_offsets.length; nscene++) { Loading Loading @@ -694,28 +771,6 @@ public class VegetationModel { // Rectangle woi50 = new Rectangle(143,317,50,50); // Rectangle woi50 = new Rectangle(143,317,25,25); Rectangle woi50 = new Rectangle(143,317,35,35); int min_scenes = 10; double default_alpha = 0.8; double reg_weights = 0.25; // fraction of the total weight used for regularization double alpha_loss = 10000.0; // 1000.0; // 100.; // 10.0; // quadratic loss when alpha reaches -1.0 or 2.0 double alpha_offset = 0.02; // 0.03; // if >0, start losses above 0.0 and below 1.0; double alpha_lpf = 6.0; // 3.0; // 2.0; // 1.5; // 5.0; // 0.5; // pull to average of 4 neighbors double terr_lpf = 0.1; // pull terrain to average of 4 neighbors (very small) double veget_lpf = 0.1; // pull vegetation to average of 4 neighbors (very small - maybe not needed) double boost_parallax = 5; boolean exit_loop = debugLevel < 1000; boolean next_run = false; boolean read_pars = true; // false; // true; double threshold_terrain = 0.05; double min_max_terrain= 0.1; double min_terrain = 0.001; double min_vegetation = 0.5; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma/parameters_vector_data_1000-0.03.tiff"; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_1000-0.03.tiff"; String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_x143-y317-w35-h35-live_10000_0.02_3.0.tiff"; do { Loading @@ -732,6 +787,8 @@ public class VegetationModel { terr_lpf, // final double terr_lpf, // pull terrain to average of 4 neighbors (very small) veget_lpf, // final double veget_lpf, // pull vegetation to average of 4 neighbors (very small - maybe not needed) boost_parallax,// final double boost_parallax, // increase weight of scene with maximal parallax relative to the reference scene um_sigma, // final double um_sigma, // just use in debug image names (um_en? um_weight: 0.0), // final double um_weight, par_path, // final String parameters_read_path, debugLevel); // final int debugLevel); if (debugLevel >-2) { Loading Loading
src/main/java/com/elphel/imagej/vegetation/VegetationLMA.java +25 −12 Original line number Diff line number Diff line Loading @@ -57,6 +57,10 @@ public class VegetationLMA { public double alpha_lpf = 0; public double terr_lpf = 0; public double veget_lpf = 0; public double boost_parallax = 1; public double um_sigma = 0; // just use in debug image names public double um_weight = 0; // data used to calculate lpf pull of the alpha pixel to average of four neighbors. Below similar (weaker pull) for terrain and vegetation // to smooth areas where there is no data from available images. public int [][] alpha_neibs; // corresponds to parameters for alpha (num_pars_vegetation_alpha), each has 4 ortho neibs, -1 - border, >= 0 Loading @@ -69,8 +73,8 @@ public class VegetationLMA { public int debug_index; public double [][] debug_image; public static double [] debug_alpha_scales = {100,150}; public String debug_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma/"; public static double [] debug_alpha_scales = {0,50}; // {100,150}; public String debug_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma_um/"; public int [] indices; public int [][] cpairs = null; Loading Loading @@ -127,6 +131,8 @@ public class VegetationLMA { final double terr_lpf, // pull terrain to average of 4 neighbors (very small) final double veget_lpf, // pull vegetation to average of 4 neighbors (very small - maybe not needed) final double boost_parallax, // increase weight of scene with maximal parallax relative to the reference scene final double um_sigma, // just use in debug image names final double um_weight, final String parameters_read_path, final int debugLevel) { this.woi = woi; Loading @@ -135,6 +141,10 @@ public class VegetationLMA { this.alpha_lpf = alpha_lpf; this.terr_lpf = terr_lpf; this.veget_lpf = veget_lpf; this.boost_parallax = boost_parallax; this.um_sigma = um_sigma; // just use in debug image names this.um_weight = um_weight; final double [] scene_weights = setupSceneWeights( boost_parallax); // double boost_parallax) int min_scenes_uses = min_scenes; Loading Loading @@ -509,7 +519,10 @@ public class VegetationLMA { if (debug_level > -2) { // String save_dir = debug_path; String debug_title = "parameters_vector-x"+woi.x+"-y"+woi.y+"-w"+woi.width+"-h"+woi.height; debug_title +="-al"+alpha_loss+"-alo"+alpha_offset+"-alp"+alpha_lpf+"-tl"+terr_lpf+"-vl"+veget_lpf; debug_title +="-al"+alpha_loss+"-alo"+alpha_offset+"-alp"+alpha_lpf+"-tl"+terr_lpf+"-vl"+veget_lpf+"-bp"+boost_parallax; if (um_weight > 0) { debug_title +="-um"+um_sigma+"_"+um_weight; } boolean save_all = (debug_image != null); boolean show_this = debug_level > 3; boolean show_all = debug_level > 4; Loading Loading @@ -684,7 +697,7 @@ public class VegetationLMA { threshold_terrain, // final double alpha_threshold, // discard images with too low transparency vector); // final double [] vector) double [] terrain_masked = tvas[0].clone(); double [] vegetation_masked = tvas[0].clone(); double [] vegetation_masked = tvas[1].clone(); for (int i = 0; i < terrain_masked.length; i++) { if (!(terrain_weights_max[0][i] >= min_terrain)) terrain_masked[i] = Double.NaN; if (!(terrain_weights_max[1][i] >= min_max_terrain)) terrain_masked[i] = Double.NaN; Loading
src/main/java/com/elphel/imagej/vegetation/VegetationModel.java +97 −40 Original line number Diff line number Diff line Loading @@ -7,6 +7,7 @@ import java.util.concurrent.atomic.AtomicInteger; import org.apache.commons.math3.analysis.interpolation.PiecewiseBicubicSplineInterpolatingFunction; import com.elphel.imagej.cameras.CLTParameters; import com.elphel.imagej.common.DoubleGaussianBlur; import com.elphel.imagej.common.ShowDoubleFloatArrays; import com.elphel.imagej.orthomosaic.OrthoMap; import com.elphel.imagej.tileprocessor.ErsCorrection; Loading Loading @@ -631,6 +632,42 @@ public class VegetationModel { titles, // String [] titles, debugLevel); // int debugLevel) } public static void unsharpMaskMulti( final double [][] data, final int width, final double um_sigma, final double um_weight) { final int height = data[0].length / width; final int num_images = data.length; final Thread[] threads = ImageDtt.newThreadArray(QuadCLT.THREADS_MAX); final AtomicInteger ai = new AtomicInteger(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { double [] data_orig = new double [width * height]; for (int nimg = ai.getAndIncrement(); nimg < num_images; nimg = ai.getAndIncrement()) { double [] data_slice = data[nimg]; System.arraycopy(data_slice, 0, data_orig,0,data_orig.length); (new DoubleGaussianBlur()).blurDouble( data_slice, // width, height, um_sigma, // double sigmaX, um_sigma, // double sigmaY, 0.01); // double accuracy) for (int i = 0; i < data_orig.length; i++) { data_slice[i] = data_orig[i] - um_weight * data_slice[i]; } } } }; } ImageDtt.startAndJoin(threads); } public static void testVegetationLMA( int width, double [] terrain_average, // full image average terrain (no nulls) Loading @@ -640,7 +677,47 @@ public class VegetationModel { String [] titles, int debugLevel) { boolean diff_mode = true; if (debugLevel > 3) { Rectangle woi50 = new Rectangle(143,317,35,35); int min_scenes = 10; double default_alpha = 0.8; double reg_weights = 0.25; // fraction of the total weight used for regularization double alpha_loss = 10000.0; // 1000.0; // 100.; // 10.0; // quadratic loss when alpha reaches -1.0 or 2.0 double alpha_offset = 0.02; // 0.03; // if >0, start losses above 0.0 and below 1.0; double alpha_lpf = 10; // 20; // 6.0; // 3.0; // 2.0; // 1.5; // 5.0; // 0.5; // pull to average of 4 neighbors double terr_lpf = 0.1; // pull terrain to average of 4 neighbors (very small) double veget_lpf = 0.1; // pull vegetation to average of 4 neighbors (very small - maybe not needed) double boost_parallax = 1.0; // 5; boolean exit_loop = debugLevel < 1000; boolean next_run = false; boolean read_pars = false; // true; // false; // true; double threshold_terrain = 0.05; double min_max_terrain= 0.1; double min_terrain = 0.001; double min_vegetation = 0.5; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma/parameters_vector_data_1000-0.03.tiff"; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_1000-0.03.tiff"; String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_x143-y317-w35-h35-live_10000_0.02_3.0.tiff"; final boolean um_en = true; final double um_sigma = 1.0; final double um_weight = 0.8; if (um_en) { double [][] um_data = new double [terrain_rendered.length+2][]; System.arraycopy(terrain_rendered, 0, um_data, 0, terrain_rendered.length); um_data[terrain_rendered.length + 0] = terrain_average; um_data[terrain_rendered.length + 1] = vegetation_average; unsharpMaskMulti( um_data, // final double [][] data, SHOULD not have NaN width, // final int width, um_sigma, // final double um_sigma, um_weight); // final double um_weight) } if ((debugLevel > 3) || um_en) { double [][][] dbg_img = new double[3][vegetation_offsets.length][vegetation_offsets[0].length]; for (int n = 0; n < 2; n++) { for (int nscene = 0; nscene < vegetation_offsets.length; nscene++) { Loading Loading @@ -694,28 +771,6 @@ public class VegetationModel { // Rectangle woi50 = new Rectangle(143,317,50,50); // Rectangle woi50 = new Rectangle(143,317,25,25); Rectangle woi50 = new Rectangle(143,317,35,35); int min_scenes = 10; double default_alpha = 0.8; double reg_weights = 0.25; // fraction of the total weight used for regularization double alpha_loss = 10000.0; // 1000.0; // 100.; // 10.0; // quadratic loss when alpha reaches -1.0 or 2.0 double alpha_offset = 0.02; // 0.03; // if >0, start losses above 0.0 and below 1.0; double alpha_lpf = 6.0; // 3.0; // 2.0; // 1.5; // 5.0; // 0.5; // pull to average of 4 neighbors double terr_lpf = 0.1; // pull terrain to average of 4 neighbors (very small) double veget_lpf = 0.1; // pull vegetation to average of 4 neighbors (very small - maybe not needed) double boost_parallax = 5; boolean exit_loop = debugLevel < 1000; boolean next_run = false; boolean read_pars = true; // false; // true; double threshold_terrain = 0.05; double min_max_terrain= 0.1; double min_terrain = 0.001; double min_vegetation = 0.5; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/lma/parameters_vector_data_1000-0.03.tiff"; // String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_1000-0.03.tiff"; String parameters_path = "/media/elphel/SSD3-4GB/lwir16-proc/berdich3/debug/vegetation/essential/parameters_vector_data_x143-y317-w35-h35-live_10000_0.02_3.0.tiff"; do { Loading @@ -732,6 +787,8 @@ public class VegetationModel { terr_lpf, // final double terr_lpf, // pull terrain to average of 4 neighbors (very small) veget_lpf, // final double veget_lpf, // pull vegetation to average of 4 neighbors (very small - maybe not needed) boost_parallax,// final double boost_parallax, // increase weight of scene with maximal parallax relative to the reference scene um_sigma, // final double um_sigma, // just use in debug image names (um_en? um_weight: 0.0), // final double um_weight, par_path, // final String parameters_read_path, debugLevel); // final int debugLevel); if (debugLevel >-2) { Loading