pixelshift: new version of adapaptive motion detection

This commit is contained in:
heckflosse
2016-11-24 19:01:33 +01:00
parent d83834d4e6
commit 1fcbdd8966

View File

@@ -41,13 +41,17 @@ float greenDiff(float a, float b, bool adaptive, float scale, float stddevFactor
// 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 diff = std::fabs(a - b) / maxVal;
float gDiff = std::fabs(a - b);
float diff = gDiff / maxVal;
if(adaptive) {
float avg = (a+b)/2.f;
avg *= scale; // revert the colour scaling
prnu *= (avg * eperIso);
float stddev = sqrtf(avg * eperIso + nreadIso * nreadIso + prnu * prnu);
float korr = stddevFactor * stddev / (maxVal * scale);
avg *= eperIso;
prnu *= avg;
float stddev = sqrtf(avg + nreadIso * nreadIso + prnu * prnu);
// float korr = stddevFactor * stddev / (a * scale); // V0: use G1 not scaled by eperIso
// float korr = stddevFactor * stddev / (maxVal * scale); // V1: use max(G1,G2) not scaled by eperIso
float korr = stddevFactor * stddev / (gDiff / (eperIso * scale)); // V2: use absolute difference abs(G1-G2) scaled by eperISo
diff -= korr;
}
return diff;
@@ -72,12 +76,14 @@ void RawImageSource::pixelshift_simple(int winx, int winy, int winw, int winh, b
gridSize += ((gridSize & 1) == 0 ? 1 : 0);
// Lookup table for non adaptive (slider) mode
LUTf log2Lut(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE);
log2Lut[0] = 0;
const float lutStrength = 2.f;
if(detectMotion && !adaptive) {
const float lutStrength = 2.f;
log2Lut[0] = 0;
for(int i=2; i < 65536; i+=2)
log2Lut[i>>1] = lutStrength * log2(i) / 100.f;
}
const float scaleGreen = 1.f / scale_mul[1];
for(int i=2; i < 65536; i+=2)
log2Lut[i>>1] = 2.f * log2(i) / 100.f;
eperIso *= (idata->getISOSpeed() / 100);
prnu /= 100.f;