Commit 9dacd956 authored by Andrey Filippov's avatar Andrey Filippov

Next working snapshot

parent f2fc939c
...@@ -2148,7 +2148,8 @@ public class CuasMotion { ...@@ -2148,7 +2148,8 @@ public class CuasMotion {
String dbg_suffix, String dbg_suffix,
int dbg_iter_index, // to generate different image names for different iteration to simplify "save as" images int dbg_iter_index, // to generate different image names for different iteration to simplify "save as" images
int debugLevel) { int debugLevel) {
final int max_index_dbg = 3;// 5; // // show images for the first iterations only // debugLevel = -1; // DEBUG OFF
// final int max_index_dbg = 3;// 5; // // show images for the first iterations only
final int tileSize = GPUTileProcessor.DTT_SIZE; // 8 pixels final int tileSize = GPUTileProcessor.DTT_SIZE; // 8 pixels
final int tilesX = cuasMotion.tilesX; final int tilesX = cuasMotion.tilesX;
final int width = cuasMotion.gpu_max_width; final int width = cuasMotion.gpu_max_width;
...@@ -2166,11 +2167,22 @@ public class CuasMotion { ...@@ -2166,11 +2167,22 @@ public class CuasMotion {
final int corr_offset_eff = corr_offset * Math.max(1, Math.min(corr_offset_scale, corr_pairs_ref / corr_offset)); final int corr_offset_eff = corr_offset * Math.max(1, Math.min(corr_offset_scale, corr_pairs_ref / corr_offset));
// Hard-coded debug selectors: set >= 0 to enable per-scan/per-tile visualisation // Hard-coded debug selectors: set >= 0 to enable per-scan/per-tile visualisation
final int dbg_nseq = 36; // 28; // 97; // 40; // 41; // 157; // -(116); // 57; // 20; // -1; final int dbg_nseq = 166; // 36; // 28; // 97; // 40; // 41; // 157; // -(116); // 57; // 20; // -1;
final int dbg_tile = 51+38*80; // 54+38*80; //52+38*80; // 50+38*80; // 55+38*80; // -(17 + 33*80); // 48+32*80; // 50+38*80; // -1; final int dbg_tile = 55+38*80; // 51+38*80; // 54+38*80; //52+38*80; // 50+38*80; // 55+38*80; // -(17 + 33*80); // 48+32*80; // 50+38*80; // -1;
final int corr_offset_scale_eff = corr_offset_eff / corr_offset; // actual scale after clamping final int corr_offset_scale_eff = corr_offset_eff / corr_offset; // actual scale after clamping
if ((dbg_nseq < 0) || (dbg_nseq >= targets_nonoverlap.length) || (dbg_tile < 0) || (dbg_tile >= targets_nonoverlap[dbg_nseq].length)) {
debugLevel = -2;
}
if (debugLevel >= 0) {
// See if it contains specified dbg_nseq, dbg_tile
double[] target = targets_nonoverlap[dbg_nseq][dbg_tile];
if (target == null || Double.isNaN(target[CuasMotionLMA.RSLT_X])) {
debugLevel = -3;
};
}
if (debugLevel >= 0) { if (debugLevel >= 0) {
System.out.println("refineMotionVectors(): corr_offset="+corr_offset+", corr_offset_scale="+corr_offset_scale+ System.out.println("\nrefineMotionVectors(): dbg_iter_index="+dbg_iter_index+", corr_offset="+corr_offset+", corr_offset_scale="+corr_offset_scale+
", corr_offset_eff="+corr_offset_eff+ ", corr_offset_eff="+corr_offset_eff+
(corr_offset_scale_eff != corr_offset_scale ? " (CLAMPED from "+corr_offset_scale+" to "+corr_offset_scale_eff+")" : "")+ (corr_offset_scale_eff != corr_offset_scale ? " (CLAMPED from "+corr_offset_scale+" to "+corr_offset_scale_eff+")" : "")+
", dbg_nseq="+dbg_nseq+", dbg_tile="+dbg_tile); ", dbg_nseq="+dbg_nseq+", dbg_tile="+dbg_tile);
...@@ -2196,7 +2208,8 @@ public class CuasMotion { ...@@ -2196,7 +2208,8 @@ public class CuasMotion {
for (int i = 0; i < mask_kernel.length; i++) { for (int i = 0; i < mask_kernel.length; i++) {
mask_kernel[i] *= scale_w; mask_kernel[i] *= scale_w;
} }
if ((dbg_nseq >= 0 || dbg_tile >= 0) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) { // if ((dbg_nseq >= 0 || dbg_tile >= 0) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) {
if ((dbg_nseq >= 0 || dbg_tile >= 0) && (debugLevel >= 0)) {
ShowDoubleFloatArrays.showArrays(mask_kernel.clone(), mside, mside, ShowDoubleFloatArrays.showArrays(mask_kernel.clone(), mside, mside,
"refineMotionVectors-mask-boost"+recalc_mv_boost+"-r0_" + recalc_mv_r0 + "-r1_" + recalc_mv_r1+"-niter"+dbg_iter_index+dbg_suffix); "refineMotionVectors-mask-boost"+recalc_mv_boost+"-r0_" + recalc_mv_r0 + "-r1_" + recalc_mv_r1+"-niter"+dbg_iter_index+dbg_suffix);
} }
...@@ -2291,7 +2304,7 @@ public class CuasMotion { ...@@ -2291,7 +2304,7 @@ public class CuasMotion {
ImageDtt.startAndJoin(threads); ImageDtt.startAndJoin(threads);
// Debug: show full fmin..fmax masked frame stack for dbg_nseq // Debug: show full fmin..fmax masked frame stack for dbg_nseq
if ((nseq == dbg_nseq) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) { if ((nseq == dbg_nseq) && (debugLevel >= 0)) { // && (dbg_iter_index<= max_index_dbg)) {
int fcount = fmax_alloc - fmin_alloc + 1; int fcount = fmax_alloc - fmin_alloc + 1;
float[][] stack_slices = new float[fcount][]; float[][] stack_slices = new float[fcount][];
String[] stack_titles = new String[fcount]; String[] stack_titles = new String[fcount];
...@@ -2304,7 +2317,7 @@ public class CuasMotion { ...@@ -2304,7 +2317,7 @@ public class CuasMotion {
ShowDoubleFloatArrays.showArrays(stack_slices, width, height, true, ShowDoubleFloatArrays.showArrays(stack_slices, width, height, true,
"refineMotionVectors-boost"+recalc_mv_boost+"-masked-nseq" + nseq+"-niter"+dbg_iter_index+dbg_suffix, stack_titles); "refineMotionVectors-boost"+recalc_mv_boost+"-masked-nseq" + nseq+"-niter"+dbg_iter_index+dbg_suffix, stack_titles);
} }
if ((nseq == dbg_nseq) && (debugLevel >= 0) && (dbg_iter_index<= max_index_dbg)) { if ((nseq == dbg_nseq) && (debugLevel >= 0)) { // && (dbg_iter_index<= max_index_dbg)) {
int fcount = fmax_alloc - fmin_alloc + 1; int fcount = fmax_alloc - fmin_alloc + 1;
float[][] stack_slices = new float[fcount][]; float[][] stack_slices = new float[fcount][];
String[] stack_titles = new String[fcount]; String[] stack_titles = new String[fcount];
...@@ -2372,6 +2385,7 @@ public class CuasMotion { ...@@ -2372,6 +2385,7 @@ public class CuasMotion {
target[CuasMotionLMA.RSLT_VX] += scaled_dvx; target[CuasMotionLMA.RSLT_VX] += scaled_dvx;
target[CuasMotionLMA.RSLT_VY] += scaled_dvy; target[CuasMotionLMA.RSLT_VY] += scaled_dvy;
target[CuasMotionLMA.RSLT_VSTR] = vector_field[ntile][INDX_STR]; target[CuasMotionLMA.RSLT_VSTR] = vector_field[ntile][INDX_STR];
target[CuasMotionLMA.RSLT_VBOOST] = recalc_mv_boost;
target[CuasMotionLMA.RSLT_VCORR] = Math.sqrt(scaled_dvx*scaled_dvx + scaled_dvy*scaled_dvy); target[CuasMotionLMA.RSLT_VCORR] = Math.sqrt(scaled_dvx*scaled_dvx + scaled_dvy*scaled_dvy);
if ((mv_diff_max > 0) && (target[CuasMotionLMA.RSLT_VCORR] > mv_diff_max) && !(target[CuasMotionLMA.RSLT_FAIL] > 0 )) { if ((mv_diff_max > 0) && (target[CuasMotionLMA.RSLT_VCORR] > mv_diff_max) && !(target[CuasMotionLMA.RSLT_FAIL] > 0 )) {
target[CuasMotionLMA.RSLT_FAIL] = CuasMotionLMA.FAIL_VCORR; // set when? target[CuasMotionLMA.RSLT_FAIL] = CuasMotionLMA.FAIL_VCORR; // set when?
...@@ -2380,7 +2394,7 @@ public class CuasMotion { ...@@ -2380,7 +2394,7 @@ public class CuasMotion {
} }
} }
// Debug: CORR2D overview — one slice per keyframe, same layout as *CORR2D.tiff // Debug: CORR2D overview — one slice per keyframe, same layout as *CORR2D.tiff
if (show_dbg && (corr2d_ref != null) && (dbg_iter_index<= max_index_dbg)) { if (show_dbg && (corr2d_ref != null)) { // && (dbg_iter_index<= max_index_dbg)) {
final int corr_size = 2 * GPUTileProcessor.DTT_SIZE - 1; // 15 final int corr_size = 2 * GPUTileProcessor.DTT_SIZE - 1; // 15
String[] slice_titles_ref = new String[targets_nonoverlap.length]; String[] slice_titles_ref = new String[targets_nonoverlap.length];
for (int i = 0; i < targets_nonoverlap.length; i++) { for (int i = 0; i < targets_nonoverlap.length; i++) {
...@@ -5947,7 +5961,7 @@ public class CuasMotion { ...@@ -5947,7 +5961,7 @@ public class CuasMotion {
int ntile_amax0 = TileNeibs.getAmaxTile( int ntile_amax0 = TileNeibs.getAmaxTile(
pix_tile); //double [] data) pix_tile); //double [] data)
if (lmax_hack_ridge > 0) { if (lmax_hack_ridge > 0) {
// disabled = new boolean[pix_tile.length]; // disabled = new boolean[pix_tile.length];
double thresh = pix_tile[ntile_amax0] * lmax_hack_ridge; double thresh = pix_tile[ntile_amax0] * lmax_hack_ridge;
for (int row=0; row < tile2; row++) { for (int row=0; row < tile2; row++) {
double s = 0; double s = 0;
...@@ -7887,6 +7901,8 @@ public class CuasMotion { ...@@ -7887,6 +7901,8 @@ public class CuasMotion {
} else { } else {
fpixels_refine = fpixels_tum; fpixels_refine = fpixels_tum;
} }
// TODO: Skip calculation of motion_sequence if it is not needed (data restored from the file)
if (target_sequence_multi == null) { if (target_sequence_multi == null) {
// final double [][][][] // final double [][][][]
target_sequence_multi = new double [num_seq][num_tiles][][]; target_sequence_multi = new double [num_seq][num_tiles][][];
...@@ -8245,6 +8261,8 @@ public class CuasMotion { ...@@ -8245,6 +8261,8 @@ public class CuasMotion {
double recalc_mv_max2 = clt_parameters.imp.cuas_recalc_mv_max2; double recalc_mv_max2 = clt_parameters.imp.cuas_recalc_mv_max2;
int recalc_mv_icorr = (int) Math.round(recalc_mv_corr); int recalc_mv_icorr = (int) Math.round(recalc_mv_corr);
int trim_first = clt_parameters.imp.cuas_trim_first;
double lma_rrms2 = clt_parameters.imp.cuas_lma_rrms2; // = 0.15; // Maximal relative to A rms. OK is when (RMS < cuas_lma_arms) || (RMS < cuas_lma_rrms * A) double lma_rrms2 = clt_parameters.imp.cuas_lma_rrms2; // = 0.15; // Maximal relative to A rms. OK is when (RMS < cuas_lma_arms) || (RMS < cuas_lma_rrms * A)
double lma_mina2 = clt_parameters.imp.cuas_lma_mina2; // = 1.0; // Minimal A (amplitude) double lma_mina2 = clt_parameters.imp.cuas_lma_mina2; // = 1.0; // Minimal A (amplitude)
if (debugLevel > -4) { if (debugLevel > -4) {
...@@ -8253,8 +8271,67 @@ public class CuasMotion { ...@@ -8253,8 +8271,67 @@ public class CuasMotion {
} }
// second pass, using non-centered targets // second pass, using non-centered targets
// optionally trim pass-one targets
if (trim_first > 0) {
if (debugLevel > -4) {
System.out.println("Will trim Phase One (noncentered) data to keep not more than "+clt_parameters.imp.cuas_trim_first+" tasrgets in each tile");
}
// evaluate scores here to reduce the number of attempts for centered targets
getEffectiveStrengthLMA(
target_sequence_multi, // final double [][][] target_coords, // LMA
target_strength, // final double target_strength,
target_frac, // final double [][] target_frac, // pairs - strength, minimal fraction for that strength
lma_rms, // final double lma_rms, // = 1.5; // Maximal RMS (should always match, regardless if A)
lma_arms, // final double lma_arms, // = 0.06; // Maximal absolute RMS (should match one of cuas_lma_arms OR cuas_lma_rrms (0.484)
lma_rrms, // final double lma_rrms, // = 0.15; // Maximal relative to A rms. OK is when (RMS < cuas_lma_arms) || (RMS < cuas_lma_rrms * A)
lma_mina, // final double lma_mina, // = 1.0; // Minimal A (amplitude)
lma_maxr, // final double lma_maxr, // = 5.0; // Minimal K (overshoot) = 3.0
lma_minr1, // final double lma_minr1,// = 1.0; // Minimal R1 (radius of positive peak)
lma_mink, // final double lma_mink, // = 0.0; // Minimal K (overshoot) = 1.0
lma_maxk, // final double lma_maxk, // = 5.0; // Minimal K (overshoot) = 3.0// final double lma_a2a,
lma_a2a, // final double lma_a2a,
0, // max_mismatch, // final double max_mismatch, apply only during final, when mismatch scores are calculated
slow_fast_mismatch,// final double slow_fast_mismatch, // // 1.5; allow larger mismatch between slow and fast
fail_mismatch, // final boolean fail_mismatch,
offcenter, // final double offcenter,
cuasMotion.getNoiseNeibs(), // final int [] noise_neibs,
// cuasMotion.getNoiseMap(), // final double [] noise_map,
// noisemax, // final double noise_max,
target_horizon, // final double lma_horizon, // horizon as maximal pixel Y
cuasMotion.tilesX); // final int tilesX,
getScore(
target_sequence_multi, // final double [][][] target_sequence, // modifies certain fields (scores)
factor_lim, // final double importance_limit,
factor_pow, // final double importance_power, // Raise each factor to this power before combining
score_coeff, // final double [] importance, // for now (each - squared?): [0] - Amplitude (A/A0), 1 - RMS (RMS0/RMS), 2 - RRMS((RMS/A0) / (RMS/A)
slow_score, // final double slow_score, // multiply total score for targets detected in slow target mode
cuasMotion.tilesX); // final int tilesX,
sortMultiTargets(
target_sequence_multi, // final double [][][][] target_multi,
true); // final boolean trim_nulls) { // trim null targets
trimTargets( // limit number of targets per tile
target_sequence_multi, // final double [][][][] target_multi,
trim_first); // final int max_targets) {
if (intermed_low) {
ImagePlus imp_new_scores = showTargetSequence(
target_sequence_multi, // double [][][][] vector_fields_sequence,
slice_titles, // String [] titles, // all slices*frames titles or just slice titles or null
model_prefix+"-ROUND_ONE_TRIMMED",// String title,
false, // good_only, // final boolean good_only,
false, // show_empty, // final boolean show_empty, // show scenes with no (valid) targets
!batch_mode, // boolean show,
cuasMotion.tilesX); // int tilesX) {
parentCLT.saveImagePlusInModelDirectory(imp_new_scores); // ImagePlus imp)
}
} else {
if (debugLevel > -4) {
System.out.println("Will not trim Phase One (noncentered) data, as clt_parameters.imp.cuas_trim_first="+clt_parameters.imp.cuas_trim_first);
}
}
int niter_lim = niter+ num_cycles; int niter_lim = niter+ num_cycles;
int iter_show1 = iter_show + niter; int iter_show1 = iter_show + niter;
/*
if (intermed_low && debug_more) { if (intermed_low && debug_more) {
ImagePlus imp_mv_strength = showTargetSequence( ImagePlus imp_mv_strength = showTargetSequence(
motion_sequence, // double [][][] vector_fields_sequence, motion_sequence, // double [][][] vector_fields_sequence,
...@@ -8264,6 +8341,7 @@ public class CuasMotion { ...@@ -8264,6 +8341,7 @@ public class CuasMotion {
cuasMotion.tilesX); // int tilesX) { cuasMotion.tilesX); // int tilesX) {
parentCLT.saveImagePlusInModelDirectory(imp_mv_strength); parentCLT.saveImagePlusInModelDirectory(imp_mv_strength);
} }
*/
int niter0 = niter; // for debugging, so (niter - niter0) will start from 0 int niter0 = niter; // for debugging, so (niter - niter0) will start from 0
for (; niter < niter_lim; niter++) { for (; niter < niter_lim; niter++) {
boolean good_only= false; boolean good_only= false;
...@@ -8347,10 +8425,12 @@ public class CuasMotion { ...@@ -8347,10 +8425,12 @@ public class CuasMotion {
} }
int num_new = 0; int num_new = 0;
double effective_boost = boost_accum_pairs; // default virtual exposure scale
if (accum_boosted) { if (accum_boosted) {
// Andrey 05/05/2026 moved here (earlier) so shiftAndRenderAccumulate() will use updated motion vector // Andrey 05/05/2026 moved here (earlier) so shiftAndRenderAccumulate() will use updated motion vector
// By Claude on 05/05/2026 — re-correlate with spatial mask around known target // By Claude on 05/05/2026 — re-correlate with spatial mask around known target
if (recalc_mv_num > 0) { if (recalc_mv_num > 0) {
effective_boost = recalc_mv_boost; // virtual exposure scale used in refineMotionVectors()
int corr_offset_scale = (int) Math.round(recalc_mv_boost); // TODO: promote to config or derive from other params int corr_offset_scale = (int) Math.round(recalc_mv_boost); // TODO: promote to config or derive from other params
refineMotionVectors( refineMotionVectors(
clt_parameters, // CLTParameters clt_parameters, clt_parameters, // CLTParameters clt_parameters,
...@@ -8418,7 +8498,8 @@ public class CuasMotion { ...@@ -8418,7 +8498,8 @@ public class CuasMotion {
frame0, // int frame0, frame0, // int frame0,
corr_inc, // int corr_inc, corr_inc, // int corr_inc,
half_accum_range, // int half_accum_range, half_accum_range, // int half_accum_range,
boost_accum_pairs, // double boost_accum_pairs, // next is switched before the default exposure boost (same as pass one) and recalc_mv_boost
effective_boost, // boost_accum_pairs, // double boost_accum_pairs,
smooth, // boolean smooth, smooth, // boolean smooth,
corr_offset, // int corr_offset, // interframe distance for correlation corr_offset, // int corr_offset, // interframe distance for correlation
save_filtered_high, // boolean save_filtered_high, save_filtered_high, // boolean save_filtered_high,
...@@ -8650,21 +8731,19 @@ public class CuasMotion { ...@@ -8650,21 +8731,19 @@ public class CuasMotion {
if (debugLevel > -4) { if (debugLevel > -4) {
System.out.println("Added "+num_new+" new tiles as good/bad at base iteration "+niter+"."); System.out.println("Added "+num_new+" new tiles as good/bad at base iteration "+niter+".");
} }
} if (save_filtered_low) {
if (save_filtered_low) { String title = model_prefix+"-ADDED_NEW_CENTERED_MULTI-n"+niter;
String title = model_prefix+"-ADDED_NEW_CENTERED_MULTI-n"+niter; title+="-BOOST"+effective_boost+"-NOBOOST"; // boost_accum_pairs;
if (boost_accum_pairs > 1.0) { ImagePlus imp_new_scores = showTargetSequence(
title+="-BOOST"+boost_accum_pairs; target_sequence_multi, // double [][][] vector_fields_sequence,
slice_titles, // String [] titles, // all slices*frames titles or just slice titles or null
title, // model_prefix+"-ADDED_NEW_CENTERED_MULTI-n"+niter,// String title,
good_only, // final boolean good_only,
show_empty, // final boolean show_empty, // show scenes with no (valid) targets
!batch_mode, // boolean show,
cuasMotion.tilesX); // int tilesX) {
parentCLT.saveImagePlusInModelDirectory(imp_new_scores); // ImagePlus imp)
} }
ImagePlus imp_new_scores = showTargetSequence(
target_sequence_multi, // double [][][] vector_fields_sequence,
slice_titles, // String [] titles, // all slices*frames titles or just slice titles or null
title, // model_prefix+"-ADDED_NEW_CENTERED_MULTI-n"+niter,// String title,
good_only, // final boolean good_only,
show_empty, // final boolean show_empty, // show scenes with no (valid) targets
!batch_mode, // boolean show,
cuasMotion.tilesX); // int tilesX) {
parentCLT.saveImagePlusInModelDirectory(imp_new_scores); // ImagePlus imp)
} }
if (num_new == 0) { if (num_new == 0) {
...@@ -9381,7 +9460,7 @@ public class CuasMotion { ...@@ -9381,7 +9460,7 @@ public class CuasMotion {
final int num_tiles = target_sequence_multi[0].length; final int num_tiles = target_sequence_multi[0].length;
// final double center_scale = 0.25*Math.PI/GPUTileProcessor.DTT_SIZE; // final double center_scale = 0.25*Math.PI/GPUTileProcessor.DTT_SIZE;
final double center_scale = 0.125*Math.PI/GPUTileProcessor.DTT_SIZE/offcenter; final double center_scale = 0.125*Math.PI/GPUTileProcessor.DTT_SIZE/offcenter;
final int dbg_tile = 51+38*80; // -(34 + 34*80); final int dbg_tile = -( 51+38*80); // -(34 + 34*80);
final Thread[] threads = ImageDtt.newThreadArray(); final Thread[] threads = ImageDtt.newThreadArray();
final AtomicInteger ai = new AtomicInteger(0); final AtomicInteger ai = new AtomicInteger(0);
for (int ithread = 0; ithread < threads.length; ithread++) { for (int ithread = 0; ithread < threads.length; ithread++) {
...@@ -9656,7 +9735,7 @@ public class CuasMotion { ...@@ -9656,7 +9735,7 @@ public class CuasMotion {
final int debugLevel) { final int debugLevel) {
final int num_seq = target_sequence_multi.length; final int num_seq = target_sequence_multi.length;
final int num_tiles = target_sequence_multi[0].length; final int num_tiles = target_sequence_multi[0].length;
boolean debug_now = (debugLevel > -5); // NEVER boolean debug_now = (debugLevel > 5); // NEVER
final int dbg_tile = debug_now ?(56+38*80) : -1; final int dbg_tile = debug_now ?(56+38*80) : -1;
final int dbg_seq0 = debug_now ? 197: -1; final int dbg_seq0 = debug_now ? 197: -1;
final int dbg_seq1 = debug_now ? 197: -1; final int dbg_seq1 = debug_now ? 197: -1;
......
...@@ -2809,7 +2809,7 @@ min_str_neib_fpn 0.35 ...@@ -2809,7 +2809,7 @@ min_str_neib_fpn 0.35
"Add to coordinates when looking for the mask value ."); "Add to coordinates when looking for the mask value .");
gd.addNumericField("Maximums separation fraction", this.cuas_lmax_fraction, 5,8,"", gd.addNumericField("Maximums separation fraction", this.cuas_lmax_fraction, 5,8,"",
"Check if local maximum is separated from tye surrounding by this fraction of the maximum value."); "Check if local maximum is separated from the surrounding by this fraction of the maximum value.");
gd.addNumericField("Hack for ridges", this.cuas_lmax_hack_ridge, 5,8,"", gd.addNumericField("Hack for ridges", this.cuas_lmax_hack_ridge, 5,8,"",
"Remove horizontal streaks, where average(abs()) for the line exceeds fraction of abs max(0.32-good max, 0.55 - bad max)."); "Remove horizontal streaks, where average(abs()) for the line exceeds fraction of abs max(0.32-good max, 0.55 - bad max).");
gd.addNumericField("Maximums separation radius", this.cuas_lmax_radius, 5,8,"pix", gd.addNumericField("Maximums separation radius", this.cuas_lmax_radius, 5,8,"pix",
...@@ -2987,7 +2987,7 @@ min_str_neib_fpn 0.35 ...@@ -2987,7 +2987,7 @@ min_str_neib_fpn 0.35
gd.addNumericField("Image range", this.cuas_input_range, 5,8,"10mK", gd.addNumericField("Image range", this.cuas_input_range, 5,8,"10mK",
"Dispaly pixel values range (1.0 ~= 10 mK)."); "Dispaly pixel values range (1.0 ~= 10 mK).");
gd.addCheckbox ("Scale images twice", this.cuas_scale2x, gd.addCheckbox ("Scale images twice", this.cuas_scale2x,
"Scale imges to 1280x1024 for higher annotation quality."); "Scale images to 1280x1024 for higher annotation quality.");
gd.addCheckbox ("Smooth background with runnong average", this.cuas_ra_background, gd.addCheckbox ("Smooth background with runnong average", this.cuas_ra_background,
"Apply running average to the background of the moving targets (false - use high-noise no-averaged images."); "Apply running average to the background of the moving targets (false - use high-noise no-averaged images.");
......
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