Loading src/main/java/com/elphel/imagej/cameras/CLTParameters.java +8 −2 Original line number Diff line number Diff line Loading @@ -414,6 +414,7 @@ public class CLTParameters { public int tex_subdiv_tiles = 4; // subdivide tiles to smaller triangles public int tex_sky_extra = 2; // additionally grow sky area (in layers) without marking as sky public int tex_sky_below = 10; // extend sky these tile rows below lowest public int tex_shrink_sky_pix = 4; // shrink background by pixels // gd.addMessage ("Triangular mesh"); public boolean tex_disp_hires_tri = true; // Display high resolution mesh Loading Loading @@ -1535,6 +1536,7 @@ public class CLTParameters { properties.setProperty(prefix+"tex_subdiv_tiles", this.tex_subdiv_tiles+""); // int properties.setProperty(prefix+"tex_sky_extra", this.tex_sky_extra+""); // int properties.setProperty(prefix+"tex_sky_below", this.tex_sky_below+""); // int properties.setProperty(prefix+"tex_shrink_sky_pix", this.tex_shrink_sky_pix+""); // int properties.setProperty(prefix+"tex_disp_hires_tri", this.tex_disp_hires_tri+""); // boolean properties.setProperty(prefix+"tex_dbg_scale_mesh", this.tex_dbg_scale_mesh+""); // int Loading Loading @@ -2531,6 +2533,7 @@ public class CLTParameters { if (properties.getProperty(prefix+"tex_subdiv_tiles")!=null) this.tex_subdiv_tiles=Integer.parseInt(properties.getProperty(prefix+"tex_subdiv_tiles")); if (properties.getProperty(prefix+"tex_sky_extra")!=null) this.tex_sky_extra=Integer.parseInt(properties.getProperty(prefix+"tex_sky_extra")); if (properties.getProperty(prefix+"tex_sky_below")!=null) this.tex_sky_below=Integer.parseInt(properties.getProperty(prefix+"tex_sky_below")); if (properties.getProperty(prefix+"tex_shrink_sky_pix")!=null) this.tex_shrink_sky_pix=Integer.parseInt(properties.getProperty(prefix+"tex_shrink_sky_pix")); if (properties.getProperty(prefix+"tex_disp_hires_tri")!=null) this.tex_disp_hires_tri=Boolean.parseBoolean(properties.getProperty(prefix+"tex_disp_hires_tri")); if (properties.getProperty(prefix+"tex_dbg_scale_mesh")!=null) this.tex_dbg_scale_mesh=Integer.parseInt(properties.getProperty(prefix+"tex_dbg_scale_mesh")); Loading Loading @@ -3707,6 +3710,8 @@ public class CLTParameters { "additionally grow sky area (in layers) without marking it as sky."); gd.addNumericField("Extend sky area down", this.tex_sky_below, 0,3,"tiles", "if >=0, extend sky these tile rows below lowest and extend sky up, right and left to full image."); gd.addNumericField("Shrink trimmed sky", this.tex_shrink_sky_pix, 0,3,"pix", "Shrink sky area after processing occlusions. Shrink by 1 pixel row - 2."); gd.addMessage ("Triangular mesh"); gd.addCheckbox ("Display high resolution mesh", this.tex_disp_hires_tri, Loading Loading @@ -3902,7 +3907,7 @@ public class CLTParameters { gd.addMessage("Trimming by temperature (tone)"); gd.addCheckbox ("Use min/max instead of averages", this.lre_show_debug, // true gd.addCheckbox ("Use min/max instead of averages", this.lre_use_min_max, // true "when trimming by tone, use min/max of the FG/BG instead of weighted averages."); gd.addNumericField("Trim by temperature radius", this.lre_temp_radius, 5,7,"", "How far to look around for FG trimming by temperature."); Loading Loading @@ -4945,6 +4950,7 @@ public class CLTParameters { this.tex_subdiv_tiles = (int) gd.getNextNumber(); this.tex_sky_extra = (int) gd.getNextNumber(); this.tex_sky_below = (int) gd.getNextNumber(); this.tex_shrink_sky_pix = (int) gd.getNextNumber(); this.tex_disp_hires_tri = gd.getNextBoolean(); this.tex_dbg_scale_mesh = (int) gd.getNextNumber(); Loading Loading @@ -5051,8 +5057,8 @@ public class CLTParameters { this.lre_use_min_max= gd.getNextBoolean(); // boolean this.lre_temp_radius= gd.getNextNumber(); // double this.lre_temp_min= (int) gd.getNextNumber(); // int this.lre_min_use_occl= gd.getNextNumber(); // double this.lre_temp_weight= gd.getNextNumber(); // double this.lre_min_use_occl= gd.getNextNumber(); // double this.lre_temp_disparity= gd.getNextNumber(); // double Loading src/main/java/com/elphel/imagej/tileprocessor/TexturedModel.java +120 −53 Original line number Diff line number Diff line Loading @@ -4059,17 +4059,21 @@ public class TexturedModel { * @param textures_final [slice][pixel] final textures, will be modified for BS cluster * @param shrink_sky_tiles shrink (currently 4 - 2 rows) defined sky tiles before filling * undefined pixels * @param shrink_sky_pix shrink by pixels - shrinks from calculated alpha pixels in addition * to tiles * @param blur_sigma apply Gaussian blur to sky texture * @param width image width (640 for Flir Boson) * @param transform_size CLT transform size (==8) * @param dbg_prefix null or debug image name prefix */ public static void extendBlueSKy( public static void extendBlueSky( final TileCluster [] tileClusters, final double [][] textures_occluded, final double [][] alphas, final double [][] textures_final, final int shrink_sky_tiles, final int shrink_spy_pix, final double blur_sigma, final int width, final int transform_size, final String dbg_prefix) { Loading @@ -4095,6 +4099,7 @@ public class TexturedModel { final double [] sky_disparity = tileClusters[sky_slice].getSubDisparity(sky_subindex); // window final int num_sky_tiles = sky_disparity.length; final TileNeibs tn_sky_tiles = new TileNeibs(sky_tiles_bounds.width, sky_tiles_bounds.height); final TileNeibs tp_sky_pixels = new TileNeibs (sky_pixels_bounds.width, sky_pixels_bounds.height); final boolean [] sky_sel = new boolean [sky_disparity.length]; for (int i = 0; i < sky_sel.length; i++) { sky_sel[i] = !Double.isNaN(sky_disparity[i]); Loading @@ -4104,7 +4109,7 @@ public class TexturedModel { sky_pixels_bounds, // Rectangle window, textures_occluded[sky_slice], // double [] data, width); // int data_width) final String [] dbg_titles = {"source","shrank", "hinted", "filled"}; final String [] dbg_titles = {"source","shrank_tiles", "shrank_pix", "hinted", "filled", "blurred"}; final String [] dbg_tile_titles = {"start", "filled"}; final double [][] dbg_img = (dbg_prefix != null) ? new double [dbg_titles.length][]:null; final double [][] dbg_timg = (dbg_prefix != null) ? new double [dbg_tile_titles.length][]:null; Loading Loading @@ -4136,7 +4141,6 @@ public class TexturedModel { pix_indx + transform_size, // int toIndex, Double.NaN); } } } } Loading @@ -4145,7 +4149,41 @@ public class TexturedModel { ImageDtt.startAndJoin(threads); } if (dbg_img != null) dbg_img[1] = sky_pixels.clone(); if (shrink_spy_pix > 0) { if (dbg_prefix != null) { System.out.println("extendBlueSky(): shrinking Blue Sky by "+shrink_spy_pix); } final boolean [] pix_sel = new boolean[sky_pixels.length]; ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int sky_pix = ai.getAndIncrement(); sky_pix < sky_pixels.length; sky_pix = ai.getAndIncrement()) { pix_sel[sky_pix] = !Double.isNaN(sky_pixels[sky_pix]); } } }; } ImageDtt.startAndJoin(threads); tp_sky_pixels.shrinkSelection( shrink_spy_pix, pix_sel, null); ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int sky_pix = ai.getAndIncrement(); sky_pix < sky_pixels.length; sky_pix = ai.getAndIncrement()) { if (!pix_sel[sky_pix]) { sky_pixels[sky_pix] = Double.NaN; } } } }; } ImageDtt.startAndJoin(threads); } if (dbg_img != null) dbg_img[2] = sky_pixels.clone(); // now fill gaps in disparity and pixels double []sky_disparity_filled = TileProcessor.fillNaNs( // multithreaded sky_disparity, // final double [] data, Loading Loading @@ -4198,11 +4236,11 @@ public class TexturedModel { width, // int width, THREADS_MAX); // final int threadsMax) // maximal number of threads to launch if (dbg_img != null) dbg_img[2] = sky_pixels.clone(); if (dbg_img != null) dbg_img[3] = sky_pixels.clone(); double[] sky_pixels_filled = TileProcessor.fillNaNs( // multithreaded sky_pixels, // final double [] data, hinted (NaN replaced from low-res ) sky_pixels_nan, // final double [] data_nan, origina with NaN sky_pixels_nan, // final double [] data_nan, original with NaN null, // final boolean [] prohibit, sky_pixels_bounds.width, // int width, 2 * Math.max(sky_pixels_bounds.width,sky_pixels_bounds.height), // 16, // final int grow, Loading @@ -4210,8 +4248,17 @@ public class TexturedModel { 100, // int num_passes, 0.01, // final double max_rchange, // = 0.01 THREADS_MAX); // final int threadsMax) // maximal number of threads to launch if (dbg_img != null) dbg_img[3] = sky_pixels_filled.clone(); if (dbg_img != null) dbg_img[4] = sky_pixels_filled.clone(); if (blur_sigma > 0.0) { (new DoubleGaussianBlur()).blurDouble( sky_pixels_filled, sky_pixels_bounds.width, sky_pixels_bounds.height, blur_sigma, blur_sigma, 0.01); } if (dbg_img != null) dbg_img[5] = sky_pixels_filled.clone(); TileNeibs.setDoubleWindow( sky_pixels_bounds, // Rectangle window, sky_pixels_filled, // double [] window_data, Loading Loading @@ -5880,14 +5927,13 @@ public class TexturedModel { tile_booleans[TILE_KEEP], // final boolean [][] selected_tiles, transform_size, // final int transform_size, tilesX); // final int tilesX) /* final boolean [][] before_fix_bg_overlap = (dbg_prefix != null)? new boolean [num_slices][] : null; if (dbg_prefix != null) { for (int i = 0; i < num_slices; i++) { before_fix_bg_overlap[i] = unbound_alpha[i].clone(); } } fix_bg_overlap( unbound_alpha, // final boolean [][] alpha_pix, tile_booleans[TILE_KEEP], // final boolean [][] selected_tiles, Loading @@ -5896,7 +5942,7 @@ public class TexturedModel { border_int_max, // final int neib_max, // now 2 transform_size, // final int transform_size, tilesX); // final int tilesX) */ final boolean [][] before_fix_same = (dbg_prefix != null)? new boolean [num_slices][] : null; if (dbg_prefix != null) { for (int i = 0; i < num_slices; i++) { Loading Loading @@ -6106,6 +6152,25 @@ public class TexturedModel { System.out.println("updateFgAlpha() -> "+updated_tiles); } } // moving here - after updating alpha final boolean [][] before_fix_bg_overlap = (dbg_prefix != null)? new boolean [num_slices][] : null; if (dbg_prefix != null) { for (int i = 0; i < num_slices; i++) { before_fix_bg_overlap[i] = unbound_alpha[i].clone(); } } fix_bg_overlap( unbound_alpha, // final boolean [][] alpha_pix, tile_booleans[TILE_KEEP], // final boolean [][] selected_tiles, tile_booleans[TILE_HAS_BG_STRONG], // final boolean [][] has_bg_strong_tiles, slice_border_int, // final int [][] slice_border_int, border_int_max, // final int neib_max, // now 2 transform_size, // final int transform_size, tilesX); // final int tilesX) double [][] alphas = new double[num_slices][]; for (int nslice = 0; nslice < num_slices; nslice++) { // replace old alpha with the new binary one Loading @@ -6115,16 +6180,21 @@ public class TexturedModel { } } final int shrink_sky_tiles = 2 * (2 +clt_parameters.tex_sky_extra); // 4; // 2; sum of 2 +bg extend final int shrink_sky_tiles = 2 * (max_neib_lev +clt_parameters.tex_sky_extra); // 4; // 2; sum of 2 +bg extend final int shrink_spy_pix = clt_parameters.tex_shrink_sky_pix; // 4; // shrink from pixel alpha, unrelated to tiles final boolean grow_sky = true; final double blur_sigma = 1.5; if (grow_sky) { // occluded_filled_textures extendBlueSKy( extendBlueSky( tileClusters, // final TileCluster [] tileClusters, occluded_textures, // final double [][][] textures_occluded, alphas, // final double [][] alphas, occluded_filled_textures, // final double [][][] textures_final, shrink_sky_tiles, // final int shrink_sky_tiles, shrink_spy_pix, // final int shrink_spy_pix, blur_sigma, // final double blur_sigma, width, // final int width, transform_size, // final int transform_size); dbg_prefix); // dbg_prefix); // final String dbg_prefix) Loading Loading @@ -6206,9 +6276,21 @@ public class TexturedModel { trim_tiles_pix[i] = (weak_fg_alpha [nslice][i]? 1.0:0.0) + (before_fix_same [nslice][i]? 2.0:0.0); /* // modify ! fix_bg_pix[i] = (before_fix_same [nslice][i]? 1.0:0.0) + ((before_fix_same [nslice][i] ^ before_fix_bg_overlap[nslice][i])? 2.0:0.0); */ fix_bg_pix[i] = (before_fix_same [nslice][i]? 1.0:0.0) + ((before_fix_same [nslice][i] ^ unbound_alpha[nslice][i])? 2.0:0.0); trim_tiles_pix[i] = (weak_fg_alpha [nslice][i]? 1.0:0.0) + (before_fix_same [nslice][i]? 2.0:0.0); fix_same_pix[i] = (unbound_alpha [nslice][i]? 1.0:0.0) + ((unbound_alpha [nslice][i] ^ before_fix_same [nslice][i])? 2.0:0.0); Loading @@ -6218,28 +6300,27 @@ public class TexturedModel { (unbound_alpha[nslice][i]? 2.0:0.0); } double [][] dbg_img = { vars[0][nslice], vars[1][nslice], vars[2][nslice], vars[3][nslice], vars[4][nslice], trim_fom_pix[nslice], // normalized by blurred fom_dbg[0][nslice], fom_dbg[1][nslice], fom_dbg[2][nslice], fom_dbg[3][nslice], vars_fom, half_pix, stitch_trim_pix, trim_seed_pix, seed_trim_grow_pix, unfilt_filt_pix, weak_fg_pix, trim_tiles_pix, fix_bg_pix, fix_same_pix, trim_alpha_pix, vars[0][nslice], // 0 vars[1][nslice], // 1 vars[2][nslice], // 2 vars[3][nslice], // 3 vars[4][nslice], // 4 trim_fom_pix[nslice], // 5 normalized by blurred fom_dbg[0][nslice], // 6 fom_dbg[1][nslice], // 7 fom_dbg[2][nslice], // 8 fom_dbg[3][nslice], // 9 vars_fom, // 10 half_pix, // 11 (has_bg_pix? 1.0:0.0)+(is_fg_pix? 2.0:0.0) stitch_trim_pix, // 12 (stitch_pixels? 1.0:0.0)+(trim_pixels? 2.0:0.0) trim_seed_pix, // 13 (trim_pixels? 1.0:0.0)+(trim_seeds? 2.0:0.0) seed_trim_grow_pix, // 14 (trim_seeds? 1.0:0.0)+(first_trimmed_alpha?2.0:0.0)+(unfiltered_alpha?4.0:0.0); unfilt_filt_pix, // 15 (unfiltered_alpha? 1.0:0.0)+(filtered_alpha?2.0:0.0); weak_fg_pix, // 16 (filtered_alpha? 1.0:0.0) + (weak_fg_alpha?2.0:0.0); trim_tiles_pix, // 17 (weak_fg_alpha? 1.0:0.0)+(before_fix_same?2.0:0.0) fix_bg_pix, // 18 (before_fix_same? 1.0:0.0)+((before_fix_same^before_fix_bg_overlap)? 2.0:0.0) fix_same_pix, // 19 (unbound_alpha? 1.0:0.0)+((unbound_alpha ^ before_fix_same)? 2.0:0.0); trim_alpha_pix, // 20 (trim_pixels? 1.0:0.0) + (unbound_alpha[i]? 2.0:0.0); dbg_occluded_map[nslice], gcombo_texture[nslice], occluded_filled_textures[nslice], // put before occluded_textures to compare with gcombo_texture Loading Loading @@ -6725,20 +6806,6 @@ public class TexturedModel { dbg_titles); } // Grow sky - moved to processTexture() /* if (grow_sky) { String dbg_prefix = show_sky_textures ? ref_scene.getImageName() : null; extendBlueSKy( tileClusters, // final TileCluster [] tileClusters, faded_textures, // final double [][][] faded_textures, shrink_sky_tiles, // final int shrink_sky_tiles, width, // final int width, transform_size, // final int transform_size); dbg_prefix); // dbg_prefix); // final String dbg_prefix) } */ // fix alpha if (alphaOverlapFix) { fixAlphaSameDisparity( Loading Loading @@ -6950,7 +7017,7 @@ public class TexturedModel { int debugLevel) { if (debugLevel > -2) { System.out.println("getInterCombinedTextures()m no_alpha=" + no_alpha); // true System.out.println("getInterCombinedTextures(): no_alpha=" + no_alpha); // true } final boolean tex_color = clt_parameters.tex_color; // true; final int tex_palette = clt_parameters.tex_palette; // 2 ; Loading Loading
src/main/java/com/elphel/imagej/cameras/CLTParameters.java +8 −2 Original line number Diff line number Diff line Loading @@ -414,6 +414,7 @@ public class CLTParameters { public int tex_subdiv_tiles = 4; // subdivide tiles to smaller triangles public int tex_sky_extra = 2; // additionally grow sky area (in layers) without marking as sky public int tex_sky_below = 10; // extend sky these tile rows below lowest public int tex_shrink_sky_pix = 4; // shrink background by pixels // gd.addMessage ("Triangular mesh"); public boolean tex_disp_hires_tri = true; // Display high resolution mesh Loading Loading @@ -1535,6 +1536,7 @@ public class CLTParameters { properties.setProperty(prefix+"tex_subdiv_tiles", this.tex_subdiv_tiles+""); // int properties.setProperty(prefix+"tex_sky_extra", this.tex_sky_extra+""); // int properties.setProperty(prefix+"tex_sky_below", this.tex_sky_below+""); // int properties.setProperty(prefix+"tex_shrink_sky_pix", this.tex_shrink_sky_pix+""); // int properties.setProperty(prefix+"tex_disp_hires_tri", this.tex_disp_hires_tri+""); // boolean properties.setProperty(prefix+"tex_dbg_scale_mesh", this.tex_dbg_scale_mesh+""); // int Loading Loading @@ -2531,6 +2533,7 @@ public class CLTParameters { if (properties.getProperty(prefix+"tex_subdiv_tiles")!=null) this.tex_subdiv_tiles=Integer.parseInt(properties.getProperty(prefix+"tex_subdiv_tiles")); if (properties.getProperty(prefix+"tex_sky_extra")!=null) this.tex_sky_extra=Integer.parseInt(properties.getProperty(prefix+"tex_sky_extra")); if (properties.getProperty(prefix+"tex_sky_below")!=null) this.tex_sky_below=Integer.parseInt(properties.getProperty(prefix+"tex_sky_below")); if (properties.getProperty(prefix+"tex_shrink_sky_pix")!=null) this.tex_shrink_sky_pix=Integer.parseInt(properties.getProperty(prefix+"tex_shrink_sky_pix")); if (properties.getProperty(prefix+"tex_disp_hires_tri")!=null) this.tex_disp_hires_tri=Boolean.parseBoolean(properties.getProperty(prefix+"tex_disp_hires_tri")); if (properties.getProperty(prefix+"tex_dbg_scale_mesh")!=null) this.tex_dbg_scale_mesh=Integer.parseInt(properties.getProperty(prefix+"tex_dbg_scale_mesh")); Loading Loading @@ -3707,6 +3710,8 @@ public class CLTParameters { "additionally grow sky area (in layers) without marking it as sky."); gd.addNumericField("Extend sky area down", this.tex_sky_below, 0,3,"tiles", "if >=0, extend sky these tile rows below lowest and extend sky up, right and left to full image."); gd.addNumericField("Shrink trimmed sky", this.tex_shrink_sky_pix, 0,3,"pix", "Shrink sky area after processing occlusions. Shrink by 1 pixel row - 2."); gd.addMessage ("Triangular mesh"); gd.addCheckbox ("Display high resolution mesh", this.tex_disp_hires_tri, Loading Loading @@ -3902,7 +3907,7 @@ public class CLTParameters { gd.addMessage("Trimming by temperature (tone)"); gd.addCheckbox ("Use min/max instead of averages", this.lre_show_debug, // true gd.addCheckbox ("Use min/max instead of averages", this.lre_use_min_max, // true "when trimming by tone, use min/max of the FG/BG instead of weighted averages."); gd.addNumericField("Trim by temperature radius", this.lre_temp_radius, 5,7,"", "How far to look around for FG trimming by temperature."); Loading Loading @@ -4945,6 +4950,7 @@ public class CLTParameters { this.tex_subdiv_tiles = (int) gd.getNextNumber(); this.tex_sky_extra = (int) gd.getNextNumber(); this.tex_sky_below = (int) gd.getNextNumber(); this.tex_shrink_sky_pix = (int) gd.getNextNumber(); this.tex_disp_hires_tri = gd.getNextBoolean(); this.tex_dbg_scale_mesh = (int) gd.getNextNumber(); Loading Loading @@ -5051,8 +5057,8 @@ public class CLTParameters { this.lre_use_min_max= gd.getNextBoolean(); // boolean this.lre_temp_radius= gd.getNextNumber(); // double this.lre_temp_min= (int) gd.getNextNumber(); // int this.lre_min_use_occl= gd.getNextNumber(); // double this.lre_temp_weight= gd.getNextNumber(); // double this.lre_min_use_occl= gd.getNextNumber(); // double this.lre_temp_disparity= gd.getNextNumber(); // double Loading
src/main/java/com/elphel/imagej/tileprocessor/TexturedModel.java +120 −53 Original line number Diff line number Diff line Loading @@ -4059,17 +4059,21 @@ public class TexturedModel { * @param textures_final [slice][pixel] final textures, will be modified for BS cluster * @param shrink_sky_tiles shrink (currently 4 - 2 rows) defined sky tiles before filling * undefined pixels * @param shrink_sky_pix shrink by pixels - shrinks from calculated alpha pixels in addition * to tiles * @param blur_sigma apply Gaussian blur to sky texture * @param width image width (640 for Flir Boson) * @param transform_size CLT transform size (==8) * @param dbg_prefix null or debug image name prefix */ public static void extendBlueSKy( public static void extendBlueSky( final TileCluster [] tileClusters, final double [][] textures_occluded, final double [][] alphas, final double [][] textures_final, final int shrink_sky_tiles, final int shrink_spy_pix, final double blur_sigma, final int width, final int transform_size, final String dbg_prefix) { Loading @@ -4095,6 +4099,7 @@ public class TexturedModel { final double [] sky_disparity = tileClusters[sky_slice].getSubDisparity(sky_subindex); // window final int num_sky_tiles = sky_disparity.length; final TileNeibs tn_sky_tiles = new TileNeibs(sky_tiles_bounds.width, sky_tiles_bounds.height); final TileNeibs tp_sky_pixels = new TileNeibs (sky_pixels_bounds.width, sky_pixels_bounds.height); final boolean [] sky_sel = new boolean [sky_disparity.length]; for (int i = 0; i < sky_sel.length; i++) { sky_sel[i] = !Double.isNaN(sky_disparity[i]); Loading @@ -4104,7 +4109,7 @@ public class TexturedModel { sky_pixels_bounds, // Rectangle window, textures_occluded[sky_slice], // double [] data, width); // int data_width) final String [] dbg_titles = {"source","shrank", "hinted", "filled"}; final String [] dbg_titles = {"source","shrank_tiles", "shrank_pix", "hinted", "filled", "blurred"}; final String [] dbg_tile_titles = {"start", "filled"}; final double [][] dbg_img = (dbg_prefix != null) ? new double [dbg_titles.length][]:null; final double [][] dbg_timg = (dbg_prefix != null) ? new double [dbg_tile_titles.length][]:null; Loading Loading @@ -4136,7 +4141,6 @@ public class TexturedModel { pix_indx + transform_size, // int toIndex, Double.NaN); } } } } Loading @@ -4145,7 +4149,41 @@ public class TexturedModel { ImageDtt.startAndJoin(threads); } if (dbg_img != null) dbg_img[1] = sky_pixels.clone(); if (shrink_spy_pix > 0) { if (dbg_prefix != null) { System.out.println("extendBlueSky(): shrinking Blue Sky by "+shrink_spy_pix); } final boolean [] pix_sel = new boolean[sky_pixels.length]; ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int sky_pix = ai.getAndIncrement(); sky_pix < sky_pixels.length; sky_pix = ai.getAndIncrement()) { pix_sel[sky_pix] = !Double.isNaN(sky_pixels[sky_pix]); } } }; } ImageDtt.startAndJoin(threads); tp_sky_pixels.shrinkSelection( shrink_spy_pix, pix_sel, null); ai.set(0); for (int ithread = 0; ithread < threads.length; ithread++) { threads[ithread] = new Thread() { public void run() { for (int sky_pix = ai.getAndIncrement(); sky_pix < sky_pixels.length; sky_pix = ai.getAndIncrement()) { if (!pix_sel[sky_pix]) { sky_pixels[sky_pix] = Double.NaN; } } } }; } ImageDtt.startAndJoin(threads); } if (dbg_img != null) dbg_img[2] = sky_pixels.clone(); // now fill gaps in disparity and pixels double []sky_disparity_filled = TileProcessor.fillNaNs( // multithreaded sky_disparity, // final double [] data, Loading Loading @@ -4198,11 +4236,11 @@ public class TexturedModel { width, // int width, THREADS_MAX); // final int threadsMax) // maximal number of threads to launch if (dbg_img != null) dbg_img[2] = sky_pixels.clone(); if (dbg_img != null) dbg_img[3] = sky_pixels.clone(); double[] sky_pixels_filled = TileProcessor.fillNaNs( // multithreaded sky_pixels, // final double [] data, hinted (NaN replaced from low-res ) sky_pixels_nan, // final double [] data_nan, origina with NaN sky_pixels_nan, // final double [] data_nan, original with NaN null, // final boolean [] prohibit, sky_pixels_bounds.width, // int width, 2 * Math.max(sky_pixels_bounds.width,sky_pixels_bounds.height), // 16, // final int grow, Loading @@ -4210,8 +4248,17 @@ public class TexturedModel { 100, // int num_passes, 0.01, // final double max_rchange, // = 0.01 THREADS_MAX); // final int threadsMax) // maximal number of threads to launch if (dbg_img != null) dbg_img[3] = sky_pixels_filled.clone(); if (dbg_img != null) dbg_img[4] = sky_pixels_filled.clone(); if (blur_sigma > 0.0) { (new DoubleGaussianBlur()).blurDouble( sky_pixels_filled, sky_pixels_bounds.width, sky_pixels_bounds.height, blur_sigma, blur_sigma, 0.01); } if (dbg_img != null) dbg_img[5] = sky_pixels_filled.clone(); TileNeibs.setDoubleWindow( sky_pixels_bounds, // Rectangle window, sky_pixels_filled, // double [] window_data, Loading Loading @@ -5880,14 +5927,13 @@ public class TexturedModel { tile_booleans[TILE_KEEP], // final boolean [][] selected_tiles, transform_size, // final int transform_size, tilesX); // final int tilesX) /* final boolean [][] before_fix_bg_overlap = (dbg_prefix != null)? new boolean [num_slices][] : null; if (dbg_prefix != null) { for (int i = 0; i < num_slices; i++) { before_fix_bg_overlap[i] = unbound_alpha[i].clone(); } } fix_bg_overlap( unbound_alpha, // final boolean [][] alpha_pix, tile_booleans[TILE_KEEP], // final boolean [][] selected_tiles, Loading @@ -5896,7 +5942,7 @@ public class TexturedModel { border_int_max, // final int neib_max, // now 2 transform_size, // final int transform_size, tilesX); // final int tilesX) */ final boolean [][] before_fix_same = (dbg_prefix != null)? new boolean [num_slices][] : null; if (dbg_prefix != null) { for (int i = 0; i < num_slices; i++) { Loading Loading @@ -6106,6 +6152,25 @@ public class TexturedModel { System.out.println("updateFgAlpha() -> "+updated_tiles); } } // moving here - after updating alpha final boolean [][] before_fix_bg_overlap = (dbg_prefix != null)? new boolean [num_slices][] : null; if (dbg_prefix != null) { for (int i = 0; i < num_slices; i++) { before_fix_bg_overlap[i] = unbound_alpha[i].clone(); } } fix_bg_overlap( unbound_alpha, // final boolean [][] alpha_pix, tile_booleans[TILE_KEEP], // final boolean [][] selected_tiles, tile_booleans[TILE_HAS_BG_STRONG], // final boolean [][] has_bg_strong_tiles, slice_border_int, // final int [][] slice_border_int, border_int_max, // final int neib_max, // now 2 transform_size, // final int transform_size, tilesX); // final int tilesX) double [][] alphas = new double[num_slices][]; for (int nslice = 0; nslice < num_slices; nslice++) { // replace old alpha with the new binary one Loading @@ -6115,16 +6180,21 @@ public class TexturedModel { } } final int shrink_sky_tiles = 2 * (2 +clt_parameters.tex_sky_extra); // 4; // 2; sum of 2 +bg extend final int shrink_sky_tiles = 2 * (max_neib_lev +clt_parameters.tex_sky_extra); // 4; // 2; sum of 2 +bg extend final int shrink_spy_pix = clt_parameters.tex_shrink_sky_pix; // 4; // shrink from pixel alpha, unrelated to tiles final boolean grow_sky = true; final double blur_sigma = 1.5; if (grow_sky) { // occluded_filled_textures extendBlueSKy( extendBlueSky( tileClusters, // final TileCluster [] tileClusters, occluded_textures, // final double [][][] textures_occluded, alphas, // final double [][] alphas, occluded_filled_textures, // final double [][][] textures_final, shrink_sky_tiles, // final int shrink_sky_tiles, shrink_spy_pix, // final int shrink_spy_pix, blur_sigma, // final double blur_sigma, width, // final int width, transform_size, // final int transform_size); dbg_prefix); // dbg_prefix); // final String dbg_prefix) Loading Loading @@ -6206,9 +6276,21 @@ public class TexturedModel { trim_tiles_pix[i] = (weak_fg_alpha [nslice][i]? 1.0:0.0) + (before_fix_same [nslice][i]? 2.0:0.0); /* // modify ! fix_bg_pix[i] = (before_fix_same [nslice][i]? 1.0:0.0) + ((before_fix_same [nslice][i] ^ before_fix_bg_overlap[nslice][i])? 2.0:0.0); */ fix_bg_pix[i] = (before_fix_same [nslice][i]? 1.0:0.0) + ((before_fix_same [nslice][i] ^ unbound_alpha[nslice][i])? 2.0:0.0); trim_tiles_pix[i] = (weak_fg_alpha [nslice][i]? 1.0:0.0) + (before_fix_same [nslice][i]? 2.0:0.0); fix_same_pix[i] = (unbound_alpha [nslice][i]? 1.0:0.0) + ((unbound_alpha [nslice][i] ^ before_fix_same [nslice][i])? 2.0:0.0); Loading @@ -6218,28 +6300,27 @@ public class TexturedModel { (unbound_alpha[nslice][i]? 2.0:0.0); } double [][] dbg_img = { vars[0][nslice], vars[1][nslice], vars[2][nslice], vars[3][nslice], vars[4][nslice], trim_fom_pix[nslice], // normalized by blurred fom_dbg[0][nslice], fom_dbg[1][nslice], fom_dbg[2][nslice], fom_dbg[3][nslice], vars_fom, half_pix, stitch_trim_pix, trim_seed_pix, seed_trim_grow_pix, unfilt_filt_pix, weak_fg_pix, trim_tiles_pix, fix_bg_pix, fix_same_pix, trim_alpha_pix, vars[0][nslice], // 0 vars[1][nslice], // 1 vars[2][nslice], // 2 vars[3][nslice], // 3 vars[4][nslice], // 4 trim_fom_pix[nslice], // 5 normalized by blurred fom_dbg[0][nslice], // 6 fom_dbg[1][nslice], // 7 fom_dbg[2][nslice], // 8 fom_dbg[3][nslice], // 9 vars_fom, // 10 half_pix, // 11 (has_bg_pix? 1.0:0.0)+(is_fg_pix? 2.0:0.0) stitch_trim_pix, // 12 (stitch_pixels? 1.0:0.0)+(trim_pixels? 2.0:0.0) trim_seed_pix, // 13 (trim_pixels? 1.0:0.0)+(trim_seeds? 2.0:0.0) seed_trim_grow_pix, // 14 (trim_seeds? 1.0:0.0)+(first_trimmed_alpha?2.0:0.0)+(unfiltered_alpha?4.0:0.0); unfilt_filt_pix, // 15 (unfiltered_alpha? 1.0:0.0)+(filtered_alpha?2.0:0.0); weak_fg_pix, // 16 (filtered_alpha? 1.0:0.0) + (weak_fg_alpha?2.0:0.0); trim_tiles_pix, // 17 (weak_fg_alpha? 1.0:0.0)+(before_fix_same?2.0:0.0) fix_bg_pix, // 18 (before_fix_same? 1.0:0.0)+((before_fix_same^before_fix_bg_overlap)? 2.0:0.0) fix_same_pix, // 19 (unbound_alpha? 1.0:0.0)+((unbound_alpha ^ before_fix_same)? 2.0:0.0); trim_alpha_pix, // 20 (trim_pixels? 1.0:0.0) + (unbound_alpha[i]? 2.0:0.0); dbg_occluded_map[nslice], gcombo_texture[nslice], occluded_filled_textures[nslice], // put before occluded_textures to compare with gcombo_texture Loading Loading @@ -6725,20 +6806,6 @@ public class TexturedModel { dbg_titles); } // Grow sky - moved to processTexture() /* if (grow_sky) { String dbg_prefix = show_sky_textures ? ref_scene.getImageName() : null; extendBlueSKy( tileClusters, // final TileCluster [] tileClusters, faded_textures, // final double [][][] faded_textures, shrink_sky_tiles, // final int shrink_sky_tiles, width, // final int width, transform_size, // final int transform_size); dbg_prefix); // dbg_prefix); // final String dbg_prefix) } */ // fix alpha if (alphaOverlapFix) { fixAlphaSameDisparity( Loading Loading @@ -6950,7 +7017,7 @@ public class TexturedModel { int debugLevel) { if (debugLevel > -2) { System.out.println("getInterCombinedTextures()m no_alpha=" + no_alpha); // true System.out.println("getInterCombinedTextures(): no_alpha=" + no_alpha); // true } final boolean tex_color = clt_parameters.tex_color; // true; final int tex_palette = clt_parameters.tex_palette; // 2 ; Loading