pixelshift: simplified calculation of adaptive detection

This commit is contained in:
heckflosse 2016-11-25 13:56:40 +01:00
parent 39a02ea827
commit 802e798661

View File

@ -39,24 +39,21 @@ namespace
float greenDiff(float a, float b, bool adaptive, float scale, float stddevFactor, float eperIso, float nreadIso, float prnu) float greenDiff(float a, float b, bool adaptive, float scale, float stddevFactor, float eperIso, float nreadIso, float prnu)
{ {
// calculate the difference between to green samples // calculate the difference between to green samples
// add a small epsilon to avoid division by zero
float maxVal = std::max(a, b) + 0.01f;
float gDiff = std::fabs(a - b); float gDiff = std::fabs(a - b);
float diff = gDiff / maxVal;
if(adaptive) { if(adaptive) {
float avg = (a + b) / 2.f; float avg = (a + b) / 2.f;
avg *= scale; // revert the colour scaling avg *= scale; // revert the colour scaling
avg *= eperIso; avg *= eperIso;
prnu *= avg; prnu *= avg;
float stddev = sqrtf(avg + nreadIso * nreadIso + prnu * prnu); float stddev = stddevFactor * sqrtf(avg + nreadIso * nreadIso + prnu * prnu);
// float korr = stddevFactor * stddev / (a * scale); // V0: use G1 not scaled by eperIso gDiff *= scale;
float korr = stddevFactor * stddev / (maxVal * scale); // V1: use max(G1,G2) not scaled by eperIso gDiff *= eperIso;
// float korr = stddevFactor * stddev / (gDiff / (eperIso * scale)); // V2: use absolute difference abs(G1-G2) scaled by eperISo return gDiff - stddev;
// float korr = stddevFactor * stddev / (gDiff * eperIso * scale); // V3: corrected version of V2 } else {
// float korr = stddevFactor * stddev / (maxVal * scale * eperIso); // V4: use max(G1,G2) scaled by eperIso // add a small epsilon to avoid division by zero
diff -= korr; float maxVal = std::max(a, b) + 0.01f;
return gDiff / maxVal;
} }
return diff;
} }
} }
@ -87,7 +84,9 @@ void RawImageSource::pixelshift_simple(int winx, int winy, int winw, int winh, b
log2Lut[i>>1] = lutStrength * log2(i) / 100.f; log2Lut[i>>1] = lutStrength * log2(i) / 100.f;
} }
const float scaleGreen = 1.f / scale_mul[1]; const float scaleGreen = 1.f / scale_mul[1];
eperIso *= (idata->getISOSpeed() / 100.f);
eperIso *= (100.f / idata->getISOSpeed());
prnu /= 100.f; prnu /= 100.f;
// If the values of two corresponding green pixels differ my more then motionThreshold %, the pixel will be treated as a badGreen pixel // If the values of two corresponding green pixels differ my more then motionThreshold %, the pixel will be treated as a badGreen pixel