0
0
mirror of https://git.code.sf.net/p/opencamera/code.git synced 2024-09-19 19:42:29 +02:00

Apply improvement for low light to hdr_n().

This commit is contained in:
Mark Harman 2023-01-23 21:45:33 +00:00
parent 3a7446a039
commit 72486aa87a
2 changed files with 35 additions and 11 deletions

View File

@ -450,7 +450,8 @@ public class InstrumentedTest {
TestUtils.checkHDROffsets(activity, exp_offsets_x, exp_offsets_y);
//checkHistogramDetails(hdrHistogramDetails, 3, 43, 251);
checkHistogramDetails(hdrHistogramDetails, 6, 42, 251);
//checkHistogramDetails(hdrHistogramDetails, 6, 42, 251);
checkHistogramDetails(hdrHistogramDetails, 6, 49, 252);
});
}
@ -1006,7 +1007,8 @@ public class InstrumentedTest {
int [] exp_offsets_y = {0, 0};
TestUtils.checkHDROffsets(activity, exp_offsets_x, exp_offsets_y);
checkHistogramDetails(hdrHistogramDetails, 33, 78, 250);
//checkHistogramDetails(hdrHistogramDetails, 33, 78, 250);
checkHistogramDetails(hdrHistogramDetails, 17, 75, 250);
});
}
@ -1085,7 +1087,8 @@ public class InstrumentedTest {
int [] exp_offsets_y = {0, 0, 0, 0};
TestUtils.checkHDROffsets(activity, exp_offsets_x, exp_offsets_y);
checkHistogramDetails(hdrHistogramDetails, 31, 75, 254);
//checkHistogramDetails(hdrHistogramDetails, 31, 75, 254);
checkHistogramDetails(hdrHistogramDetails, 23, 74, 254);
});
}
@ -1115,7 +1118,8 @@ public class InstrumentedTest {
//checkHistogramDetails(hdrHistogramDetails, 17, 81, 255);
//checkHistogramDetails(hdrHistogramDetails, 28, 82, 255);
checkHistogramDetails(hdrHistogramDetails, 21, 74, 255);
//checkHistogramDetails(hdrHistogramDetails, 21, 74, 255);
checkHistogramDetails(hdrHistogramDetails, 17, 74, 255);
});
}
@ -1144,7 +1148,8 @@ public class InstrumentedTest {
int [] exp_offsets_y = {0, 0, 0, 0, 0, 0};
TestUtils.checkHDROffsets(activity, exp_offsets_x, exp_offsets_y);
checkHistogramDetails(hdrHistogramDetails, 32, 76, 254);
//checkHistogramDetails(hdrHistogramDetails, 32, 76, 254);
checkHistogramDetails(hdrHistogramDetails, 25, 75, 254);
});
}
@ -1934,7 +1939,8 @@ public class InstrumentedTest {
TestUtils.HistogramDetails hdrHistogramDetails = TestUtils.subTestHDR(activity, inputs, "testHDR47_exp5_output.jpg", false, -1, -1);
checkHistogramDetails(hdrHistogramDetails, 1, 73, 255);
//checkHistogramDetails(hdrHistogramDetails, 1, 73, 255);
checkHistogramDetails(hdrHistogramDetails, 1, 80, 255);
});
}
@ -1961,7 +1967,8 @@ public class InstrumentedTest {
TestUtils.HistogramDetails hdrHistogramDetails = TestUtils.subTestHDR(activity, inputs, "testHDR47_exp7_output.jpg", false, -1, -1);
checkHistogramDetails(hdrHistogramDetails, 1, 73, 255);
//checkHistogramDetails(hdrHistogramDetails, 1, 73, 255);
checkHistogramDetails(hdrHistogramDetails, 1, 80, 255);
});
}
@ -2010,7 +2017,8 @@ public class InstrumentedTest {
TestUtils.HistogramDetails hdrHistogramDetails = TestUtils.subTestHDR(activity, inputs, "testHDR48_exp5_output.jpg", false, -1, -1);
checkHistogramDetails(hdrHistogramDetails, 0, 59, 241);
//checkHistogramDetails(hdrHistogramDetails, 0, 59, 241);
checkHistogramDetails(hdrHistogramDetails, 0, 67, 241);
});
}
@ -2031,7 +2039,8 @@ public class InstrumentedTest {
TestUtils.HistogramDetails hdrHistogramDetails = TestUtils.subTestHDR(activity, inputs, "testHDR49_exp2_output.jpg", false, -1, -1);
checkHistogramDetails(hdrHistogramDetails, 12, 120, 251);
//checkHistogramDetails(hdrHistogramDetails, 12, 120, 251);
checkHistogramDetails(hdrHistogramDetails, 0, 122, 251);
});
}
@ -2103,7 +2112,8 @@ public class InstrumentedTest {
TestUtils.HistogramDetails hdrHistogramDetails = TestUtils.subTestHDR(activity, inputs, "testHDR49_exp5_output.jpg", false, -1, -1);
//checkHistogramDetails(hdrHistogramDetails, 0, 72, 244);
checkHistogramDetails(hdrHistogramDetails, 0, 78, 243);
//checkHistogramDetails(hdrHistogramDetails, 0, 78, 243);
checkHistogramDetails(hdrHistogramDetails, 0, 87, 243);
});
}

View File

@ -520,7 +520,18 @@ uchar4 __attribute__((kernel)) hdr_n(uchar4 in, uint32_t x, uint32_t y) {
float avg = (rgb.r+rgb.g+rgb.b) / 3.0f;
float diff = fabs( avg - 127.5f );
float weight = 1.0f;
if( diff > safe_range_c ) {
if( avg <= 127.5f ) {
// see comment for corresponding code in hdr()
const float range_low_c = 32.0f;
const float range_high_c = 48.0f;
if( avg <= range_low_c ) {
weight = 0.0f;
}
else if( avg <= range_high_c ) {
weight = (avg - range_low_c) / (range_high_c - range_low_c);
}
}
else if( diff > safe_range_c ) {
// scaling chosen so that 0 and 255 map to a non-zero weight of 0.01
weight = 1.0f - 0.99f * (diff - safe_range_c) / (127.5f - safe_range_c);
}
@ -569,6 +580,9 @@ uchar4 __attribute__((kernel)) hdr_n(uchar4 in, uint32_t x, uint32_t y) {
// there will be at least one more adjacent image to look at
avg = (rgb.r+rgb.g+rgb.b) / 3.0f;
diff = fabs( avg - 127.5f );
// n.b., we don't have the codepath here for "if( avg <= 127.5f )" - causes problems
// for testHDR_exp5 (black blotches)
if( diff > safe_range_c ) {
// scaling chosen so that 0 and 255 map to a non-zero weight of 0.01
weight *= 1.0f - 0.99f * (diff - safe_range_c) / (127.5f - safe_range_c);