Commit a7c6fce6 authored by Andrey Filippov's avatar Andrey Filippov

More cleanup

parent 4d7174ad
...@@ -4699,7 +4699,7 @@ public class TexturedModel { ...@@ -4699,7 +4699,7 @@ public class TexturedModel {
final int tilesX = width/transform_size; final int tilesX = width/transform_size;
final int tilesY = img_size/width/transform_size; final int tilesY = img_size/width/transform_size;
final int tiles = tilesX * tilesY; final int tiles = tilesX * tilesY;
final int dbg_tile = 4123; final int dbg_tile = -4123;
final int dbg_slice = 0; final int dbg_slice = 0;
final Thread[] threads = ImageDtt.newThreadArray(THREADS_MAX); final Thread[] threads = ImageDtt.newThreadArray(THREADS_MAX);
final AtomicInteger ai = new AtomicInteger(0); final AtomicInteger ai = new AtomicInteger(0);
...@@ -5757,71 +5757,64 @@ public class TexturedModel { ...@@ -5757,71 +5757,64 @@ public class TexturedModel {
final TpTask[][][] tp_tasks_ref, // reference tasks for each slice to get offsets final TpTask[][][] tp_tasks_ref, // reference tasks for each slice to get offsets
final String dbg_prefix) { final String dbg_prefix) {
final double var_radius = 1.5; // 3.5; // for variance filter of the combo disparity final double var_radius = 1.5; // 3.5; // for variance filter of the combo disparity
final double dir_radius = 1.5; // averaging inter-sensor variance to view behind obstacles
final double try_dir_var = 20.0; // try directional if the intersensor variance exceeds this value
final int dir_num_start = 7; // start with this number of consecutive sensors
final int dir_num_restart = 5; // restart (from best direction) with this number of consecutive sensors
final double dir_worsen_rel = 0.15; // add more sensors until variance grows by this relative
final double dir_var_max = 15.0; // do not add more sensors if the variance would exceed this
final double fg_max_inter = 200; // temporary disable 40.0; // Trim FG tile if inter variance exceeds
final double fg_max_rel = 2.0; // Trim FG tile if inter variance to same variance exceeds
final double min_edge_variance = 20.0; // minimal FG edge variance (trim outside)
final int min_neibs = 2; // remove pixel clusters with less neighbors
final int trim_grow = 4;
final int trim_shrink = 2;
final int trim_edge = 5; // trim FG edges - pixels from edge if tile center has no texture (2 for 1pix with diagonal)
final int trim_edge_center = 2; // required number of texture pixels in the 2x2 tile center to keep edge
final int edge_transparent = 2;
final double edge_weight = 0.7;
final int max_neib_lev = clt_parameters.tex_max_neib_lev; // 2; // 1 - single tiles layer around, 2 - two layers final int max_neib_lev = clt_parameters.tex_max_neib_lev; // 2; // 1 - single tiles layer around, 2 - two layers
final int num_slices = sensor_texture.length;
final int transform_size = clt_parameters.transform_size;
final int width = tilesX * transform_size;
final int img_size = sensor_texture[0][0].length;
final int height = img_size/width;
final double [][] gcombo_texture = // now always calculate as it has lower noise
(combo_texture_in != null) ?
combo_texture_in :
getComboTexture (sensor_texture);
////// double [][][] dbg_out = (dbg_prefix != null) ? new double [6][][] : null;
// boolean [][][] dbg_bool = (dbg_prefix != null) ? new boolean [5][][] : null;
// New processing
final double seed_inter = 150; // 120; // 150; final double seed_inter = 150; // 120; // 150;
final double seed_same_fz = 6.5; // 13; // seed_inter = 50.0; final double seed_same_fz = 6.5; // 13; // seed_inter = 50.0;
final double seed_fom = 2.0; // 1.9; // 1.2; final double seed_fom = 2.0; // 1.9; // 1.2;
final double trim_inter_fz = 5.0; // 13.0; final double trim_inter_fz = 5.0; // 13.0;
final double trim_fom = 0.5; // 0.8; // 1.3; // 1.8; // 1.2; // 0.8; // 0.4; // 0.7; final double trim_fom = 0.5; // 0.8; // 1.3; // 1.8; // 1.2; // 0.8; // 0.4; // 0.7;
// scale down fom for pixels near high-variance VAR_SAME // scale down fom for pixels near high-variance VAR_SAME
final double trim_fom_threshold = 120.0; // count only pixels with VAR_SAME > this value final double trim_fom_threshold = 120.0; // count only pixels with VAR_SAME > this value
final double trim_fom_boost = 5; // boost high-varinace values that exceed threshold final double trim_fom_boost = 5; // boost high-varinace values that exceed threshold
final double trim_fom_blur = 10.0; // divide trim_fom array by blurred version to reduce over sky sharp edge final double trim_fom_blur = 10.0; // divide trim_fom array by blurred version to reduce over sky sharp edge
// Sure values to set unconditionally transparent and unconditionally opaque FG // Sure values to set unconditionally transparent and unconditionally opaque FG
final double seed_fom_sure = 5.0; final double seed_fom_sure = 5.0;
final double seed_inter_sure = 150.0; // 13.0; final double seed_inter_sure = 150.0; // 13.0;
final double trim_fom_sure = 10; // 2.0; temporary disabling it final double trim_fom_sure = 10; // 2.0; temporary disabling it
final double min_incr = 100; // temporary disable // 5; // 20.0; // 0.5; // only for sky? final double min_incr = 100; // temporary disable // 5; // 20.0; // 0.5; // only for sky?
// final double thr_same = 16; // 20; // minimal value of vars_same to block propagation
// final double thr_ratio = 2.5; // 3.0; // minimal value of vars_same/vars_inter to block propagation
final int trim_grow_pix = transform_size * 3; // 3*transform_size?
final int min_neibs_alpha = 1; // minimal neighbors to keep alpha final int min_neibs_alpha = 1; // minimal neighbors to keep alpha
final int grow_alpha = 0; // 2; // grow alpha selection final int grow_alpha = 0; // 2; // grow alpha selection
final double alphaOverlapTolerance = 0.0; // exact match only final double alphaOverlapTolerance = 0.0; // exact match only
final int reduce_has_bg_grow = 2; // 0 - exactly half tile (between strong and weak) final int reduce_has_bg_grow = 2; // 0 - exactly half tile (between strong and weak)
// final int strong_bg_overlap = 1;
final double occlusion_frac = 0.9; final double occlusion_frac = 0.9;
final double occlusion_min_disp = 0.3; // do not calculate occlusions for smaller disparity difference final double occlusion_min_disp = 0.3; // do not calculate occlusions for smaller disparity difference
// Processing BG and FG trim
final boolean en_cut = true; // enable change FG pixel to transparent from opaque
final boolean en_patch = true; // enable change FG pixel to opaque from transparent
final double fg_disp_diff = 1.0; // do not consider obscuring too close BG (1 pix or more?)
final int min_sensors = 4; // minimal number of sensors visible from the FG pixel
final double weight_neib = 3.0; // 2.0; // 1.0; // weight of same neighbors - add to cost multiplied by num_neib-4
final double weight_bg = 0.9; // 0.8; // 1.0; // 15.0/16; // 1.0; // weight of BG cost relative to the FG one
final double best_dir_frac = 0.6; // for BG - use this fraction of all sensors in the best direction
final double cost_min = 1.0; // minimal absolute value of the total cost to make changes
final int max_trim_iterations = 10;
// for fillOcclusionsNaN:
final int num_fill_passes = 100;
final double max_fill_change = 0.1;
final int num_slices = sensor_texture.length;
final int transform_size = clt_parameters.transform_size;
final int width = tilesX * transform_size;
final int img_size = sensor_texture[0][0].length;
final int height = img_size/width;
final int trim_grow_pix = transform_size * 3; // 3*transform_size?
final int fill_grow = 6*transform_size;
final double [][] gcombo_texture = // now always calculate as it has lower noise
(combo_texture_in != null) ?
combo_texture_in :
getComboTexture (sensor_texture);
boolean [][][] tile_booleans = getTileBooleans( boolean [][][] tile_booleans = getTileBooleans(
slice_disparities, // final double [][] slice_disparities, slice_disparities, // final double [][] slice_disparities,
slice_border_int, // final int [][] slice_border_int, // not extended slice_border_int, // final int [][] slice_border_int, // not extended
...@@ -5870,7 +5863,6 @@ public class TexturedModel { ...@@ -5870,7 +5863,6 @@ public class TexturedModel {
dbg_titles); dbg_titles);
} }
boolean [][] has_bg_pix = halfStrong( // select pixels between weak and strong boolean [][] has_bg_pix = halfStrong( // select pixels between weak and strong
tile_booleans[TILE_HAS_BG_WEAK], // final boolean [][] weak_tiles, tile_booleans[TILE_HAS_BG_WEAK], // final boolean [][] weak_tiles,
tile_booleans[TILE_HAS_BG_STRONG], // final boolean [][] strong_tiles, tile_booleans[TILE_HAS_BG_STRONG], // final boolean [][] strong_tiles,
...@@ -5921,9 +5913,7 @@ public class TexturedModel { ...@@ -5921,9 +5913,7 @@ public class TexturedModel {
seed_inter, // final double seed_inter, // = 150; seed_inter, // final double seed_inter, // = 150;
width); // final int width) width); // final int width)
// copy unbound_alpha here for debug // copy unbound_alpha here for debug
// boolean [][] unbound_alpha =
//if (dbg_prefix != null) {
final boolean [][] trim_seeds = (dbg_prefix != null)? new boolean [num_slices][] : null; final boolean [][] trim_seeds = (dbg_prefix != null)? new boolean [num_slices][] : null;
if (dbg_prefix != null) { if (dbg_prefix != null) {
for (int i = 0; i < num_slices; i++) { for (int i = 0; i < num_slices; i++) {
...@@ -6045,22 +6035,7 @@ public class TexturedModel { ...@@ -6045,22 +6035,7 @@ public class TexturedModel {
width, // final int width, width, // final int width,
transform_size); // final int transform_size) transform_size); // final int transform_size)
// Processing BG // Processing BG and FG trim
// final double occlusion_frac = 0.9;
// final double occlusion_min_disp = 0.3; // do not calculate occlusions for smaller disparity difference
final boolean en_cut = true; // enable change FG pixel to transparent from opaque
final boolean en_patch = true; // enable change FG pixel to opaque from transparent
final double fg_disp_diff = 1.0; // do not consider obscuring too close BG (1 pix or more?)
final int min_sensors = 4; // minimal number of sensors visible from the FG pixel
final double weight_neib = 3.0; // 2.0; // 1.0; // weight of same neighbors - add to cost multiplied by num_neib-4
final double weight_bg = 0.9; // 0.8; // 1.0; // 15.0/16; // 1.0; // weight of BG cost relative to the FG one
// final double weight_bg2 = 0.0; // fraction of BG variance cost (1-weight_bg2) - the BG true one
final double best_dir_frac = 0.6; // for BG - use this fraction of all sensors in the best direction
final double cost_min = 1.0; // minimal absolute value of the total cost to make changes
int max_trim_iterations = 10;
int [][] occluded_map = null; int [][] occluded_map = null;
double [][] dbg_occluded_map = null; double [][] dbg_occluded_map = null;
double [][] occluded_textures = null; double [][] occluded_textures = null;
...@@ -6071,14 +6046,12 @@ public class TexturedModel { ...@@ -6071,14 +6046,12 @@ public class TexturedModel {
int [][] debug_stats = (dbg_prefix != null) ? new int [trim_pixels.length][] : null; int [][] debug_stats = (dbg_prefix != null) ? new int [trim_pixels.length][] : null;
boolean [][] debug_alpha = (dbg_prefix != null) ? new boolean [trim_pixels.length][] : null; boolean [][] debug_alpha = (dbg_prefix != null) ? new boolean [trim_pixels.length][] : null;
boolean [][] trim_tiles = getTrimTiles( boolean [][] trim_tiles = getTrimTiles(
trim_pixels, // boolean [][] trim_pix, trim_pixels, // boolean [][] trim_pix,
width, // final int width, width, // final int width,
transform_size); // final int transform_size); transform_size); // final int transform_size);
int updated_tiles = 0; int updated_tiles = 0;
for (int niter = 0; niter < max_trim_iterations; niter++) { for (int niter = 0; niter < max_trim_iterations; niter++) {
occluded_map = getOccludedMap( occluded_map = getOccludedMap(
channel_pixel_offsets, // final double [][][][] channel_pixel_offsets, channel_pixel_offsets, // final double [][][][] channel_pixel_offsets,
unbound_alpha, // final boolean [][] alpha_pix, unbound_alpha, // final boolean [][] alpha_pix,
...@@ -6090,23 +6063,19 @@ public class TexturedModel { ...@@ -6090,23 +6063,19 @@ public class TexturedModel {
occlusion_min_disp, // final double occlusion_min_disp, occlusion_min_disp, // final double occlusion_min_disp,
width, // final int width, width, // final int width,
transform_size); // final int transform_size); transform_size); // final int transform_size);
dbg_occluded_map = (dbg_prefix == null)? null:debugOccludedMap(occluded_map); dbg_occluded_map = (dbg_prefix == null)? null:debugOccludedMap(occluded_map);
occluded_textures = combineTexturesWithOcclusions( occluded_textures = combineTexturesWithOcclusions(
sensor_texture, // final double [][][] sensor_texture, sensor_texture, // final double [][][] sensor_texture,
gcombo_texture, // final double [][] combo_texture, gcombo_texture, // final double [][] combo_texture,
occluded_map); // final int [][] occluded_map); occluded_map); // final int [][] occluded_map);
occluded_filled_textures = fillOcclusionsNaN( occluded_filled_textures = fillOcclusionsNaN(
gcombo_texture, // final double [][] combo_texture, gcombo_texture, // final double [][] combo_texture,
occluded_textures, // final double [][] combo_occluded_texture, occluded_textures, // final double [][] combo_occluded_texture,
6*transform_size, // final int grow, fill_grow, // final int grow,
100, // final int num_passes, num_fill_passes, // final int num_passes,
0.001, // final double max_change, max_fill_change, // final double max_change,
width); // final int width) width); // final int width)
// Occluded textures should be calculated after updateFgAlpha(), so skip updateFgAlpha() during last iteration
// TODO: Break here from the cycle after updating BG
if (niter < (max_trim_iterations-1)) { if (niter < (max_trim_iterations-1)) {
sure_transparent = getTrimSeeds( sure_transparent = getTrimSeeds(
trim_pixels, // final boolean [][] trim_pix, // pixels that may be trimmed trim_pixels, // final boolean [][] trim_pix, // pixels that may be trimmed
...@@ -6132,7 +6101,6 @@ public class TexturedModel { ...@@ -6132,7 +6101,6 @@ public class TexturedModel {
channel_pixel_offsets, // final double [][][][] channel_pixel_offsets, channel_pixel_offsets, // final double [][][][] channel_pixel_offsets,
occluded_filled_textures, // final double [][] textures, occluded_filled_textures, // final double [][] textures,
unbound_alpha, // final boolean [][] alpha_pix, unbound_alpha, // final boolean [][] alpha_pix,
// gcombo_texture, // final double [][] combo_texture,
sensor_texture, // final double [][][] sensor_texture, sensor_texture, // final double [][][] sensor_texture,
occluded_map, // final int [][] occluded_map, // bitmap of blocked by FG sensors occluded_map, // final int [][] occluded_map, // bitmap of blocked by FG sensors
min_sensors, // final int min_sensors, // minimal number of sensors visible from the FG pixel min_sensors, // final int min_sensors, // minimal number of sensors visible from the FG pixel
...@@ -6149,7 +6117,6 @@ public class TexturedModel { ...@@ -6149,7 +6117,6 @@ public class TexturedModel {
// other parameters // other parameters
weight_neib, // final double weight_neib, // weight of same neighbors weight_neib, // final double weight_neib, // weight of same neighbors
weight_bg, // final double weight_bg, // weight of BG cost relative to the FG one weight_bg, // final double weight_bg, // weight of BG cost relative to the FG one
// weight_bg2, // final double weight_bg2, // fraction of BG variance cost (1-weight_bg2) - the BG true one
best_dir_frac, // final double best_dir_frac, // for BG - use this fraction of all sensors in the best direction best_dir_frac, // final double best_dir_frac, // for BG - use this fraction of all sensors in the best direction
cost_min, // final double cost_min, // minimal absolute value of the total cost to make changes cost_min, // final double cost_min, // minimal absolute value of the total cost to make changes
debug_costs, // final double [][] debug_cost, // if not null, should be double [nslices][] - will return costs/NaN debug_costs, // final double [][] debug_cost, // if not null, should be double [nslices][] - will return costs/NaN
...@@ -6158,6 +6125,10 @@ public class TexturedModel { ...@@ -6158,6 +6125,10 @@ public class TexturedModel {
transform_size); // final int transform_size){ transform_size); // final int transform_size){
} }
if (dbg_prefix != null) { if (dbg_prefix != null) {
// TODO:
// 1. Display alpha mod sequence
// 2. occluded_map improvements (similar as in updateFgAlpha) -
// remove some "unreliable" sensors
for (int nslice = 0; nslice < debug_stats.length; nslice++) { for (int nslice = 0; nslice < debug_stats.length; nslice++) {
System.out.println (String.format("#%02d: %5d added, %5d removed (total %5d) opaque FG pixels", System.out.println (String.format("#%02d: %5d added, %5d removed (total %5d) opaque FG pixels",
nslice, debug_stats[nslice][0], debug_stats[nslice][1], debug_stats[nslice][0]+debug_stats[nslice][1])); nslice, debug_stats[nslice][0], debug_stats[nslice][1], debug_stats[nslice][0]+debug_stats[nslice][1]));
...@@ -6223,50 +6194,10 @@ public class TexturedModel { ...@@ -6223,50 +6194,10 @@ public class TexturedModel {
final double [] fix_bg_pix = new double [img_size]; final double [] fix_bg_pix = new double [img_size];
final double [] fix_same_pix = new double [img_size]; final double [] fix_same_pix = new double [img_size];
final double [] trim_alpha_pix = new double [img_size]; final double [] trim_alpha_pix = new double [img_size];
final double [] grad_abs_over_same = new double [img_size];
final double [] ridges_pix = new double [img_size];
final double [] ridges2_pix = new double [img_size];
final TileNeibs pn = new TileNeibs(width, img_size/width);
for (int i = 0; i <img_size; i++) {
grad_abs_over_same[i] = vars[4][nslice][i] / (vars[0][nslice][i]+seed_same_fz);
}
final double min_over1 = 0.0;
final double max_rel_slope = 0.05; // ) { // maximal ridge slope relative to the value if >0
boolean [] ridges = pn.getRidges(
grad_abs_over_same, // final double [] value,
null, // trim_pixels [nslice], // final boolean [] en,
min_over1, // final double min_over)
max_rel_slope); // final double max_rel_slope) // maximal ridge slope relative to the value if >0
final double min_over2 = 0.0;
boolean [] ridges2 = pn.getRidges(
vars[4][nslice], // final double [] value,
null, // trim_pixels [nslice], // final boolean [] en,
min_over2, // final double min_over)
max_rel_slope); // final double max_rel_slope) // maximal ridge slope relative to the value if >0
double [] ridges3_pix = pn.getRidgeValue(
vars[4][nslice], // final double [] value,
null, // final boolean [] en,
var_radius); // final double var_radius) now 3.5
double [] ridges4_pix = pn.getRidgeValue(
grad_abs_over_same, // final double [] value,
null, // final boolean [] en,
var_radius); // final double var_radius) now 3.5
for (int i = 0; i <img_size; i++) { for (int i = 0; i <img_size; i++) {
vars_ratio[i] = vars[0][nslice][i]/(vars[1][nslice][i]+trim_inter_fz);
vars_fom[i] = vars[1][nslice][i]/(vars[0][nslice][i]+seed_same_fz); vars_fom[i] = vars[1][nslice][i]/(vars[0][nslice][i]+seed_same_fz);
if (Double.isNaN(vars_ratio[i])) vars_ratio[i] = 0; if (Double.isNaN(vars_ratio[i])) vars_ratio[i] = 0;
if (Double.isNaN(vars_fom[i])) vars_fom[i] = 0; if (Double.isNaN(vars_fom[i])) vars_fom[i] = 0;
for (int k = 0; k < vars.length; k++) {
if (Double.isNaN(vars[k][nslice][i])) vars[k][nslice][i] = 0;
}
ridges_pix[i] =
(trim_pixels [nslice][i]? 1.0:0.0) +
(ridges [i]? 2.0:0.0);
ridges2_pix[i] =
(trim_pixels [nslice][i]? 1.0:0.0) +
(ridges2 [i]? 2.0:0.0);
half_pix[i] = half_pix[i] =
(has_bg_pix [nslice][i]? 1.0:0.0) + (has_bg_pix [nslice][i]? 1.0:0.0) +
(is_fg_pix [nslice][i]? 2.0:0.0); (is_fg_pix [nslice][i]? 2.0:0.0);
...@@ -6308,12 +6239,6 @@ public class TexturedModel { ...@@ -6308,12 +6239,6 @@ public class TexturedModel {
vars[2][nslice], vars[2][nslice],
vars[3][nslice], vars[3][nslice],
vars[4][nslice], vars[4][nslice],
grad_abs_over_same,
ridges_pix,
ridges2_pix,
ridges3_pix,
ridges4_pix,
vars_ratio,
trim_fom_pix[nslice], // normalized by blurred trim_fom_pix[nslice], // normalized by blurred
fom_dbg[0][nslice], fom_dbg[0][nslice],
...@@ -6331,7 +6256,6 @@ public class TexturedModel { ...@@ -6331,7 +6256,6 @@ public class TexturedModel {
fix_bg_pix, fix_bg_pix,
fix_same_pix, fix_same_pix,
trim_alpha_pix, trim_alpha_pix,
dbg_occluded_map[nslice], dbg_occluded_map[nslice],
gcombo_texture[nslice], gcombo_texture[nslice],
occluded_filled_textures[nslice], // put before occluded_textures to compare with gcombo_texture occluded_filled_textures[nslice], // put before occluded_textures to compare with gcombo_texture
...@@ -6359,12 +6283,6 @@ public class TexturedModel { ...@@ -6359,12 +6283,6 @@ public class TexturedModel {
"GRAD_X", "GRAD_X",
"GRAD_Y", "GRAD_Y",
"GRAD_ABS", "GRAD_ABS",
"GRAD_NORM",
"RIDGES_NORM",
"RIDGES_ABS",
"RIDGES_ANA_NORM",
"RIDGES_ANA_ABS",
"TRIM_FOM", // same/(inter+trim_inter_fz)
"TRIM_FOM_NORM", // same/(inter+trim_inter_fz) normalized by blurred version "TRIM_FOM_NORM", // same/(inter+trim_inter_fz) normalized by blurred version
"TRIM_FOM_INI", // initial fom "TRIM_FOM_INI", // initial fom
"TRIM_FOM_FIN", // final fom "TRIM_FOM_FIN", // final fom
...@@ -6381,7 +6299,6 @@ public class TexturedModel { ...@@ -6381,7 +6299,6 @@ public class TexturedModel {
"FIX_HAS_BG", "FIX_HAS_BG",
"FIX_SAME", "FIX_SAME",
"TRIM_ALPHA", "TRIM_ALPHA",
"OCCLUSIONS_MAP", "OCCLUSIONS_MAP",
"COMBO_TEXTURE", "COMBO_TEXTURE",
"OCCLUDED_FILLED_TEXTURES", "OCCLUDED_FILLED_TEXTURES",
......
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