Loading app/src/main/java/net/sourceforge/opencamera/HDRProcessor.java +49 −67 Original line number Diff line number Diff line Loading @@ -1310,7 +1310,6 @@ public class HDRProcessor { Log.d(TAG, "zoom_factor: " + zoom_factor); } Allocation allocation_new = null; Allocation allocation_avg = allocation_out; boolean free_allocation_avg = false; Loading @@ -1320,19 +1319,17 @@ public class HDRProcessor { offsets_y = new int[2]; boolean floating_point = bitmap_avg == null; { boolean floating_point_align = floating_point; boolean floating_point_align; // perform auto-alignment List<Bitmap> align_bitmaps = new ArrayList<>(); Allocation [] allocations = new Allocation[2]; Bitmap bitmap_new_align = null; Allocation allocation_new_align = null; int alignment_width = width; int alignment_height = height; Bitmap bitmap_new_align; Allocation allocation_new_align; int alignment_width; int alignment_height; int full_alignment_width = width; int full_alignment_height = height; //final boolean scale_align = false; final boolean scale_align = true; //final int scale_align_size = 2; //final int scale_align_size = 4; //final int scale_align_size = Math.max(4 / this.cached_avg_sample_size, 1); Loading @@ -1342,7 +1339,7 @@ public class HDRProcessor { if( MyDebug.LOG ) Log.d(TAG, "scale_align_size: " + scale_align_size); boolean crop_to_centre = true; if( scale_align ) { { // use scaled down and/or cropped bitmaps for alignment if( MyDebug.LOG ) Log.d(TAG, "### time before creating allocations for autoalignment: " + (System.currentTimeMillis() - time_s)); Loading Loading @@ -1390,19 +1387,6 @@ public class HDRProcessor { if( MyDebug.LOG ) Log.d(TAG, "### time after creating allocations for autoalignment: " + (System.currentTimeMillis() - time_s)); } else { if( allocation_avg == null ) { allocation_avg = Allocation.createFromBitmap(rs, bitmap_avg); free_allocation_avg = true; } allocation_new = Allocation.createFromBitmap(rs, bitmap_new); if( MyDebug.LOG ) Log.d(TAG, "### time after creating allocations from bitmaps: " + (System.currentTimeMillis() - time_s)); align_bitmaps.add(bitmap_avg); align_bitmaps.add(bitmap_new); allocations[0] = allocation_avg; allocations[1] = allocation_new; } // misalignment more likely in "dark" images with more images and/or longer exposures // using max_align_scale=2 needed to prevent misalignment in testAvg51; also helps testAvg14 Loading @@ -1426,7 +1410,7 @@ public class HDRProcessor { processAvgScript.set_allocation_diffs(allocation_diffs); */ if( scale_align ) { { for(int i=0;i<offsets_x.length;i++) { offsets_x[i] *= scale_align_size; } Loading Loading @@ -1467,6 +1451,45 @@ public class HDRProcessor { // write new avg image // higher wiener_C (and higher wiener_cutoff_factor) means more averaging (but more risk of ghosting) // if changing this, pay close attention to tests testAvg6, testAvg8, testAvg17, testAvg23 float limited_iso = Math.min(iso, 400); float wiener_cutoff_factor = 1.0f; if( iso >= 700 ) { // helps reduce speckles in testAvg17, testAvg23, testAvg33, testAvg36, testAvg38 // using this level for testAvg31 (ISO 609) would increase ghosting //limited_iso = 500; limited_iso = 800; if( iso >= 1100 ) { // helps further reduce speckles in testAvg17, testAvg38 // but don't do for iso >= 700 as makes "vicks" text in testAvg23 slightly more blurred wiener_cutoff_factor = 8.0f; } } limited_iso = Math.max(limited_iso, 100); float wiener_C = 10.0f * limited_iso; //float wiener_C = 1000.0f; //float wiener_C = 4000.0f; // Tapering the wiener scale means that we do more averaging for earlier images in the stack, the // logic being we'll have more chance of ghosting or misalignment with later images. // This helps: testAvg31, testAvg33. // Also slightly helps testAvg17, testAvg23 (slightly less white speckle on tv), testAvg28 // (one less white speckle on face). // Note that too much tapering risks increasing ghosting in testAvg26, testAvg39. float tapered_wiener_scale = 1.0f - (float)Math.pow(0.5, avg_factor); if( MyDebug.LOG ) { Log.d(TAG, "avg_factor: " + avg_factor); Log.d(TAG, "tapered_wiener_scale: " + tapered_wiener_scale); } wiener_C /= tapered_wiener_scale; float wiener_C_cutoff = wiener_cutoff_factor * wiener_C; if( MyDebug.LOG ) { Log.d(TAG, "wiener_C: " + wiener_C); Log.d(TAG, "wiener_cutoff_factor: " + wiener_cutoff_factor); } // create RenderScript if( processAvgScript == null ) { processAvgScript = new ScriptC_process_avg(rs); Loading @@ -1492,11 +1515,9 @@ public class HDRProcessor { first = false; }*/ if( allocation_new == null ) { allocation_new = Allocation.createFromBitmap(rs, bitmap_new); Allocation allocation_new = Allocation.createFromBitmap(rs, bitmap_new); if( MyDebug.LOG ) Log.d(TAG, "### time after creating allocation_new from bitmap: " + (System.currentTimeMillis() - time_s)); } // set allocations Loading @@ -1523,45 +1544,6 @@ public class HDRProcessor { // set globals processAvgScript.set_avg_factor(avg_factor); // higher wiener_C (and higher wiener_cutoff_factor) means more averaging (but more risk of ghosting) // if changing this, pay close attention to tests testAvg6, testAvg8, testAvg17, testAvg23 float limited_iso = Math.min(iso, 400); float wiener_cutoff_factor = 1.0f; if( iso >= 700 ) { // helps reduce speckles in testAvg17, testAvg23, testAvg33, testAvg36, testAvg38 // using this level for testAvg31 (ISO 609) would increase ghosting //limited_iso = 500; limited_iso = 800; if( iso >= 1100 ) { // helps further reduce speckles in testAvg17, testAvg38 // but don't do for iso >= 700 as makes "vicks" text in testAvg23 slightly more blurred wiener_cutoff_factor = 8.0f; } } limited_iso = Math.max(limited_iso, 100); float wiener_C = 10.0f * limited_iso; //float wiener_C = 1000.0f; //float wiener_C = 4000.0f; // Tapering the wiener scale means that we do more averaging for earlier images in the stack, the // logic being we'll have more chance of ghosting or misalignment with later images. // This helps: testAvg31, testAvg33. // Also slightly helps testAvg17, testAvg23 (slightly less white speckle on tv), testAvg28 // (one less white speckle on face). // Note that too much tapering risks increasing ghosting in testAvg26, testAvg39. float tapered_wiener_scale = 1.0f - (float)Math.pow(0.5, avg_factor); if( MyDebug.LOG ) { Log.d(TAG, "avg_factor: " + avg_factor); Log.d(TAG, "tapered_wiener_scale: " + tapered_wiener_scale); } wiener_C /= tapered_wiener_scale; float wiener_C_cutoff = wiener_cutoff_factor * wiener_C; if( MyDebug.LOG ) { Log.d(TAG, "wiener_C: " + wiener_C); Log.d(TAG, "wiener_cutoff_factor: " + wiener_cutoff_factor); } processAvgScript.set_wiener_C(wiener_C); processAvgScript.set_wiener_C_cutoff(wiener_C_cutoff); Loading Loading
app/src/main/java/net/sourceforge/opencamera/HDRProcessor.java +49 −67 Original line number Diff line number Diff line Loading @@ -1310,7 +1310,6 @@ public class HDRProcessor { Log.d(TAG, "zoom_factor: " + zoom_factor); } Allocation allocation_new = null; Allocation allocation_avg = allocation_out; boolean free_allocation_avg = false; Loading @@ -1320,19 +1319,17 @@ public class HDRProcessor { offsets_y = new int[2]; boolean floating_point = bitmap_avg == null; { boolean floating_point_align = floating_point; boolean floating_point_align; // perform auto-alignment List<Bitmap> align_bitmaps = new ArrayList<>(); Allocation [] allocations = new Allocation[2]; Bitmap bitmap_new_align = null; Allocation allocation_new_align = null; int alignment_width = width; int alignment_height = height; Bitmap bitmap_new_align; Allocation allocation_new_align; int alignment_width; int alignment_height; int full_alignment_width = width; int full_alignment_height = height; //final boolean scale_align = false; final boolean scale_align = true; //final int scale_align_size = 2; //final int scale_align_size = 4; //final int scale_align_size = Math.max(4 / this.cached_avg_sample_size, 1); Loading @@ -1342,7 +1339,7 @@ public class HDRProcessor { if( MyDebug.LOG ) Log.d(TAG, "scale_align_size: " + scale_align_size); boolean crop_to_centre = true; if( scale_align ) { { // use scaled down and/or cropped bitmaps for alignment if( MyDebug.LOG ) Log.d(TAG, "### time before creating allocations for autoalignment: " + (System.currentTimeMillis() - time_s)); Loading Loading @@ -1390,19 +1387,6 @@ public class HDRProcessor { if( MyDebug.LOG ) Log.d(TAG, "### time after creating allocations for autoalignment: " + (System.currentTimeMillis() - time_s)); } else { if( allocation_avg == null ) { allocation_avg = Allocation.createFromBitmap(rs, bitmap_avg); free_allocation_avg = true; } allocation_new = Allocation.createFromBitmap(rs, bitmap_new); if( MyDebug.LOG ) Log.d(TAG, "### time after creating allocations from bitmaps: " + (System.currentTimeMillis() - time_s)); align_bitmaps.add(bitmap_avg); align_bitmaps.add(bitmap_new); allocations[0] = allocation_avg; allocations[1] = allocation_new; } // misalignment more likely in "dark" images with more images and/or longer exposures // using max_align_scale=2 needed to prevent misalignment in testAvg51; also helps testAvg14 Loading @@ -1426,7 +1410,7 @@ public class HDRProcessor { processAvgScript.set_allocation_diffs(allocation_diffs); */ if( scale_align ) { { for(int i=0;i<offsets_x.length;i++) { offsets_x[i] *= scale_align_size; } Loading Loading @@ -1467,6 +1451,45 @@ public class HDRProcessor { // write new avg image // higher wiener_C (and higher wiener_cutoff_factor) means more averaging (but more risk of ghosting) // if changing this, pay close attention to tests testAvg6, testAvg8, testAvg17, testAvg23 float limited_iso = Math.min(iso, 400); float wiener_cutoff_factor = 1.0f; if( iso >= 700 ) { // helps reduce speckles in testAvg17, testAvg23, testAvg33, testAvg36, testAvg38 // using this level for testAvg31 (ISO 609) would increase ghosting //limited_iso = 500; limited_iso = 800; if( iso >= 1100 ) { // helps further reduce speckles in testAvg17, testAvg38 // but don't do for iso >= 700 as makes "vicks" text in testAvg23 slightly more blurred wiener_cutoff_factor = 8.0f; } } limited_iso = Math.max(limited_iso, 100); float wiener_C = 10.0f * limited_iso; //float wiener_C = 1000.0f; //float wiener_C = 4000.0f; // Tapering the wiener scale means that we do more averaging for earlier images in the stack, the // logic being we'll have more chance of ghosting or misalignment with later images. // This helps: testAvg31, testAvg33. // Also slightly helps testAvg17, testAvg23 (slightly less white speckle on tv), testAvg28 // (one less white speckle on face). // Note that too much tapering risks increasing ghosting in testAvg26, testAvg39. float tapered_wiener_scale = 1.0f - (float)Math.pow(0.5, avg_factor); if( MyDebug.LOG ) { Log.d(TAG, "avg_factor: " + avg_factor); Log.d(TAG, "tapered_wiener_scale: " + tapered_wiener_scale); } wiener_C /= tapered_wiener_scale; float wiener_C_cutoff = wiener_cutoff_factor * wiener_C; if( MyDebug.LOG ) { Log.d(TAG, "wiener_C: " + wiener_C); Log.d(TAG, "wiener_cutoff_factor: " + wiener_cutoff_factor); } // create RenderScript if( processAvgScript == null ) { processAvgScript = new ScriptC_process_avg(rs); Loading @@ -1492,11 +1515,9 @@ public class HDRProcessor { first = false; }*/ if( allocation_new == null ) { allocation_new = Allocation.createFromBitmap(rs, bitmap_new); Allocation allocation_new = Allocation.createFromBitmap(rs, bitmap_new); if( MyDebug.LOG ) Log.d(TAG, "### time after creating allocation_new from bitmap: " + (System.currentTimeMillis() - time_s)); } // set allocations Loading @@ -1523,45 +1544,6 @@ public class HDRProcessor { // set globals processAvgScript.set_avg_factor(avg_factor); // higher wiener_C (and higher wiener_cutoff_factor) means more averaging (but more risk of ghosting) // if changing this, pay close attention to tests testAvg6, testAvg8, testAvg17, testAvg23 float limited_iso = Math.min(iso, 400); float wiener_cutoff_factor = 1.0f; if( iso >= 700 ) { // helps reduce speckles in testAvg17, testAvg23, testAvg33, testAvg36, testAvg38 // using this level for testAvg31 (ISO 609) would increase ghosting //limited_iso = 500; limited_iso = 800; if( iso >= 1100 ) { // helps further reduce speckles in testAvg17, testAvg38 // but don't do for iso >= 700 as makes "vicks" text in testAvg23 slightly more blurred wiener_cutoff_factor = 8.0f; } } limited_iso = Math.max(limited_iso, 100); float wiener_C = 10.0f * limited_iso; //float wiener_C = 1000.0f; //float wiener_C = 4000.0f; // Tapering the wiener scale means that we do more averaging for earlier images in the stack, the // logic being we'll have more chance of ghosting or misalignment with later images. // This helps: testAvg31, testAvg33. // Also slightly helps testAvg17, testAvg23 (slightly less white speckle on tv), testAvg28 // (one less white speckle on face). // Note that too much tapering risks increasing ghosting in testAvg26, testAvg39. float tapered_wiener_scale = 1.0f - (float)Math.pow(0.5, avg_factor); if( MyDebug.LOG ) { Log.d(TAG, "avg_factor: " + avg_factor); Log.d(TAG, "tapered_wiener_scale: " + tapered_wiener_scale); } wiener_C /= tapered_wiener_scale; float wiener_C_cutoff = wiener_cutoff_factor * wiener_C; if( MyDebug.LOG ) { Log.d(TAG, "wiener_C: " + wiener_C); Log.d(TAG, "wiener_cutoff_factor: " + wiener_cutoff_factor); } processAvgScript.set_wiener_C(wiener_C); processAvgScript.set_wiener_C_cutoff(wiener_C_cutoff); Loading