Loading src/main/java/CLTPass3d.java +5 −0 Original line number Diff line number Diff line Loading @@ -143,10 +143,15 @@ public class CLTPass3d{ superTiles = null; } public boolean [] getSelected(){ return selected; } public void setSelected (boolean [] selected) { this.selected = selected; } public void fixNaNDisparity() { fixNaNDisparity( Loading src/main/java/DisparityProcessor.java +54 −38 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ public class DisparityProcessor { 0b11111111, // middle 0b11110001, // middle right 0b00000111, // bottom left 0b11000111, // mottom middle 0b11000111, // bottom middle 0b11000001}; // bottom right TileProcessor tp; Loading @@ -48,12 +48,26 @@ public class DisparityProcessor { this.scale_dz_dx = scale_dz_dx; } public int [] getNeighbors( // creates neighbors mask from bitmask int [] surf_indices, int indx, int tilesX) { boolean [] selected = new boolean [surf_indices.length]; for (int i = 0; i < surf_indices.length; i++){ selected[i] = surf_indices[i] == indx; } return getNeighbors(selected, tilesX); } public int [] getNeighbors( // creates neighbors mask from bitmask boolean [] selected, int tilesX ) { int [] neibs = new int [selected.length]; int tilesY = selected.length/tilesX; final int [] dirs8 = {-tilesX, -tilesX + 1, 1, tilesX +1, tilesX, tilesX - 1, -1, -tilesX - 1}; for (int nTile = 0; nTile < selected.length; nTile++) { Loading @@ -68,7 +82,7 @@ public class DisparityProcessor { } else { tileType = 1; } } else if (tileX == (tilesX - 1)) { } else if (tileY == (tilesY - 1)) { if (tileX == 0){ tileType = 6; } else if (tileX == (tilesX - 1)) { Loading @@ -93,11 +107,10 @@ public class DisparityProcessor { } } else { neibs[nTile] = 0; neibs[nTile] = 0; // change to -1? } } return neibs; } public double [] dbgShowNeighbors( Loading @@ -114,7 +127,8 @@ public class DisparityProcessor { int height = tilesY * tile_size; double [] rslt = new double [width*height]; for (int i = 0; i < rslt.length; i++) rslt[i] = bgnd; for (int nTile = 0; nTile < neighbors.length; nTile++)if (selected[nTile]) { // if (neighbors[nTile] != 0) { for (int nTile = 0; nTile < neighbors.length; nTile++) { if ((neighbors [nTile] >=0) && ((selected == null) || selected[nTile])) { // if (neighbors[nTile] != 0) { int tileY = nTile / tilesX; int tileX = nTile % tilesX; for (int i = -1; i<= 1; i++){ Loading @@ -130,6 +144,7 @@ public class DisparityProcessor { } } } } return rslt; } Loading Loading @@ -267,7 +282,7 @@ public class DisparityProcessor { int numBorder = 0, numInternal = 0; for (int i = 0; i < len; i++){ if ((border != null) && border[i]) numBorder++; else if (selected[i]) numInternal++; // only if not border else if (selected[i] && (neighbors[i] >= 0)) numInternal++; // only if not border } final int numTiles = (((mask & 1) != 0)? numInternal : 0) + (((mask & 2) != 0)? numBorder : 0); final int [] indices = new int [numBorder + numInternal]; // internal excludes border Loading @@ -275,7 +290,7 @@ public class DisparityProcessor { for (int i = 0; i < len; i++){ if ((border != null) && border[i]){ if ((mask & 2) != 0) indices[indx++] = i; } else if (selected[i]) { } else if (selected[i] && (neighbors[i] >= 0)) { if ((mask & 1) != 0) indices[indx++] = i; } } Loading Loading @@ -329,7 +344,7 @@ public class DisparityProcessor { if ((debugLevel > 0) &&(nTile == dbg_tile)) { System.out.println("smoothDisparity() nTile = "+nTile+" tileX="+tileX+" tileY="+tileY); } for (int i = 0; i < dirs8.length; i++) if ((neighbors[nTile] & (1 << i)) !=0) { for (int i = 0; i < dirs8.length; i++) if ((neighbors[nTile] >= 0) && ((neighbors[nTile] & (1 << i)) != 0)) { double w = rigid8[i]; // no strength here strength[nTile + dirs8[i]] int dbg_dirs8 = nTile + dirs8[i]; double dbg_d = disp_data[0][nTile + dirs8[i]]; Loading Loading @@ -475,12 +490,12 @@ public class DisparityProcessor { final int len = disparity.length; int numTiles = 0; for (int i = 0; i < len; i++){ if (selected[i]) numTiles++; // only if not border if (selected[i] && (neighbors[i] >= 0)) numTiles++; // only if not border } final int [] indices = new int [numTiles]; // internal excludes border int indx = 0; for (int i = 0; i < len; i++){ if (selected[i]) { if (selected[i] && (neighbors[i] >= 0)) { indices[indx++] = i; } } Loading @@ -488,9 +503,6 @@ public class DisparityProcessor { final int tilesX = tp.getTilesX(); final int tilesY = tp.getTilesY(); final double [][] deriv3HV = new double [2][len]; // 4-th derivative [0] - horizontal, 1 - vertical // neighbors // final int [][] neib_data = {neighbors, new int [len]}; // final double [] k4_3 = { 1.0, -3.0, 3.0, -1.0}; // 3-rd final double [] k4_3 = {-1.0, 3.0, -3.0, 1.0}; // 3-rd final double [] k4_2 = {-1.0, 1.0, 1.0, -1.0}; // - 2-nd (average for 2 sides) final double [] k4 = (mode == 2)? k4_2 : k4_3; Loading @@ -504,6 +516,7 @@ public class DisparityProcessor { // int tileX = nTile - (tileY * tilesX); // double deriv4; int neib = neighbors[nTile]; if (neib < 0) neib = 0; // should not get here // try break horizontally (always - to the right) int b = (1 << 2); // "E" (right) int rb = (1 << 6); // "W" (left) Loading @@ -518,7 +531,7 @@ public class DisparityProcessor { if ((neib & rb) != 0) deriv += k4[0]*disparity[nTile - 1]; else if (extend_flat) deriv += k4[0]*disparity[nTile]; else break hor_label; if ((neighbors[nTile + 1] & b) != 0) deriv += k4[3]* disparity[nTile + 2]; if ((neighbors[nTile + 1] >=0) && ((neighbors[nTile + 1] & b) != 0)) deriv += k4[3]* disparity[nTile + 2]; else if (extend_flat) deriv += k4[3]* disparity[nTile + 1]; else break hor_label; switch (mode){ Loading Loading @@ -547,7 +560,7 @@ public class DisparityProcessor { if ((neib & rb) != 0) deriv += k4[0]*disparity[nTile - tilesX]; else if (extend_flat) deriv += k4[0]*disparity[nTile]; else break vert_label; if ((neighbors[nTile + tilesX] & b) != 0) deriv += k4[3]*disparity[nTile + 2 * tilesX]; if ((neighbors[nTile + + tilesX] >=0) && ((neighbors[nTile + tilesX] & b) != 0)) deriv += k4[3] * disparity[nTile + 2 * tilesX]; else if (extend_flat) deriv += k4[3] * disparity[nTile + tilesX]; else break vert_label; switch (mode){ Loading Loading @@ -624,6 +637,7 @@ public class DisparityProcessor { int tileY = nTile/tilesX; int tileX = nTile - (tileY * tilesX); int neib = neighbors_in[nTile]; if (neib < 0) neib = 0; if (Math.abs(deriv3HV[0][nTile]) >= break3) neib &= ~0b00001110; // break all right side if (Math.abs(deriv3HV[1][nTile]) >= break3) neib &= ~0b00111000; // break all down side if ((tileX > 0) && selected[nTile - 1] && (Math.abs(deriv3HV[0][nTile - 1]) >= break3)) neib &= ~0b11100000; // break all left side Loading Loading @@ -655,6 +669,7 @@ public class DisparityProcessor { int tileY = nTile/tilesX; int tileX = nTile - (tileY * tilesX); int neib = neighbors_in[nTile]; if (neib < 0) neib = 0; if (deriv3HV[0][nTile] >= break3) neib &= ~0b00001110; // break all right side if (deriv3HV[1][nTile] >= break3) neib &= ~0b00111000; // break all down side if ((tileX > 0) && selected[nTile - 1] && (deriv3HV[0][nTile - 1] >= break3)) neib &= ~0b11100000; // break all left side Loading Loading @@ -709,12 +724,12 @@ public class DisparityProcessor { final int len = disparity.length; int numTiles = 0; for (int i = 0; i < len; i++){ if (selected[i]) numTiles++; // only if not border if (selected[i] && (neighbors[i] >= 0)) numTiles++; // only if not border } final int [] indices = new int [numTiles]; // internal excludes border int indx = 0; for (int i = 0; i < len; i++){ if (selected[i]) { if (selected[i] && (neighbors[i] >= 0)) { indices[indx++] = i; } } Loading @@ -730,7 +745,7 @@ public class DisparityProcessor { int tileY = nTile/tilesX; int tileX = nTile - (tileY * tilesX); int neib = neighbors[nTile]; if (neib < 0) neib = 0; int b = (1 << 2); // "E" (right) if (((neib & b) == 0) && (tileX < (tilesX - 1) && selected[nTile + 1])) { if (Math.abs(disparity[nTile] - disparity[nTile + 1]) < maxDiffOrto){ Loading Loading @@ -806,12 +821,12 @@ public class DisparityProcessor { final int len = neighbors.length; int numTiles = 0; for (int i = 0; i < len; i++){ if (selected[i]) numTiles++; // only if not border if (selected[i] && (neighbors[i] >= 0)) numTiles++; // only if not border } final int [] indices = new int [numTiles]; // internal excludes border int indx = 0; for (int i = 0; i < len; i++){ if (selected[i]) { if (selected[i] && (neighbors[i] >= 0)) { indices[indx++] = i; } } Loading @@ -823,7 +838,7 @@ public class DisparityProcessor { for (int iTile = ai.getAndIncrement(); iTile < indices.length; iTile = ai.getAndIncrement()) { int nTile = indices[iTile]; int neib = neighbors[nTile]; if (neib < 0) neib = 0; if ( ((neib & (1 << 0)) != 0) && ((neighbors[nTile - tilesX] & (1 << 2)) != 0)){ Loading Loading @@ -943,6 +958,7 @@ public class DisparityProcessor { for (int ty = 0; ty < tilesY; ty++){ for (int tx = 0; tx < tilesX; tx++){ int neib = neighbors[ty * tilesX + tx]; if (neib < 0) neib = 0; int []cell = field[ty + 1][tx + 1]; if ( neib!= 0) { cell[0] = ((neib & NEIB_RIGHT) == 0)? FLD_EMPTY:FLD_CONN; Loading Loading @@ -1070,7 +1086,7 @@ public class DisparityProcessor { int numTilesAll = 0; // final boolean [] selectedAll = new boolean[len]; for (int i = 0; i < len; i++){ if (selected[i] || border[i]) { if ((selected[i] && (neighbors[i] >= 0)) || border[i]) { // selectedAll[i] = true; numTilesAll++; if (!border[i]) numTiles++; Loading @@ -1081,7 +1097,7 @@ public class DisparityProcessor { int indx = 0; int indxAll = 0; for (int i = 0; i < len; i++){ if (selected[i] || border[i]) { if ((selected[i] && (neighbors[i] >= 0)) || border[i]) { indicesAll[indxAll++] = i; if (!border[i]) indices[indx++] = i; } Loading Loading @@ -1204,7 +1220,7 @@ public class DisparityProcessor { * For each cluster returns 3 arrays: indiced of internal cells, indices of fixed border cells (alpha = 0, disparity fixed) * and floating border cells (alpha = 0, disparity - from neighbors) * @param diag_en true - 8 directions, false - only 4 orthogonal * @param neighbors array of per-cell bitmaps - which neighbors curtrent cell is connected to (+1 - to N, +2 - to NE,...+128 = to NW) * @param neighbors array of per-cell bitmaps - which neighbors current cell is connected to (+1 - to N, +2 - to NE,...+128 = to NW) * @param selected boolean array of celected (internal) cells * @param border boolean array of border cells (added for alpha) * @param threadsMax maximal number of threads for multi-threaded application Loading src/main/java/EyesisCorrectionParameters.java +44 −10 Original line number Diff line number Diff line Loading @@ -2152,16 +2152,26 @@ public class EyesisCorrectionParameters { public boolean plDbgMerge = true; // Combine 'other' plane with current public double plWorstWorsening = 1.0; // Worst case worsening after merge public boolean plMutualOnly = true; // keep only mutual links, remove weakest if conflict public boolean plFillSquares = true; // Add diagonals to full squares public boolean plCutCorners = true; // Add ortho to 45-degree corners public double plPull = .1; // Relative weight of original (measured) plane when combing with neighbors public int plIterations = 10; // Maximal number of smoothing iterations for each step public int plPrecision = 6; // Maximal step difference (1/power of 10) public boolean plFuse = true; // Fuse planes together (off for debug only) public boolean plKeepOrphans = true; // Keep unconnected supertiles public double plMinOrphan = 2.0; // Minimal strength unconnected supertiles to keep public double plSnapDisp = .2; // Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength public double plSnapDispAny = .2; // Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength public double plSnapStrengthAny = .2; // Maximal strength to fit any distance (if does not fit otherwise - treat as zero str4ength public double plSnapNegAny = .5; // Maximal negative disparity difference from the best match public double plSnapDispMax = .5; // Maximal (scaled by plDispNorm) disparity difference to snap to plane at low strength public double plSnapDispWeight = .5; // Maximal disparity diff. by weight product to snap to plane public int plSnapZeroMode = 1; // Zero strength snap mode: 0: no special treatment, 1 - strongest, 2 - farthest public boolean replaceWeakOutlayers = true; // false; // other debug images Loading Loading @@ -2407,16 +2417,22 @@ public class EyesisCorrectionParameters { properties.setProperty(prefix+"plWorstWorsening", this.plWorstWorsening +""); properties.setProperty(prefix+"plMutualOnly", this.plMutualOnly+""); properties.setProperty(prefix+"plFillSquares", this.plFillSquares+""); properties.setProperty(prefix+"plCutCorners", this.plCutCorners+""); properties.setProperty(prefix+"plPull", this.plPull +""); properties.setProperty(prefix+"plIterations", this.plIterations+""); properties.setProperty(prefix+"plPrecision", this.plPrecision+""); properties.setProperty(prefix+"plFuse", this.plFuse+""); properties.setProperty(prefix+"plKeepOrphans", this.plKeepOrphans+""); properties.setProperty(prefix+"plMinOrphan", this.plMinOrphan +""); properties.setProperty(prefix+"plSnapDisp", this.plSnapDisp +""); properties.setProperty(prefix+"plSnapDispAny", this.plSnapDispAny +""); properties.setProperty(prefix+"plSnapStrengthAny",this.plSnapStrengthAny +""); properties.setProperty(prefix+"plSnapNegAny", this.plSnapNegAny +""); properties.setProperty(prefix+"plSnapDispMax", this.plSnapDispMax +""); properties.setProperty(prefix+"plSnapDispWeight", this.plSnapDispWeight +""); properties.setProperty(prefix+"plSnapZeroMode", this.plSnapZeroMode+""); properties.setProperty(prefix+"show_ortho_combine", this.show_ortho_combine+""); properties.setProperty(prefix+"show_refine_supertiles", this.show_refine_supertiles+""); Loading Loading @@ -2652,16 +2668,22 @@ public class EyesisCorrectionParameters { if (properties.getProperty(prefix+"plWorstWorsening")!=null) this.plWorstWorsening=Double.parseDouble(properties.getProperty(prefix+"plWorstWorsening")); if (properties.getProperty(prefix+"plMutualOnly")!=null) this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly")); if (properties.getProperty(prefix+"plFillSquares")!=null) this.plFillSquares=Boolean.parseBoolean(properties.getProperty(prefix+"plFillSquares")); if (properties.getProperty(prefix+"plCutCorners")!=null) this.plCutCorners=Boolean.parseBoolean(properties.getProperty(prefix+"plCutCorners")); if (properties.getProperty(prefix+"plPull")!=null) this.plPull=Double.parseDouble(properties.getProperty(prefix+"plPull")); if (properties.getProperty(prefix+"plIterations")!=null) this.plIterations=Integer.parseInt(properties.getProperty(prefix+"plIterations")); if (properties.getProperty(prefix+"plPrecision")!=null) this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plPrecision")); if (properties.getProperty(prefix+"plFuse")!=null) this.plFuse=Boolean.parseBoolean(properties.getProperty(prefix+"plFuse")); if (properties.getProperty(prefix+"plKeepOrphans")!=null) this.plKeepOrphans=Boolean.parseBoolean(properties.getProperty(prefix+"plKeepOrphans")); if (properties.getProperty(prefix+"plMinOrphan")!=null) this.plMinOrphan=Double.parseDouble(properties.getProperty(prefix+"plMinOrphan")); if (properties.getProperty(prefix+"plSnapDisp")!=null) this.plSnapDisp=Double.parseDouble(properties.getProperty(prefix+"plSnapDisp")); if (properties.getProperty(prefix+"plSnapDispAny")!=null) this.plSnapDispAny=Double.parseDouble(properties.getProperty(prefix+"plSnapDispAny")); if (properties.getProperty(prefix+"plSnapStrengthAny")!=null) this.plSnapStrengthAny=Double.parseDouble(properties.getProperty(prefix+"plSnapStrengthAny")); if (properties.getProperty(prefix+"plSnapNegAny")!=null) this.plSnapNegAny=Double.parseDouble(properties.getProperty(prefix+"plSnapNegAny")); if (properties.getProperty(prefix+"plSnapDispMax")!=null) this.plSnapDispMax=Double.parseDouble(properties.getProperty(prefix+"plSnapDispMax")); if (properties.getProperty(prefix+"plSnapDispWeight")!=null) this.plSnapDispWeight=Double.parseDouble(properties.getProperty(prefix+"plSnapDispWeight")); if (properties.getProperty(prefix+"plSnapZeroMode")!=null) this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plSnapZeroMode")); if (properties.getProperty(prefix+"show_ortho_combine")!=null) this.show_ortho_combine=Boolean.parseBoolean(properties.getProperty(prefix+"show_ortho_combine")); if (properties.getProperty(prefix+"show_refine_supertiles")!=null) this.show_refine_supertiles=Boolean.parseBoolean(properties.getProperty(prefix+"show_refine_supertiles")); Loading Loading @@ -2919,6 +2941,9 @@ public class EyesisCorrectionParameters { gd.addNumericField("Worst case worsening after merge", this.plWorstWorsening, 6); gd.addCheckbox ("Keep only mutual links, remove weakest if conflict", this.plMutualOnly); gd.addCheckbox ("Add diagonals to full squares", this.plFillSquares); gd.addCheckbox ("Add ortho to 45-degree corners", this.plCutCorners); gd.addNumericField("Relative weight of original (measured) plane when combing with neighbors", this.plPull, 6); gd.addNumericField("Maximal number of smoothing iterations for each step", this.plIterations, 0); gd.addNumericField("Maximal step difference (1/power of 10)", this.plPrecision, 0); Loading @@ -2927,9 +2952,12 @@ public class EyesisCorrectionParameters { gd.addNumericField("Minimal strength unconnected supertiles to keep", this.plMinOrphan, 6); gd.addMessage ("--- Snap to planes ---"); gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength", this.plSnapDisp, 6); gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength", this.plSnapDispAny, 6); gd.addNumericField("Maximal strength to fit any distance (if does not fit otherwise - treat as zero strength", this.plSnapStrengthAny, 6); gd.addNumericField("Maximal negative disparity difference from the best match", this.plSnapNegAny, 6); gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at low strength", this.plSnapDispMax, 6); gd.addNumericField("Maximal disparity diff. by weight product to snap to plane", this.plSnapDispWeight, 6); gd.addNumericField("Zero strength snap mode: 0: no special treatment, 1 - strongest, 2 - farthest",this.plSnapZeroMode, 0); gd.addMessage ("--- Other debug images ---"); gd.addCheckbox ("Show 'ortho_combine'", this.show_ortho_combine); Loading Loading @@ -3174,16 +3202,22 @@ public class EyesisCorrectionParameters { this.plWorstWorsening= gd.getNextNumber(); this.plMutualOnly= gd.getNextBoolean(); this.plFillSquares= gd.getNextBoolean(); this.plCutCorners= gd.getNextBoolean(); this.plPull= gd.getNextNumber(); this.plIterations= (int) gd.getNextNumber(); this.plPrecision= (int) gd.getNextNumber(); this.plFuse= gd.getNextBoolean(); this.plKeepOrphans= gd.getNextBoolean(); this.plMinOrphan= gd.getNextNumber(); this.plSnapDisp= gd.getNextNumber(); this.plSnapDispAny= gd.getNextNumber(); this.plSnapStrengthAny= gd.getNextNumber(); this.plSnapNegAny= gd.getNextNumber(); this.plSnapDispMax= gd.getNextNumber(); this.plSnapDispWeight= gd.getNextNumber(); this.plSnapZeroMode= (int) gd.getNextNumber(); this.show_ortho_combine= gd.getNextBoolean(); this.show_refine_supertiles=gd.getNextBoolean(); Loading src/main/java/Eyesis_Correction.java +80 −2 Original line number Diff line number Diff line Loading @@ -507,6 +507,7 @@ private Panel panel1, addButton("CLT reset 3D", panelClt1, color_stop); addButton("CLT 3D", panelClt1, color_conf_process); addButton("CLT planes", panelClt1, color_conf_process); addButton("CLT OUT 3D", panelClt1, color_process); add(panelClt1); } Loading Loading @@ -4756,6 +4757,9 @@ private Panel panel1, UPDATE_STATUS, //final boolean updateStatus, DEBUG_LEVEL); //final int debugLevel); if (configPath!=null) { saveTimestampedProperties( // save config again configPath, // full path or null Loading @@ -4772,14 +4776,88 @@ private Panel panel1, System.out.println("QUAD_CLT is null, nothing to show"); return; } //"CLT planes" QUAD_CLT.showCLTPlanes( CLT_PARAMETERS, // EyesisCorrectionParameters.DCTParameters dct_parameters, THREADS_MAX, //final int threadsMax, // maximal number of threads to launch UPDATE_STATUS, //final boolean updateStatus, DEBUG_LEVEL); //final int debugLevel); return; } else if (label.equals("CLT OUT 3D")) { DEBUG_LEVEL=MASTER_DEBUG_LEVEL; EYESIS_CORRECTIONS.setDebug(DEBUG_LEVEL); if (QUAD_CLT == null){ System.out.println("QUAD_CLT is null, nothing to show (will add previous steps)"); return; } String configPath=null; if (EYESIS_CORRECTIONS.correctionsParameters.saveSettings) { configPath=EYESIS_CORRECTIONS.correctionsParameters.selectResultsDirectory( true, true); if (configPath==null){ String msg="No results directory selected, command aborted"; System.out.println("Warning: "+msg); IJ.showMessage("Warning",msg); return; } configPath+=Prefs.getFileSeparator()+"autoconfig"; try { saveTimestampedProperties( configPath, // full path or null null, // use as default directory if path==null true, PROPERTIES); } catch (Exception e){ String msg="Failed to save configuration to "+configPath+", command aborted"; System.out.println("Error: "+msg); IJ.showMessage("Error",msg); return; } } /* public boolean output3d( EyesisCorrectionParameters.CLTParameters clt_parameters, EyesisCorrectionParameters.ColorProcParameters colorProcParameters, EyesisCorrectionParameters.RGBParameters rgbParameters, final int threadsMax, // maximal number of threads to launch final boolean updateStatus, final int debugLevel) */ boolean OK = QUAD_CLT.output3d( CLT_PARAMETERS, // EyesisCorrectionParameters.DCTParameters dct_parameters, COLOR_PROC_PARAMETERS, //EyesisCorrectionParameters.ColorProcParameters colorProcParameters, RGB_PARAMETERS, //EyesisCorrectionParameters.RGBParameters rgbParameters, THREADS_MAX, //final int threadsMax, // maximal number of threads to launch UPDATE_STATUS, //final boolean updateStatus, DEBUG_LEVEL); //final int debugLevel); if (!OK) { String msg="Image data not initialized, run 'CLT 3D' command first"; System.out.println("Error: "+msg); IJ.showMessage("Error",msg); } /* if (configPath!=null) { saveTimestampedProperties( // save config again configPath, // full path or null null, // use as default directory if path==null true, PROPERTIES); } */ return; // // End of buttons code } Loading Loading
src/main/java/CLTPass3d.java +5 −0 Original line number Diff line number Diff line Loading @@ -143,10 +143,15 @@ public class CLTPass3d{ superTiles = null; } public boolean [] getSelected(){ return selected; } public void setSelected (boolean [] selected) { this.selected = selected; } public void fixNaNDisparity() { fixNaNDisparity( Loading
src/main/java/DisparityProcessor.java +54 −38 Original line number Diff line number Diff line Loading @@ -34,7 +34,7 @@ public class DisparityProcessor { 0b11111111, // middle 0b11110001, // middle right 0b00000111, // bottom left 0b11000111, // mottom middle 0b11000111, // bottom middle 0b11000001}; // bottom right TileProcessor tp; Loading @@ -48,12 +48,26 @@ public class DisparityProcessor { this.scale_dz_dx = scale_dz_dx; } public int [] getNeighbors( // creates neighbors mask from bitmask int [] surf_indices, int indx, int tilesX) { boolean [] selected = new boolean [surf_indices.length]; for (int i = 0; i < surf_indices.length; i++){ selected[i] = surf_indices[i] == indx; } return getNeighbors(selected, tilesX); } public int [] getNeighbors( // creates neighbors mask from bitmask boolean [] selected, int tilesX ) { int [] neibs = new int [selected.length]; int tilesY = selected.length/tilesX; final int [] dirs8 = {-tilesX, -tilesX + 1, 1, tilesX +1, tilesX, tilesX - 1, -1, -tilesX - 1}; for (int nTile = 0; nTile < selected.length; nTile++) { Loading @@ -68,7 +82,7 @@ public class DisparityProcessor { } else { tileType = 1; } } else if (tileX == (tilesX - 1)) { } else if (tileY == (tilesY - 1)) { if (tileX == 0){ tileType = 6; } else if (tileX == (tilesX - 1)) { Loading @@ -93,11 +107,10 @@ public class DisparityProcessor { } } else { neibs[nTile] = 0; neibs[nTile] = 0; // change to -1? } } return neibs; } public double [] dbgShowNeighbors( Loading @@ -114,7 +127,8 @@ public class DisparityProcessor { int height = tilesY * tile_size; double [] rslt = new double [width*height]; for (int i = 0; i < rslt.length; i++) rslt[i] = bgnd; for (int nTile = 0; nTile < neighbors.length; nTile++)if (selected[nTile]) { // if (neighbors[nTile] != 0) { for (int nTile = 0; nTile < neighbors.length; nTile++) { if ((neighbors [nTile] >=0) && ((selected == null) || selected[nTile])) { // if (neighbors[nTile] != 0) { int tileY = nTile / tilesX; int tileX = nTile % tilesX; for (int i = -1; i<= 1; i++){ Loading @@ -130,6 +144,7 @@ public class DisparityProcessor { } } } } return rslt; } Loading Loading @@ -267,7 +282,7 @@ public class DisparityProcessor { int numBorder = 0, numInternal = 0; for (int i = 0; i < len; i++){ if ((border != null) && border[i]) numBorder++; else if (selected[i]) numInternal++; // only if not border else if (selected[i] && (neighbors[i] >= 0)) numInternal++; // only if not border } final int numTiles = (((mask & 1) != 0)? numInternal : 0) + (((mask & 2) != 0)? numBorder : 0); final int [] indices = new int [numBorder + numInternal]; // internal excludes border Loading @@ -275,7 +290,7 @@ public class DisparityProcessor { for (int i = 0; i < len; i++){ if ((border != null) && border[i]){ if ((mask & 2) != 0) indices[indx++] = i; } else if (selected[i]) { } else if (selected[i] && (neighbors[i] >= 0)) { if ((mask & 1) != 0) indices[indx++] = i; } } Loading Loading @@ -329,7 +344,7 @@ public class DisparityProcessor { if ((debugLevel > 0) &&(nTile == dbg_tile)) { System.out.println("smoothDisparity() nTile = "+nTile+" tileX="+tileX+" tileY="+tileY); } for (int i = 0; i < dirs8.length; i++) if ((neighbors[nTile] & (1 << i)) !=0) { for (int i = 0; i < dirs8.length; i++) if ((neighbors[nTile] >= 0) && ((neighbors[nTile] & (1 << i)) != 0)) { double w = rigid8[i]; // no strength here strength[nTile + dirs8[i]] int dbg_dirs8 = nTile + dirs8[i]; double dbg_d = disp_data[0][nTile + dirs8[i]]; Loading Loading @@ -475,12 +490,12 @@ public class DisparityProcessor { final int len = disparity.length; int numTiles = 0; for (int i = 0; i < len; i++){ if (selected[i]) numTiles++; // only if not border if (selected[i] && (neighbors[i] >= 0)) numTiles++; // only if not border } final int [] indices = new int [numTiles]; // internal excludes border int indx = 0; for (int i = 0; i < len; i++){ if (selected[i]) { if (selected[i] && (neighbors[i] >= 0)) { indices[indx++] = i; } } Loading @@ -488,9 +503,6 @@ public class DisparityProcessor { final int tilesX = tp.getTilesX(); final int tilesY = tp.getTilesY(); final double [][] deriv3HV = new double [2][len]; // 4-th derivative [0] - horizontal, 1 - vertical // neighbors // final int [][] neib_data = {neighbors, new int [len]}; // final double [] k4_3 = { 1.0, -3.0, 3.0, -1.0}; // 3-rd final double [] k4_3 = {-1.0, 3.0, -3.0, 1.0}; // 3-rd final double [] k4_2 = {-1.0, 1.0, 1.0, -1.0}; // - 2-nd (average for 2 sides) final double [] k4 = (mode == 2)? k4_2 : k4_3; Loading @@ -504,6 +516,7 @@ public class DisparityProcessor { // int tileX = nTile - (tileY * tilesX); // double deriv4; int neib = neighbors[nTile]; if (neib < 0) neib = 0; // should not get here // try break horizontally (always - to the right) int b = (1 << 2); // "E" (right) int rb = (1 << 6); // "W" (left) Loading @@ -518,7 +531,7 @@ public class DisparityProcessor { if ((neib & rb) != 0) deriv += k4[0]*disparity[nTile - 1]; else if (extend_flat) deriv += k4[0]*disparity[nTile]; else break hor_label; if ((neighbors[nTile + 1] & b) != 0) deriv += k4[3]* disparity[nTile + 2]; if ((neighbors[nTile + 1] >=0) && ((neighbors[nTile + 1] & b) != 0)) deriv += k4[3]* disparity[nTile + 2]; else if (extend_flat) deriv += k4[3]* disparity[nTile + 1]; else break hor_label; switch (mode){ Loading Loading @@ -547,7 +560,7 @@ public class DisparityProcessor { if ((neib & rb) != 0) deriv += k4[0]*disparity[nTile - tilesX]; else if (extend_flat) deriv += k4[0]*disparity[nTile]; else break vert_label; if ((neighbors[nTile + tilesX] & b) != 0) deriv += k4[3]*disparity[nTile + 2 * tilesX]; if ((neighbors[nTile + + tilesX] >=0) && ((neighbors[nTile + tilesX] & b) != 0)) deriv += k4[3] * disparity[nTile + 2 * tilesX]; else if (extend_flat) deriv += k4[3] * disparity[nTile + tilesX]; else break vert_label; switch (mode){ Loading Loading @@ -624,6 +637,7 @@ public class DisparityProcessor { int tileY = nTile/tilesX; int tileX = nTile - (tileY * tilesX); int neib = neighbors_in[nTile]; if (neib < 0) neib = 0; if (Math.abs(deriv3HV[0][nTile]) >= break3) neib &= ~0b00001110; // break all right side if (Math.abs(deriv3HV[1][nTile]) >= break3) neib &= ~0b00111000; // break all down side if ((tileX > 0) && selected[nTile - 1] && (Math.abs(deriv3HV[0][nTile - 1]) >= break3)) neib &= ~0b11100000; // break all left side Loading Loading @@ -655,6 +669,7 @@ public class DisparityProcessor { int tileY = nTile/tilesX; int tileX = nTile - (tileY * tilesX); int neib = neighbors_in[nTile]; if (neib < 0) neib = 0; if (deriv3HV[0][nTile] >= break3) neib &= ~0b00001110; // break all right side if (deriv3HV[1][nTile] >= break3) neib &= ~0b00111000; // break all down side if ((tileX > 0) && selected[nTile - 1] && (deriv3HV[0][nTile - 1] >= break3)) neib &= ~0b11100000; // break all left side Loading Loading @@ -709,12 +724,12 @@ public class DisparityProcessor { final int len = disparity.length; int numTiles = 0; for (int i = 0; i < len; i++){ if (selected[i]) numTiles++; // only if not border if (selected[i] && (neighbors[i] >= 0)) numTiles++; // only if not border } final int [] indices = new int [numTiles]; // internal excludes border int indx = 0; for (int i = 0; i < len; i++){ if (selected[i]) { if (selected[i] && (neighbors[i] >= 0)) { indices[indx++] = i; } } Loading @@ -730,7 +745,7 @@ public class DisparityProcessor { int tileY = nTile/tilesX; int tileX = nTile - (tileY * tilesX); int neib = neighbors[nTile]; if (neib < 0) neib = 0; int b = (1 << 2); // "E" (right) if (((neib & b) == 0) && (tileX < (tilesX - 1) && selected[nTile + 1])) { if (Math.abs(disparity[nTile] - disparity[nTile + 1]) < maxDiffOrto){ Loading Loading @@ -806,12 +821,12 @@ public class DisparityProcessor { final int len = neighbors.length; int numTiles = 0; for (int i = 0; i < len; i++){ if (selected[i]) numTiles++; // only if not border if (selected[i] && (neighbors[i] >= 0)) numTiles++; // only if not border } final int [] indices = new int [numTiles]; // internal excludes border int indx = 0; for (int i = 0; i < len; i++){ if (selected[i]) { if (selected[i] && (neighbors[i] >= 0)) { indices[indx++] = i; } } Loading @@ -823,7 +838,7 @@ public class DisparityProcessor { for (int iTile = ai.getAndIncrement(); iTile < indices.length; iTile = ai.getAndIncrement()) { int nTile = indices[iTile]; int neib = neighbors[nTile]; if (neib < 0) neib = 0; if ( ((neib & (1 << 0)) != 0) && ((neighbors[nTile - tilesX] & (1 << 2)) != 0)){ Loading Loading @@ -943,6 +958,7 @@ public class DisparityProcessor { for (int ty = 0; ty < tilesY; ty++){ for (int tx = 0; tx < tilesX; tx++){ int neib = neighbors[ty * tilesX + tx]; if (neib < 0) neib = 0; int []cell = field[ty + 1][tx + 1]; if ( neib!= 0) { cell[0] = ((neib & NEIB_RIGHT) == 0)? FLD_EMPTY:FLD_CONN; Loading Loading @@ -1070,7 +1086,7 @@ public class DisparityProcessor { int numTilesAll = 0; // final boolean [] selectedAll = new boolean[len]; for (int i = 0; i < len; i++){ if (selected[i] || border[i]) { if ((selected[i] && (neighbors[i] >= 0)) || border[i]) { // selectedAll[i] = true; numTilesAll++; if (!border[i]) numTiles++; Loading @@ -1081,7 +1097,7 @@ public class DisparityProcessor { int indx = 0; int indxAll = 0; for (int i = 0; i < len; i++){ if (selected[i] || border[i]) { if ((selected[i] && (neighbors[i] >= 0)) || border[i]) { indicesAll[indxAll++] = i; if (!border[i]) indices[indx++] = i; } Loading Loading @@ -1204,7 +1220,7 @@ public class DisparityProcessor { * For each cluster returns 3 arrays: indiced of internal cells, indices of fixed border cells (alpha = 0, disparity fixed) * and floating border cells (alpha = 0, disparity - from neighbors) * @param diag_en true - 8 directions, false - only 4 orthogonal * @param neighbors array of per-cell bitmaps - which neighbors curtrent cell is connected to (+1 - to N, +2 - to NE,...+128 = to NW) * @param neighbors array of per-cell bitmaps - which neighbors current cell is connected to (+1 - to N, +2 - to NE,...+128 = to NW) * @param selected boolean array of celected (internal) cells * @param border boolean array of border cells (added for alpha) * @param threadsMax maximal number of threads for multi-threaded application Loading
src/main/java/EyesisCorrectionParameters.java +44 −10 Original line number Diff line number Diff line Loading @@ -2152,16 +2152,26 @@ public class EyesisCorrectionParameters { public boolean plDbgMerge = true; // Combine 'other' plane with current public double plWorstWorsening = 1.0; // Worst case worsening after merge public boolean plMutualOnly = true; // keep only mutual links, remove weakest if conflict public boolean plFillSquares = true; // Add diagonals to full squares public boolean plCutCorners = true; // Add ortho to 45-degree corners public double plPull = .1; // Relative weight of original (measured) plane when combing with neighbors public int plIterations = 10; // Maximal number of smoothing iterations for each step public int plPrecision = 6; // Maximal step difference (1/power of 10) public boolean plFuse = true; // Fuse planes together (off for debug only) public boolean plKeepOrphans = true; // Keep unconnected supertiles public double plMinOrphan = 2.0; // Minimal strength unconnected supertiles to keep public double plSnapDisp = .2; // Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength public double plSnapDispAny = .2; // Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength public double plSnapStrengthAny = .2; // Maximal strength to fit any distance (if does not fit otherwise - treat as zero str4ength public double plSnapNegAny = .5; // Maximal negative disparity difference from the best match public double plSnapDispMax = .5; // Maximal (scaled by plDispNorm) disparity difference to snap to plane at low strength public double plSnapDispWeight = .5; // Maximal disparity diff. by weight product to snap to plane public int plSnapZeroMode = 1; // Zero strength snap mode: 0: no special treatment, 1 - strongest, 2 - farthest public boolean replaceWeakOutlayers = true; // false; // other debug images Loading Loading @@ -2407,16 +2417,22 @@ public class EyesisCorrectionParameters { properties.setProperty(prefix+"plWorstWorsening", this.plWorstWorsening +""); properties.setProperty(prefix+"plMutualOnly", this.plMutualOnly+""); properties.setProperty(prefix+"plFillSquares", this.plFillSquares+""); properties.setProperty(prefix+"plCutCorners", this.plCutCorners+""); properties.setProperty(prefix+"plPull", this.plPull +""); properties.setProperty(prefix+"plIterations", this.plIterations+""); properties.setProperty(prefix+"plPrecision", this.plPrecision+""); properties.setProperty(prefix+"plFuse", this.plFuse+""); properties.setProperty(prefix+"plKeepOrphans", this.plKeepOrphans+""); properties.setProperty(prefix+"plMinOrphan", this.plMinOrphan +""); properties.setProperty(prefix+"plSnapDisp", this.plSnapDisp +""); properties.setProperty(prefix+"plSnapDispAny", this.plSnapDispAny +""); properties.setProperty(prefix+"plSnapStrengthAny",this.plSnapStrengthAny +""); properties.setProperty(prefix+"plSnapNegAny", this.plSnapNegAny +""); properties.setProperty(prefix+"plSnapDispMax", this.plSnapDispMax +""); properties.setProperty(prefix+"plSnapDispWeight", this.plSnapDispWeight +""); properties.setProperty(prefix+"plSnapZeroMode", this.plSnapZeroMode+""); properties.setProperty(prefix+"show_ortho_combine", this.show_ortho_combine+""); properties.setProperty(prefix+"show_refine_supertiles", this.show_refine_supertiles+""); Loading Loading @@ -2652,16 +2668,22 @@ public class EyesisCorrectionParameters { if (properties.getProperty(prefix+"plWorstWorsening")!=null) this.plWorstWorsening=Double.parseDouble(properties.getProperty(prefix+"plWorstWorsening")); if (properties.getProperty(prefix+"plMutualOnly")!=null) this.plMutualOnly=Boolean.parseBoolean(properties.getProperty(prefix+"plMutualOnly")); if (properties.getProperty(prefix+"plFillSquares")!=null) this.plFillSquares=Boolean.parseBoolean(properties.getProperty(prefix+"plFillSquares")); if (properties.getProperty(prefix+"plCutCorners")!=null) this.plCutCorners=Boolean.parseBoolean(properties.getProperty(prefix+"plCutCorners")); if (properties.getProperty(prefix+"plPull")!=null) this.plPull=Double.parseDouble(properties.getProperty(prefix+"plPull")); if (properties.getProperty(prefix+"plIterations")!=null) this.plIterations=Integer.parseInt(properties.getProperty(prefix+"plIterations")); if (properties.getProperty(prefix+"plPrecision")!=null) this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plPrecision")); if (properties.getProperty(prefix+"plFuse")!=null) this.plFuse=Boolean.parseBoolean(properties.getProperty(prefix+"plFuse")); if (properties.getProperty(prefix+"plKeepOrphans")!=null) this.plKeepOrphans=Boolean.parseBoolean(properties.getProperty(prefix+"plKeepOrphans")); if (properties.getProperty(prefix+"plMinOrphan")!=null) this.plMinOrphan=Double.parseDouble(properties.getProperty(prefix+"plMinOrphan")); if (properties.getProperty(prefix+"plSnapDisp")!=null) this.plSnapDisp=Double.parseDouble(properties.getProperty(prefix+"plSnapDisp")); if (properties.getProperty(prefix+"plSnapDispAny")!=null) this.plSnapDispAny=Double.parseDouble(properties.getProperty(prefix+"plSnapDispAny")); if (properties.getProperty(prefix+"plSnapStrengthAny")!=null) this.plSnapStrengthAny=Double.parseDouble(properties.getProperty(prefix+"plSnapStrengthAny")); if (properties.getProperty(prefix+"plSnapNegAny")!=null) this.plSnapNegAny=Double.parseDouble(properties.getProperty(prefix+"plSnapNegAny")); if (properties.getProperty(prefix+"plSnapDispMax")!=null) this.plSnapDispMax=Double.parseDouble(properties.getProperty(prefix+"plSnapDispMax")); if (properties.getProperty(prefix+"plSnapDispWeight")!=null) this.plSnapDispWeight=Double.parseDouble(properties.getProperty(prefix+"plSnapDispWeight")); if (properties.getProperty(prefix+"plSnapZeroMode")!=null) this.plPrecision=Integer.parseInt(properties.getProperty(prefix+"plSnapZeroMode")); if (properties.getProperty(prefix+"show_ortho_combine")!=null) this.show_ortho_combine=Boolean.parseBoolean(properties.getProperty(prefix+"show_ortho_combine")); if (properties.getProperty(prefix+"show_refine_supertiles")!=null) this.show_refine_supertiles=Boolean.parseBoolean(properties.getProperty(prefix+"show_refine_supertiles")); Loading Loading @@ -2919,6 +2941,9 @@ public class EyesisCorrectionParameters { gd.addNumericField("Worst case worsening after merge", this.plWorstWorsening, 6); gd.addCheckbox ("Keep only mutual links, remove weakest if conflict", this.plMutualOnly); gd.addCheckbox ("Add diagonals to full squares", this.plFillSquares); gd.addCheckbox ("Add ortho to 45-degree corners", this.plCutCorners); gd.addNumericField("Relative weight of original (measured) plane when combing with neighbors", this.plPull, 6); gd.addNumericField("Maximal number of smoothing iterations for each step", this.plIterations, 0); gd.addNumericField("Maximal step difference (1/power of 10)", this.plPrecision, 0); Loading @@ -2927,9 +2952,12 @@ public class EyesisCorrectionParameters { gd.addNumericField("Minimal strength unconnected supertiles to keep", this.plMinOrphan, 6); gd.addMessage ("--- Snap to planes ---"); gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength", this.plSnapDisp, 6); gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at any strength", this.plSnapDispAny, 6); gd.addNumericField("Maximal strength to fit any distance (if does not fit otherwise - treat as zero strength", this.plSnapStrengthAny, 6); gd.addNumericField("Maximal negative disparity difference from the best match", this.plSnapNegAny, 6); gd.addNumericField("Maximal (scaled by plDispNorm) disparity difference to snap to plane at low strength", this.plSnapDispMax, 6); gd.addNumericField("Maximal disparity diff. by weight product to snap to plane", this.plSnapDispWeight, 6); gd.addNumericField("Zero strength snap mode: 0: no special treatment, 1 - strongest, 2 - farthest",this.plSnapZeroMode, 0); gd.addMessage ("--- Other debug images ---"); gd.addCheckbox ("Show 'ortho_combine'", this.show_ortho_combine); Loading Loading @@ -3174,16 +3202,22 @@ public class EyesisCorrectionParameters { this.plWorstWorsening= gd.getNextNumber(); this.plMutualOnly= gd.getNextBoolean(); this.plFillSquares= gd.getNextBoolean(); this.plCutCorners= gd.getNextBoolean(); this.plPull= gd.getNextNumber(); this.plIterations= (int) gd.getNextNumber(); this.plPrecision= (int) gd.getNextNumber(); this.plFuse= gd.getNextBoolean(); this.plKeepOrphans= gd.getNextBoolean(); this.plMinOrphan= gd.getNextNumber(); this.plSnapDisp= gd.getNextNumber(); this.plSnapDispAny= gd.getNextNumber(); this.plSnapStrengthAny= gd.getNextNumber(); this.plSnapNegAny= gd.getNextNumber(); this.plSnapDispMax= gd.getNextNumber(); this.plSnapDispWeight= gd.getNextNumber(); this.plSnapZeroMode= (int) gd.getNextNumber(); this.show_ortho_combine= gd.getNextBoolean(); this.show_refine_supertiles=gd.getNextBoolean(); Loading
src/main/java/Eyesis_Correction.java +80 −2 Original line number Diff line number Diff line Loading @@ -507,6 +507,7 @@ private Panel panel1, addButton("CLT reset 3D", panelClt1, color_stop); addButton("CLT 3D", panelClt1, color_conf_process); addButton("CLT planes", panelClt1, color_conf_process); addButton("CLT OUT 3D", panelClt1, color_process); add(panelClt1); } Loading Loading @@ -4756,6 +4757,9 @@ private Panel panel1, UPDATE_STATUS, //final boolean updateStatus, DEBUG_LEVEL); //final int debugLevel); if (configPath!=null) { saveTimestampedProperties( // save config again configPath, // full path or null Loading @@ -4772,14 +4776,88 @@ private Panel panel1, System.out.println("QUAD_CLT is null, nothing to show"); return; } //"CLT planes" QUAD_CLT.showCLTPlanes( CLT_PARAMETERS, // EyesisCorrectionParameters.DCTParameters dct_parameters, THREADS_MAX, //final int threadsMax, // maximal number of threads to launch UPDATE_STATUS, //final boolean updateStatus, DEBUG_LEVEL); //final int debugLevel); return; } else if (label.equals("CLT OUT 3D")) { DEBUG_LEVEL=MASTER_DEBUG_LEVEL; EYESIS_CORRECTIONS.setDebug(DEBUG_LEVEL); if (QUAD_CLT == null){ System.out.println("QUAD_CLT is null, nothing to show (will add previous steps)"); return; } String configPath=null; if (EYESIS_CORRECTIONS.correctionsParameters.saveSettings) { configPath=EYESIS_CORRECTIONS.correctionsParameters.selectResultsDirectory( true, true); if (configPath==null){ String msg="No results directory selected, command aborted"; System.out.println("Warning: "+msg); IJ.showMessage("Warning",msg); return; } configPath+=Prefs.getFileSeparator()+"autoconfig"; try { saveTimestampedProperties( configPath, // full path or null null, // use as default directory if path==null true, PROPERTIES); } catch (Exception e){ String msg="Failed to save configuration to "+configPath+", command aborted"; System.out.println("Error: "+msg); IJ.showMessage("Error",msg); return; } } /* public boolean output3d( EyesisCorrectionParameters.CLTParameters clt_parameters, EyesisCorrectionParameters.ColorProcParameters colorProcParameters, EyesisCorrectionParameters.RGBParameters rgbParameters, final int threadsMax, // maximal number of threads to launch final boolean updateStatus, final int debugLevel) */ boolean OK = QUAD_CLT.output3d( CLT_PARAMETERS, // EyesisCorrectionParameters.DCTParameters dct_parameters, COLOR_PROC_PARAMETERS, //EyesisCorrectionParameters.ColorProcParameters colorProcParameters, RGB_PARAMETERS, //EyesisCorrectionParameters.RGBParameters rgbParameters, THREADS_MAX, //final int threadsMax, // maximal number of threads to launch UPDATE_STATUS, //final boolean updateStatus, DEBUG_LEVEL); //final int debugLevel); if (!OK) { String msg="Image data not initialized, run 'CLT 3D' command first"; System.out.println("Error: "+msg); IJ.showMessage("Error",msg); } /* if (configPath!=null) { saveTimestampedProperties( // save config again configPath, // full path or null null, // use as default directory if path==null true, PROPERTIES); } */ return; // // End of buttons code } Loading