exclude tiles with too low variance from calculation of dual demosaic contrast threshold

This commit is contained in:
heckflosse 2018-12-07 22:07:56 +01:00
parent d9d8005706
commit 3f606c776a

View File

@ -304,6 +304,7 @@ void buildBlendMask(float** luminance, float **blend, int W, int H, float &contr
if (autoContrast) { if (autoContrast) {
constexpr float minLuminance = 2000.f; constexpr float minLuminance = 2000.f;
constexpr float maxLuminance = 20000.f; constexpr float maxLuminance = 20000.f;
constexpr float minTileVariance = 0.5f;
for (int pass = 0; pass < 2; ++pass) { for (int pass = 0; pass < 2; ++pass) {
const int tilesize = 80 / (pass + 1); const int tilesize = 80 / (pass + 1);
const int skip = pass == 0 ? tilesize : tilesize / 4; const int skip = pass == 0 ? tilesize : tilesize / 4;
@ -325,6 +326,8 @@ void buildBlendMask(float** luminance, float **blend, int W, int H, float &contr
continue; continue;
} else { } else {
variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg); variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg);
// exclude tiles with a variance less than minTileVariance
variances[i][j] = variances[i][j] < minTileVariance ? RT_INFINITY_F : variances[i][j];
} }
} }
} }
@ -341,10 +344,9 @@ void buildBlendMask(float** luminance, float **blend, int W, int H, float &contr
} }
} }
const int minY = skip * minI;
const int minX = skip * minJ;
if (minvar <= 1.f || pass == 1) { if (minvar <= 1.f || pass == 1) {
const int minY = skip * minI;
const int minX = skip * minJ;
if (pass == 0) { if (pass == 0) {
// a variance <= 1 means we already found a flat region and can skip second pass // a variance <= 1 means we already found a flat region and can skip second pass
contrastThreshold = calcContrastThreshold(luminance, minY, minX, tilesize); contrastThreshold = calcContrastThreshold(luminance, minY, minX, tilesize);
@ -374,6 +376,8 @@ void buildBlendMask(float** luminance, float **blend, int W, int H, float &contr
continue; continue;
} else { } else {
variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg); variances[i][j] = tileVariance(luminance, tileY, tileX, tilesize, avg);
// exclude tiles with a variance less than minTileVariance
variances[i][j] = variances[i][j] < minTileVariance ? RT_INFINITY_F : variances[i][j];
} }
} }
} }