Loading src/main/java/EyesisCorrectionParameters.java +31 −3 Original line number Diff line number Diff line Loading @@ -1799,9 +1799,15 @@ public class EyesisCorrectionParameters { public int kernel_chn = -1; // camera channel calibration to use for aberration correction ( < 0 - no correction) public boolean normalize = true; // normalize both sym and asym kernels (asym to have sum==1, sym to have sum = dct_size public boolean normalize_sym = true; // normalize sym kernels separately public boolean antiwindow = false; // divide symmetrical kernel by a window function public boolean skip_sym = false; // do not apply symmetrical correction public boolean convolve_direct = false; // do not apply symmetrical correction // colors should be balanced before DCT color conversion! public double novignetting_r = 0.2644; // reg gain in the center of sensor calibration R (instead of vignetting) public double novignetting_g = 0.3733; // green gain in the center of sensor calibration G public double novignetting_b = 0.2034; // blue gain in the center of sensor calibration B public double vignetting_max = 0.4; // value in vignetting data to correspond to 1x in the kernel public double vignetting_range = 5.0; // do not try to correct vignetting less than vignetting_max/vignetting_range Loading Loading @@ -1875,8 +1881,14 @@ public class EyesisCorrectionParameters { properties.setProperty(prefix+"kernel_chn", this.kernel_chn+""); properties.setProperty(prefix+"normalize", this.normalize+""); properties.setProperty(prefix+"normalize_sym", this.normalize_sym+""); properties.setProperty(prefix+"antiwindow", this.antiwindow+""); properties.setProperty(prefix+"skip_sym", this.skip_sym+""); properties.setProperty(prefix+"convolve_direct", this.convolve_direct+""); properties.setProperty(prefix+"novignetting_r", this.novignetting_r+""); properties.setProperty(prefix+"novignetting_g", this.novignetting_g+""); properties.setProperty(prefix+"novignetting_b", this.novignetting_b+""); properties.setProperty(prefix+"vignetting_max", this.vignetting_max+""); properties.setProperty(prefix+"vignetting_range", this.vignetting_range+""); properties.setProperty(prefix+"color_DCT", this.color_DCT+""); Loading Loading @@ -1933,8 +1945,14 @@ public class EyesisCorrectionParameters { if (properties.getProperty(prefix+"kernel_chn")!=null) this.kernel_chn=Integer.parseInt(properties.getProperty(prefix+"kernel_chn")); if (properties.getProperty(prefix+"normalize")!=null) this.normalize=Boolean.parseBoolean(properties.getProperty(prefix+"normalize")); if (properties.getProperty(prefix+"normalize_sym")!=null) this.normalize_sym=Boolean.parseBoolean(properties.getProperty(prefix+"normalize_sym")); if (properties.getProperty(prefix+"antiwindow")!=null) this.antiwindow=Boolean.parseBoolean(properties.getProperty(prefix+"antiwindow")); if (properties.getProperty(prefix+"skip_sym")!=null) this.skip_sym=Boolean.parseBoolean(properties.getProperty(prefix+"skip_sym")); if (properties.getProperty(prefix+"convolve_direct")!=null) this.convolve_direct=Boolean.parseBoolean(properties.getProperty(prefix+"convolve_direct")); if (properties.getProperty(prefix+"novignetting_r")!=null) this.novignetting_r=Double.parseDouble(properties.getProperty(prefix+"novignetting_r")); if (properties.getProperty(prefix+"novignetting_g")!=null) this.novignetting_g=Double.parseDouble(properties.getProperty(prefix+"novignetting_g")); if (properties.getProperty(prefix+"novignetting_b")!=null) this.novignetting_b=Double.parseDouble(properties.getProperty(prefix+"novignetting_b")); if (properties.getProperty(prefix+"vignetting_max")!=null) this.vignetting_max=Double.parseDouble(properties.getProperty(prefix+"vignetting_max")); if (properties.getProperty(prefix+"vignetting_range")!=null) this.vignetting_range=Double.parseDouble(properties.getProperty(prefix+"vignetting_range")); if (properties.getProperty(prefix+"color_DCT")!=null) this.color_DCT=Boolean.parseBoolean(properties.getProperty(prefix+"color_DCT")); Loading Loading @@ -1990,8 +2008,14 @@ public class EyesisCorrectionParameters { gd.addNumericField("Calibration channel to use for aberration ( <0 - no correction)",this.kernel_chn, 0); gd.addCheckbox ("Normalize both sym and asym kernels ", this.normalize); gd.addCheckbox ("Normalize sym kernels separately", this.normalize_sym); gd.addCheckbox ("Divide symmetrical kernel by a window function", this.antiwindow); gd.addCheckbox ("Do not apply symmetrical (DCT) correction ", this.skip_sym); gd.addCheckbox ("Convolve directly with symmetrical kernel (debug feature) ", this.convolve_direct); gd.addNumericField("Reg gain in the center of sensor calibration R (instead of vignetting)",this.novignetting_r, 4); gd.addNumericField("Green gain in the center of sensor calibration G (instead of vignetting)",this.novignetting_g, 4); gd.addNumericField("Blue gain in the center of sensor calibration B (instead of vignetting)",this.novignetting_b, 4); gd.addNumericField("Value (max) in vignetting data to correspond to 1x in the kernel",this.vignetting_max, 3); gd.addNumericField("Do not try to correct vignetting smaller than this fraction of max",this.vignetting_range, 3); gd.addCheckbox ("Use DCT-base color conversion", this.color_DCT ); Loading Loading @@ -2047,8 +2071,12 @@ public class EyesisCorrectionParameters { this.kernel_chn= (int) gd.getNextNumber(); this.normalize= gd.getNextBoolean(); this.normalize_sym= gd.getNextBoolean(); this.antiwindow= gd.getNextBoolean(); this.skip_sym= gd.getNextBoolean(); this.convolve_direct= gd.getNextBoolean(); this.novignetting_r= gd.getNextNumber(); this.novignetting_g= gd.getNextNumber(); this.novignetting_b= gd.getNextNumber(); this.vignetting_max= gd.getNextNumber(); this.vignetting_range= gd.getNextNumber(); this.color_DCT= gd.getNextBoolean(); Loading src/main/java/EyesisDCT.java +36 −1 Original line number Diff line number Diff line Loading @@ -706,6 +706,13 @@ public class EyesisDCT { norm_sym_weights[i*dct_size+j] = d; } } double [] inv_window = new double [dct_size*dct_size]; for (int i = 0; i < dct_size; i++){ for (int j = 0; j < dct_size; j++){ double d = 1.0 / (Math.cos(Math.PI*i/(2*dct_size))*Math.cos(Math.PI*j/(2*dct_size))); inv_window[i*dct_size+j] = d; } } if (debugLevel>0) { System.out.println("readDCTKernels() debugLevel = "+debugLevel+ Loading Loading @@ -778,6 +785,15 @@ public class EyesisDCT { i * dct_size, dct_size); } // sym_kernel pre-compensation for window function if (dct_parameters.antiwindow) { for (int i=0; i < kernels[chn].st_kernels[nc][tileY][tileX].length;i++) { kernels[chn].st_kernels[nc][tileY][tileX][i] *= inv_window[i]; } } if (scale_asym != 1.0){ for (int i=0; i < kernels[chn].st_kernels[nc][tileY][tileX].length;i++) { kernels[chn].st_kernels[nc][tileY][tileX][i] *= scale_asym; Loading Loading @@ -1123,7 +1139,23 @@ public class EyesisDCT { if (d > max_vign_corr) d = max_vign_corr; pixels[i]*=d; } } else { // assuming GR/BG pattern System.out.println("Applying fixed color gain correction parameters: Gr="+ dct_parameters.novignetting_r+", Gg="+dct_parameters.novignetting_g+", Gb="+dct_parameters.novignetting_b); float [] pixels=(float []) imp_src.getProcessor().getPixels(); int width = imp_src.getWidth(); int height = imp_src.getHeight(); double kr = 1.0/dct_parameters.novignetting_r; double kg = 1.0/dct_parameters.novignetting_g; double kb = 1.0/dct_parameters.novignetting_b; for (int y = 0; y < height-1; y+=2){ for (int x = 0; x < width-1; x+=2){ pixels[y*width+x ] *= kg; pixels[y*width+x+width+1] *= kg; pixels[y*width+x +1] *= kr; pixels[y*width+x+width ] *= kb; } } } String title=name+"-"+String.format("%02d", channel); ImagePlus result=imp_src; Loading Loading @@ -1183,6 +1215,9 @@ public class EyesisDCT { threadsMax, debugLevel); } //TODO: Scale up 2x to match color processed (or scale up lpf?) } int tilesY = stack.getHeight()/dct_parameters.dct_size - 1; Loading Loading
src/main/java/EyesisCorrectionParameters.java +31 −3 Original line number Diff line number Diff line Loading @@ -1799,9 +1799,15 @@ public class EyesisCorrectionParameters { public int kernel_chn = -1; // camera channel calibration to use for aberration correction ( < 0 - no correction) public boolean normalize = true; // normalize both sym and asym kernels (asym to have sum==1, sym to have sum = dct_size public boolean normalize_sym = true; // normalize sym kernels separately public boolean antiwindow = false; // divide symmetrical kernel by a window function public boolean skip_sym = false; // do not apply symmetrical correction public boolean convolve_direct = false; // do not apply symmetrical correction // colors should be balanced before DCT color conversion! public double novignetting_r = 0.2644; // reg gain in the center of sensor calibration R (instead of vignetting) public double novignetting_g = 0.3733; // green gain in the center of sensor calibration G public double novignetting_b = 0.2034; // blue gain in the center of sensor calibration B public double vignetting_max = 0.4; // value in vignetting data to correspond to 1x in the kernel public double vignetting_range = 5.0; // do not try to correct vignetting less than vignetting_max/vignetting_range Loading Loading @@ -1875,8 +1881,14 @@ public class EyesisCorrectionParameters { properties.setProperty(prefix+"kernel_chn", this.kernel_chn+""); properties.setProperty(prefix+"normalize", this.normalize+""); properties.setProperty(prefix+"normalize_sym", this.normalize_sym+""); properties.setProperty(prefix+"antiwindow", this.antiwindow+""); properties.setProperty(prefix+"skip_sym", this.skip_sym+""); properties.setProperty(prefix+"convolve_direct", this.convolve_direct+""); properties.setProperty(prefix+"novignetting_r", this.novignetting_r+""); properties.setProperty(prefix+"novignetting_g", this.novignetting_g+""); properties.setProperty(prefix+"novignetting_b", this.novignetting_b+""); properties.setProperty(prefix+"vignetting_max", this.vignetting_max+""); properties.setProperty(prefix+"vignetting_range", this.vignetting_range+""); properties.setProperty(prefix+"color_DCT", this.color_DCT+""); Loading Loading @@ -1933,8 +1945,14 @@ public class EyesisCorrectionParameters { if (properties.getProperty(prefix+"kernel_chn")!=null) this.kernel_chn=Integer.parseInt(properties.getProperty(prefix+"kernel_chn")); if (properties.getProperty(prefix+"normalize")!=null) this.normalize=Boolean.parseBoolean(properties.getProperty(prefix+"normalize")); if (properties.getProperty(prefix+"normalize_sym")!=null) this.normalize_sym=Boolean.parseBoolean(properties.getProperty(prefix+"normalize_sym")); if (properties.getProperty(prefix+"antiwindow")!=null) this.antiwindow=Boolean.parseBoolean(properties.getProperty(prefix+"antiwindow")); if (properties.getProperty(prefix+"skip_sym")!=null) this.skip_sym=Boolean.parseBoolean(properties.getProperty(prefix+"skip_sym")); if (properties.getProperty(prefix+"convolve_direct")!=null) this.convolve_direct=Boolean.parseBoolean(properties.getProperty(prefix+"convolve_direct")); if (properties.getProperty(prefix+"novignetting_r")!=null) this.novignetting_r=Double.parseDouble(properties.getProperty(prefix+"novignetting_r")); if (properties.getProperty(prefix+"novignetting_g")!=null) this.novignetting_g=Double.parseDouble(properties.getProperty(prefix+"novignetting_g")); if (properties.getProperty(prefix+"novignetting_b")!=null) this.novignetting_b=Double.parseDouble(properties.getProperty(prefix+"novignetting_b")); if (properties.getProperty(prefix+"vignetting_max")!=null) this.vignetting_max=Double.parseDouble(properties.getProperty(prefix+"vignetting_max")); if (properties.getProperty(prefix+"vignetting_range")!=null) this.vignetting_range=Double.parseDouble(properties.getProperty(prefix+"vignetting_range")); if (properties.getProperty(prefix+"color_DCT")!=null) this.color_DCT=Boolean.parseBoolean(properties.getProperty(prefix+"color_DCT")); Loading Loading @@ -1990,8 +2008,14 @@ public class EyesisCorrectionParameters { gd.addNumericField("Calibration channel to use for aberration ( <0 - no correction)",this.kernel_chn, 0); gd.addCheckbox ("Normalize both sym and asym kernels ", this.normalize); gd.addCheckbox ("Normalize sym kernels separately", this.normalize_sym); gd.addCheckbox ("Divide symmetrical kernel by a window function", this.antiwindow); gd.addCheckbox ("Do not apply symmetrical (DCT) correction ", this.skip_sym); gd.addCheckbox ("Convolve directly with symmetrical kernel (debug feature) ", this.convolve_direct); gd.addNumericField("Reg gain in the center of sensor calibration R (instead of vignetting)",this.novignetting_r, 4); gd.addNumericField("Green gain in the center of sensor calibration G (instead of vignetting)",this.novignetting_g, 4); gd.addNumericField("Blue gain in the center of sensor calibration B (instead of vignetting)",this.novignetting_b, 4); gd.addNumericField("Value (max) in vignetting data to correspond to 1x in the kernel",this.vignetting_max, 3); gd.addNumericField("Do not try to correct vignetting smaller than this fraction of max",this.vignetting_range, 3); gd.addCheckbox ("Use DCT-base color conversion", this.color_DCT ); Loading Loading @@ -2047,8 +2071,12 @@ public class EyesisCorrectionParameters { this.kernel_chn= (int) gd.getNextNumber(); this.normalize= gd.getNextBoolean(); this.normalize_sym= gd.getNextBoolean(); this.antiwindow= gd.getNextBoolean(); this.skip_sym= gd.getNextBoolean(); this.convolve_direct= gd.getNextBoolean(); this.novignetting_r= gd.getNextNumber(); this.novignetting_g= gd.getNextNumber(); this.novignetting_b= gd.getNextNumber(); this.vignetting_max= gd.getNextNumber(); this.vignetting_range= gd.getNextNumber(); this.color_DCT= gd.getNextBoolean(); Loading
src/main/java/EyesisDCT.java +36 −1 Original line number Diff line number Diff line Loading @@ -706,6 +706,13 @@ public class EyesisDCT { norm_sym_weights[i*dct_size+j] = d; } } double [] inv_window = new double [dct_size*dct_size]; for (int i = 0; i < dct_size; i++){ for (int j = 0; j < dct_size; j++){ double d = 1.0 / (Math.cos(Math.PI*i/(2*dct_size))*Math.cos(Math.PI*j/(2*dct_size))); inv_window[i*dct_size+j] = d; } } if (debugLevel>0) { System.out.println("readDCTKernels() debugLevel = "+debugLevel+ Loading Loading @@ -778,6 +785,15 @@ public class EyesisDCT { i * dct_size, dct_size); } // sym_kernel pre-compensation for window function if (dct_parameters.antiwindow) { for (int i=0; i < kernels[chn].st_kernels[nc][tileY][tileX].length;i++) { kernels[chn].st_kernels[nc][tileY][tileX][i] *= inv_window[i]; } } if (scale_asym != 1.0){ for (int i=0; i < kernels[chn].st_kernels[nc][tileY][tileX].length;i++) { kernels[chn].st_kernels[nc][tileY][tileX][i] *= scale_asym; Loading Loading @@ -1123,7 +1139,23 @@ public class EyesisDCT { if (d > max_vign_corr) d = max_vign_corr; pixels[i]*=d; } } else { // assuming GR/BG pattern System.out.println("Applying fixed color gain correction parameters: Gr="+ dct_parameters.novignetting_r+", Gg="+dct_parameters.novignetting_g+", Gb="+dct_parameters.novignetting_b); float [] pixels=(float []) imp_src.getProcessor().getPixels(); int width = imp_src.getWidth(); int height = imp_src.getHeight(); double kr = 1.0/dct_parameters.novignetting_r; double kg = 1.0/dct_parameters.novignetting_g; double kb = 1.0/dct_parameters.novignetting_b; for (int y = 0; y < height-1; y+=2){ for (int x = 0; x < width-1; x+=2){ pixels[y*width+x ] *= kg; pixels[y*width+x+width+1] *= kg; pixels[y*width+x +1] *= kr; pixels[y*width+x+width ] *= kb; } } } String title=name+"-"+String.format("%02d", channel); ImagePlus result=imp_src; Loading Loading @@ -1183,6 +1215,9 @@ public class EyesisDCT { threadsMax, debugLevel); } //TODO: Scale up 2x to match color processed (or scale up lpf?) } int tilesY = stack.getHeight()/dct_parameters.dct_size - 1; Loading