Commit 0ee7b87d authored by Andrey Filippov's avatar Andrey Filippov
Browse files

detecting periodic features (unfinished)

parent 788cab17
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -2900,8 +2900,8 @@ public class EyesisCorrectionParameters {
		public double     per_min_period =         4.0;   //
		public int        per_min_num_periods =    3; // minimal number of periods
		public double     per_disp_tolerance =     1.0;   // maximal difference between the average of fundamental and
		public double     per_disp_match =         1.0;   // disparity difference to match neighbors
		public double     per_strong_match_inc =   0.02;  // extra strength to treat match as strong (for hysteresis)
		public double     per_disp_match =         1.5;   // disparity difference to match neighbors
		public double     per_strong_match_inc =   0.05;  // extra strength to treat match as strong (for hysteresis)
// Macro disparity scanning parameters
		public double     mc_disp8_step        =   2.0;   // Macro disparity scan step (actual disparity step is 8x)
+14 −2
Original line number Diff line number Diff line
@@ -7471,11 +7471,21 @@ public class QuadCLT {
				  threadsMax,                           // final int                   threadsMax,  // maximal number of threads to launch
				  updateStatus,                         // final boolean               updateStatus,
				  debugLevel+3);                        // final int                   debugLevel) // update status info

		  tp.periodics = periodics;

		  String [] dbg_titles= {"fundamental","period", "strength", "num_layers"};
			double [][] dbg_img = new double [4][tp.getTilesX()*tp.getTilesY()];
			for (int n = 0; n < periodics.length; n++) {
				for (int i = 0; i < dbg_img.length; i++) {
					dbg_img[i][n]= (periodics[n] == null) ? Double.NaN : periodics[n][i];
				}
			}

		  (new showDoubleFloatArrays()).showArrays(
				  periodics,
				  dbg_img,
				  tp.getTilesX(),
				  periodics[0].length/tp.getTilesX(),
				  tp.getTilesY(),
				  true,
				  image_name+"-PERIODIC",
				  dbg_titles);
@@ -7485,6 +7495,8 @@ public class QuadCLT {





//*****************************************************************

//	  public ImagePlus output3d(
+35 −20
Original line number Diff line number Diff line
@@ -77,11 +77,17 @@ public class TileProcessor {
	private int      tileSize =            8; // number of linear pixels in a tile (tile is  square tileSize*tileSize)
	int              superTileSize =      8; // number of linear tiles in a super-tile (supertile is  square superTileSize*superTileSize tiles
	                                        // or (superTileSize*tileSize) * (superTileSize*tileSize) pixels, currently 64x64 pixels)
    double [][]      periodics = null;

	public int       threadsMax =       100; // maximal number of frames to run
	public int       globalDebugLevel = 0;

	public double [][] dbg_filtered_disp_strength;

	public double [][] getPeriodcs(){
		// todo: add calculation (if null) and reset
		return this.periodics;
	}
	// All parameters are set only once, during instantiation

	public TileProcessor(
@@ -490,7 +496,8 @@ public class TileProcessor {
		final int dbg_tile = (debugLevel>0) ? (dbg_tileX + tilesX * (dbg_tileY)): -1;
		final int numTiles = tilesX*tilesY;
		final TileNeibs         tnImage = new TileNeibs(tilesX,tilesY);
		final double [][] fund_per = new double[4][numTiles];
//		final double [][] fund_per = new double[4][numTiles];
		final double [][] fund_per = new double[numTiles][];
		final double [][][] layers =         new double [numTiles][][];
		final double [][][] layers_initial = new double [numTiles][][];
		final Thread[] threads = ImageDtt.newThreadArray(threadsMax);
@@ -743,21 +750,23 @@ public class TileProcessor {
									}

									if (periods_match) {
										fund_per[0][nTile] = merged_list.get(0).disparity;
										fund_per[1][nTile] = 0.5*(merged_list.get(2).disparity - merged_list.get(0).disparity);
										fund_per[nTile]=new double[4];
										fund_per[nTile][0] = merged_list.get(0).disparity;
										fund_per[nTile][1] = 0.5*(merged_list.get(2).disparity - merged_list.get(0).disparity);

										fund_per[2][nTile] = 0;
										fund_per[nTile][2] = 0;
										for (int i = 0; i <= min_num_periods; i++) {
											fund_per[2][nTile] += merged_list.get(i).getMaxStrength();
											fund_per[nTile][2] += merged_list.get(i).getMaxStrength();
										}
										fund_per[2][nTile] /= min_num_periods+1;
										fund_per[3][nTile] =ds_center_list.size();
										fund_per[nTile][2] /= min_num_periods+1;
										fund_per[nTile][3] =ds_center_list.size();
									}
									// remove later
								} else if (merged_list.size() == 1) { // unambiguous - mark with period == 0
									fund_per[0][nTile] = merged_list.get(0).disparity;
									fund_per[1][nTile] = 0.0;
									fund_per[2][nTile] = merged_list.get(0).getMaxStrength();
									//fund_per[nTile]=new double[4];
									//fund_per[nTile][0] = merged_list.get(0).disparity;
									//fund_per[nTile][1] = 0.0;
									//fund_per[nTile][2] = merged_list.get(0).getMaxStrength();
								}
							}
						}
@@ -779,7 +788,7 @@ public class TileProcessor {
					public void run() {
						for (int nTile = ai.getAndIncrement(); nTile < numTiles; nTile = ai.getAndIncrement()) { // periodic
							new_layers[nTile] = layers[nTile]; // shallow copy
							if ((fund_per[1][nTile] > 0.0) &&(layers[nTile] != null)){
							if ((fund_per[nTile] != null) && (layers[nTile] != null)){
								int tileX = nTile % tilesX;
								int tileY = nTile / tilesX;
								boolean dt = nTile == dbg_tile;
@@ -838,14 +847,14 @@ public class TileProcessor {
									}
									// update fund_per[3][nTile] = merged_list.size();
									// todo: remove later
									fund_per[3][nTile] = new_layers[nTile].length; // number of layers
									fund_per[nTile][3] = new_layers[nTile].length; // number of layers
									if (new_layers[nTile].length > 0) {
										fund_per[0][nTile] = new_layers[nTile][0][0]; // lowest disparity (keep period)
										fund_per[2][nTile] = new_layers[nTile][0][1]; // strength
										fund_per[nTile][0] = new_layers[nTile][0][0]; // lowest disparity (keep period)
										fund_per[nTile][2] = new_layers[nTile][0][1]; // strength
									} else {
										fund_per[0][nTile] = 0;
										fund_per[1][nTile] = 0;
										fund_per[2][nTile] = 0;
										fund_per[nTile][0] = 0.0;
										fund_per[nTile][1] = 0.0;
										fund_per[nTile][2] = 0.0;
									}
								}
							}
@@ -860,10 +869,16 @@ public class TileProcessor {
			if (debugLevel > 0) {
				System.out.println("Filtering periodics: pass="+nPass+", removed "+mods_ai.get() );
				String [] dbg_titles= {"fundamental","period", "strength", "num_layers"};
				double [][] dbg_img = new double [4][numTiles];
				for (int n = 0; n < fund_per.length; n++) {
					for (int i = 0; i < dbg_img.length; i++) {
						dbg_img[i][n]= (fund_per[n] == null) ? Double.NaN : fund_per[n][i];
					}
				}
				(new showDoubleFloatArrays()).showArrays(
						fund_per,
						dbg_img,
						getTilesX(),
						fund_per[0].length/getTilesX(),
						dbg_img[0].length/getTilesX(),
						true,
						"PERIODIC-"+nPass,
						dbg_titles);