pixelshift: fixed wrong weight of red/blue in 3x3new
This commit is contained in:
@@ -1040,7 +1040,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
const bool skip = (gridSize_ == RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2);
|
const bool skip = (gridSize_ == RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2);
|
||||||
int gridSize = 1;
|
int gridSize = 1;
|
||||||
bool nOf3x3 = false;
|
bool nOf3x3 = false;
|
||||||
|
|
||||||
switch (gridSize_) {
|
switch (gridSize_) {
|
||||||
case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x1:
|
case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x1:
|
||||||
case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2:
|
case RAWParams::BayerSensor::ePSMotionCorrection::Grid1x2:
|
||||||
@@ -1064,6 +1063,14 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
nOf3x3 = true;
|
nOf3x3 = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if(adaptive && blurMap && nOf3x3 && smoothFactor == 0.f && !showMotion) {
|
||||||
|
if(plistener) {
|
||||||
|
plistener->setProgress(1.0);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Lookup table for non adaptive (slider) mode
|
// Lookup table for non adaptive (slider) mode
|
||||||
LUTf log2Lut(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE);
|
LUTf log2Lut(32768, LUT_CLIP_BELOW | LUT_CLIP_ABOVE);
|
||||||
|
|
||||||
@@ -1151,15 +1158,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
array2D<float> psG1(winw + 32, winh);
|
array2D<float> psG1(winw + 32, winh);
|
||||||
array2D<float> psG2(winw + 32, winh);
|
array2D<float> psG2(winw + 32, winh);
|
||||||
array2D<float> psBlue(winw + 32, winh);
|
array2D<float> psBlue(winw + 32, winh);
|
||||||
array2D<float> psMask(winw, winh);
|
|
||||||
|
|
||||||
// Fill the mask with value 1.0
|
|
||||||
// We work in 1.0 to 2.0 range to avoid performance issues caused by denormal numbers in gaussian blur
|
|
||||||
for(int i = 0; i < winh; ++i) {
|
|
||||||
for(int j = 0; j < winw; ++j) {
|
|
||||||
psMask[i][j] = 1.f;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// fill channels psRed, psG1, psG2 and psBlue
|
// fill channels psRed, psG1, psG2 and psBlue
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
@@ -1200,6 +1198,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
|
|
||||||
float pixelcount = ((winh - (border + offsY) - (winy + border - offsY)) * (winw - (border + offsX) - (winx + border - offsX))) / 2.f;
|
float pixelcount = ((winh - (border + offsY) - (winy + border - offsY)) * (winw - (border + offsX) - (winx + border - offsX))) / 2.f;
|
||||||
|
|
||||||
|
array2D<float> psMask(winw, winh);
|
||||||
|
|
||||||
|
|
||||||
#ifdef _OPENMP
|
#ifdef _OPENMP
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
#endif
|
#endif
|
||||||
@@ -1323,10 +1324,10 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
|
|
||||||
// offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop
|
// offset to keep the code short. It changes its value between 0 and 1 for each iteration of the loop
|
||||||
unsigned int offset = (c & 1);
|
unsigned int offset = (c & 1);
|
||||||
// offset ^= 1; // 0 => 1 or 1 => 0
|
|
||||||
|
|
||||||
for(; j < winw - (border + offsX); ++j) {
|
for(; j < winw - (border + offsX); ++j) {
|
||||||
bool greenFromPs = false;
|
psMask[i][j] = 1.f;
|
||||||
|
|
||||||
offset ^= 1; // 0 => 1 or 1 => 0
|
offset ^= 1; // 0 => 1 or 1 => 0
|
||||||
|
|
||||||
if(detectMotion || (adaptive && checkGreen)) {
|
if(detectMotion || (adaptive && checkGreen)) {
|
||||||
@@ -1345,6 +1346,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
});
|
});
|
||||||
// calculate maximum of whole grid by calculating maximum of grid column max values
|
// calculate maximum of whole grid by calculating maximum of grid column max values
|
||||||
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2]});
|
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2]});
|
||||||
|
// adjust index for next column
|
||||||
|
lastIndex ++;
|
||||||
|
lastIndex = lastIndex == gridSize ? 0 : lastIndex;
|
||||||
} else if(gridSize == 5) {
|
} else if(gridSize == 5) {
|
||||||
// compute maximum of differences for fifth column of 5x5 grid and save at position lastIndex
|
// compute maximum of differences for fifth column of 5x5 grid and save at position lastIndex
|
||||||
greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 2][j + 2], psG2[i - 2][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
|
greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 2][j + 2], psG2[i - 2][j + 2], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
|
||||||
@@ -1355,6 +1359,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
});
|
});
|
||||||
// calculate maximum of whole grid by calculating maximum of grid column max values
|
// calculate maximum of whole grid by calculating maximum of grid column max values
|
||||||
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4]});
|
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4]});
|
||||||
|
// adjust index for next column
|
||||||
|
lastIndex ++;
|
||||||
|
lastIndex = lastIndex == gridSize ? 0 : lastIndex;
|
||||||
} else if(gridSize == 7) {
|
} else if(gridSize == 7) {
|
||||||
// compute maximum of differences for 7th column of 7x7 grid and save at position lastIndex
|
// compute maximum of differences for 7th column of 7x7 grid and save at position lastIndex
|
||||||
greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 3][j + 3], psG2[i - 3][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
|
greenDifMax[lastIndex] = std::max({greenDiff(psG1[i - 3][j + 3], psG2[i - 3][j + 3], adaptive, stddevFactorGreen, eperIsoGreen, nRead, prnu, showMotion, j, i),
|
||||||
@@ -1367,13 +1374,11 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
});
|
});
|
||||||
// calculate maximum of whole grid by calculating maximum of grid column max values
|
// calculate maximum of whole grid by calculating maximum of grid column max values
|
||||||
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4], greenDifMax[5], greenDifMax[6]});
|
gridMax = std::max({greenDifMax[0], greenDifMax[1], greenDifMax[2], greenDifMax[3], greenDifMax[4], greenDifMax[5], greenDifMax[6]});
|
||||||
|
// adjust index for next column
|
||||||
|
lastIndex ++;
|
||||||
|
lastIndex = lastIndex == gridSize ? 0 : lastIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// adjust index for next column
|
|
||||||
lastIndex ++;
|
|
||||||
lastIndex = lastIndex == gridSize ? 0 : lastIndex;
|
|
||||||
|
|
||||||
if(!adaptive) {
|
if(!adaptive) {
|
||||||
// increase motion detection dependent on brightness
|
// increase motion detection dependent on brightness
|
||||||
korr = log2Lut[((int)(psG1[i][j] * scaleGreen)) >> 1];
|
korr = log2Lut[((int)(psG1[i][j] * scaleGreen)) >> 1];
|
||||||
@@ -1391,7 +1396,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
green[i + offsY][j + offsX] = blueRow ? psG2[i][j] : psG1[i][j];;
|
green[i + offsY][j + offsX] = blueRow ? psG2[i][j] : psG1[i][j];;
|
||||||
}
|
}
|
||||||
|
|
||||||
continue;
|
|
||||||
} else {
|
} else {
|
||||||
// at least one of the tested green pixels of the grid is detected as motion
|
// at least one of the tested green pixels of the grid is detected as motion
|
||||||
paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
|
paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
|
||||||
@@ -1401,10 +1405,9 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
j++;
|
j++;
|
||||||
paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
|
paintMotionMask(j + offsX, showMotion, (gridMax - thresh + korr) * blendFactor, showOnlyMask, greenDest, redDest, blueDest);
|
||||||
}
|
}
|
||||||
|
|
||||||
// do not set the motion pixel values. They have already been set by demosaicer or showMotion
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
// do not set the motion pixel values. They have already been set by demosaicer or showMotion
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1592,20 +1595,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(experimental0) { // for experiments
|
if(experimental0) { // for experiments
|
||||||
// float green1Median, green2Median;
|
|
||||||
// green1Median = median(psG1[ i - 1 ][ j - 1 ],psG1[ i - 1 ][ j + 1 ],psG1[ i ][ j ],psG1[ i + 1 ][ j -1 ],psG1[ i + 1 ][ j + 1 ]);
|
|
||||||
// green2Median = median(psG2[ i - 1 ][ j - 1 ],psG2[ i - 1 ][ j + 1 ],psG2[ i ][ j ],psG2[ i + 1 ][ j -1 ],psG2[ i + 1 ][ j + 1 ]);
|
|
||||||
// float greenDiffMedian = nonGreenDiff(green1Median, green2Median, stddevFactorGreen * 0.36f, eperIsoGreen, nRead, prnu, showMotion);
|
|
||||||
//
|
|
||||||
// if(greenDiffMedian > 0.f) {
|
|
||||||
// if(nOf3x3) {
|
|
||||||
// psMask[i][j] = 1.f;
|
|
||||||
// } else {
|
|
||||||
// paintMotionMask(j + offsX, showMotion, greenDiffMedian, showOnlyMask, greenDest, redDest, blueDest);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// continue;
|
|
||||||
// }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1629,6 +1618,8 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
sum[1] += sumThr[0];
|
sum[1] += sumThr[0];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
float percent0 = 100.f * sum[0] / pixelcount;
|
float percent0 = 100.f * sum[0] / pixelcount;
|
||||||
float percent1 = 100.f * sum[1] / pixelcount;
|
float percent1 = 100.f * sum[1] / pixelcount;
|
||||||
|
|
||||||
@@ -1636,7 +1627,6 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
|
|
||||||
if(adaptive && nOf3x3) {
|
if(adaptive && nOf3x3) {
|
||||||
if(blurMap) {
|
if(blurMap) {
|
||||||
StopWatch Stop1("Blur");
|
|
||||||
#pragma omp parallel
|
#pragma omp parallel
|
||||||
{
|
{
|
||||||
gaussianBlur(psMask, psMask, winw, winh, sigma);
|
gaussianBlur(psMask, psMask, winw, winh, sigma);
|
||||||
@@ -1645,6 +1635,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
|
|
||||||
array2D<uint8_t> mask(W, H, ARRAY2D_CLEAR_DATA);
|
array2D<uint8_t> mask(W, H, ARRAY2D_CLEAR_DATA);
|
||||||
array2D<uint8_t> maskInv(W, H, ARRAY2D_CLEAR_DATA);
|
array2D<uint8_t> maskInv(W, H, ARRAY2D_CLEAR_DATA);
|
||||||
|
|
||||||
#pragma omp parallel for schedule(dynamic,16)
|
#pragma omp parallel for schedule(dynamic,16)
|
||||||
|
|
||||||
for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
|
for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
|
||||||
@@ -1681,32 +1672,25 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
xorMasks(winx + border - offsX, winw - (border + offsX), winy + border - offsY, winh - (border + offsY), maskInv, mask);
|
xorMasks(winx + border - offsX, winw - (border + offsX), winy + border - offsY, winh - (border + offsY), maskInv, mask);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#pragma omp parallel for schedule(dynamic,16)
|
#pragma omp parallel for schedule(dynamic,16)
|
||||||
|
|
||||||
for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
|
for(int i = winy + border - offsY; i < winh - (border + offsY); ++i) {
|
||||||
#ifdef __SSE2__
|
#ifdef __SSE2__
|
||||||
|
|
||||||
if(!(showMotion && showOnlyMask) && smoothTransitions) {
|
if(!(showMotion && showOnlyMask) && smoothTransitions) {
|
||||||
if(smoothFactor == 0.f) {
|
vfloat onev = F2V(1.f);
|
||||||
for(int j = winx + border - offsX; j < winw - (border + offsX); ++j) {
|
vfloat smoothv = F2V(smoothFactor);
|
||||||
psMask[i][j] = greenWeight - 1.f;
|
int j = winx + border - offsX;
|
||||||
}
|
|
||||||
} else {
|
|
||||||
vfloat zerov = F2V(0.f);
|
|
||||||
vfloat onev = F2V(1.f);
|
|
||||||
vfloat smoothv = F2V(smoothFactor);
|
|
||||||
int j = winx + border - offsX;
|
|
||||||
|
|
||||||
for(; j < winw - (border + offsX) - 3; j += 4) {
|
for(; j < winw - (border + offsX) - 3; j += 4) {
|
||||||
vfloat blendv = LVFU(psMask[i][j]) - onev;
|
vfloat blendv = vmaxf(LVFU(psMask[i][j]), onev) - onev;
|
||||||
blendv = vmaxf(blendv, zerov);
|
blendv = pow_F(blendv, smoothv);
|
||||||
blendv = pow_F(blendv, smoothv);
|
STVFU(psMask[i][j], blendv);
|
||||||
STVFU(psMask[i][j], blendv);
|
}
|
||||||
}
|
|
||||||
|
|
||||||
for(; j < winw - (border + offsX); ++j) {
|
for(; j < winw - (border + offsX); ++j) {
|
||||||
psMask[i][j] = pow_F(std::max(psMask[i][j] - 1.f, 0.f), smoothFactor);
|
psMask[i][j] = pow_F(std::max(psMask[i][j] - 1.f, 0.f), smoothFactor);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1718,10 +1702,7 @@ void RawImageSource::pixelshift(int winx, int winy, int winw, int winh, const RA
|
|||||||
for(int j = winx + border - offsX; j < winw - (border + offsX); ++j) {
|
for(int j = winx + border - offsX; j < winw - (border + offsX); ++j) {
|
||||||
if(mask[i][j] == 255) {
|
if(mask[i][j] == 255) {
|
||||||
paintMotionMask(j + offsX, showMotion, 0.5f, showOnlyMask, greenDest, redDest, blueDest);
|
paintMotionMask(j + offsX, showMotion, 0.5f, showOnlyMask, greenDest, redDest, blueDest);
|
||||||
continue;
|
} else if(showMotion && showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
|
||||||
}
|
|
||||||
|
|
||||||
if(showMotion && showOnlyMask) { // we want only motion mask => paint areas without motion in pure black
|
|
||||||
red[i + offsY][j + offsX] = green[i + offsY][j + offsX] = blue[i + offsY][j + offsX] = 0.f;
|
red[i + offsY][j + offsX] = green[i + offsY][j + offsX] = blue[i + offsY][j + offsX] = 0.f;
|
||||||
} else {
|
} else {
|
||||||
if(smoothTransitions) {
|
if(smoothTransitions) {
|
||||||
|
Reference in New Issue
Block a user