Commit dcec0ae3 authored by Andrey Filippov's avatar Andrey Filippov
Browse files

Implemented UM, before chenging alpha to cos

parent 3f011b38
Loading
Loading
Loading
Loading
+25 −12
Original line number Diff line number Diff line
@@ -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
@@ -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;
@@ -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;
@@ -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;
@@ -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;
@@ -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;
+97 −40
Original line number Diff line number Diff line
@@ -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;
@@ -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)
@@ -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++) {
@@ -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 {
@@ -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) {