pixelshift: Added support for lcp vignetting correction and green equilibration

This commit is contained in:
heckflosse
2016-11-29 17:01:14 +01:00
parent 389d2ebddd
commit 675b2cc7fc
3 changed files with 38 additions and 16 deletions

View File

@@ -30,12 +30,11 @@
#include "rt_math.h"
#include "rawimagesource.h"
namespace rtengine
{
//void green_equilibrate()//for dcraw implementation
void RawImageSource::green_equilibrate(float thresh)
void RawImageSource::green_equilibrate(float thresh, array2D<float> &rawData)
{
// thresh = threshold for performing green equilibration; max percentage difference of G1 vs G2
// G1-G2 differences larger than this will be assumed to be Nyquist texture, and left untouched
@@ -79,7 +78,7 @@ void RawImageSource::green_equilibrate(float thresh)
*/
//now smooth the cfa data
#ifdef _OPENMP
#pragma omp parallel for
#pragma omp parallel for schedule(dynamic,16)
#endif
for (int rr = 4; rr < height - 4; rr++)
@@ -99,8 +98,8 @@ void RawImageSource::green_equilibrate(float thresh)
float d1 = (o1_1 + o1_2 + o1_3 + o1_4) * 0.25f;
float d2 = (o2_1 + o2_2 + o2_3 + o2_4) * 0.25f;
float c1 = (fabs(o1_1 - o1_2) + fabs(o1_1 - o1_3) + fabs(o1_1 - o1_4) + fabs(o1_2 - o1_3) + fabs(o1_3 - o1_4) + fabs(o1_2 - o1_4)) / 6.0;
float c2 = (fabs(o2_1 - o2_2) + fabs(o2_1 - o2_3) + fabs(o2_1 - o2_4) + fabs(o2_2 - o2_3) + fabs(o2_3 - o2_4) + fabs(o2_2 - o2_4)) / 6.0;
float c1 = (fabs(o1_1 - o1_2) + fabs(o1_1 - o1_3) + fabs(o1_1 - o1_4) + fabs(o1_2 - o1_3) + fabs(o1_3 - o1_4) + fabs(o1_2 - o1_4)) / 6.f;
float c2 = (fabs(o2_1 - o2_2) + fabs(o2_1 - o2_3) + fabs(o2_1 - o2_4) + fabs(o2_2 - o2_3) + fabs(o2_3 - o2_4) + fabs(o2_2 - o2_4)) / 6.f;
//%%%%%%%%%%%%%%%%%%%%%%
//vote1=(checker[rr-2][cc]+checker[rr][cc-2]+checker[rr][cc+2]+checker[rr+2][cc]);
@@ -111,10 +110,10 @@ void RawImageSource::green_equilibrate(float thresh)
//pixel interpolation
float gin = cfa[rr][cc];
float gse = (cfa[rr + 1][cc + 1]) + 0.5 * (cfa[rr][cc] - cfa[rr + 2][cc + 2]);
float gnw = (cfa[rr - 1][cc - 1]) + 0.5 * (cfa[rr][cc] - cfa[rr - 2][cc - 2]);
float gne = (cfa[rr - 1][cc + 1]) + 0.5 * (cfa[rr][cc] - cfa[rr - 2][cc + 2]);
float gsw = (cfa[rr + 1][cc - 1]) + 0.5 * (cfa[rr][cc] - cfa[rr + 2][cc - 2]);
float gse = (cfa[rr + 1][cc + 1]) + 0.5f * (cfa[rr][cc] - cfa[rr + 2][cc + 2]);
float gnw = (cfa[rr - 1][cc - 1]) + 0.5f * (cfa[rr][cc] - cfa[rr - 2][cc - 2]);
float gne = (cfa[rr - 1][cc + 1]) + 0.5f * (cfa[rr][cc] - cfa[rr - 2][cc + 2]);
float gsw = (cfa[rr + 1][cc - 1]) + 0.5f * (cfa[rr][cc] - cfa[rr + 2][cc - 2]);

View File

@@ -1832,14 +1832,31 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
if (pLCPProf) { // don't check focal length to allow distortion correction for lenses without chip, also pass dummy focal length 1 in case of 0
LCPMapper map(pLCPProf, max(idata->getFocalLen(), 1.0), idata->getFocalLen35mm(), idata->getFocusDist(), idata->getFNumber(), true, false, W, H, coarse, -1);
if(numFrames == 4) {
#ifdef _OPENMP
#pragma omp parallel for
#pragma omp parallel for
#endif
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
if (rawData[y][x] > 0) {
rawData[y][x] *= map.calcVignetteFac(x, y);
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
float val = map.calcVignetteFac(x, y);
for(int i = 0; i < 4; ++i) {
if ((*rawDataFrames[i])[y][x] > 0) {
(*rawDataFrames[i])[y][x] *= val;
}
}
}
}
} else {
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int y = 0; y < H; y++) {
for (int x = 0; x < W; x++) {
if (rawData[y][x] > 0) {
rawData[y][x] *= map.calcVignetteFac(x, y);
}
}
}
}
@@ -1910,7 +1927,13 @@ void RawImageSource::preprocess (const RAWParams &raw, const LensProfParams &le
plistener->setProgress (0.0);
}
green_equilibrate(0.01 * (raw.bayersensor.greenthresh));
if(numFrames == 4) {
for(int i = 0; i < 4; ++i) {
green_equilibrate(0.01 * (raw.bayersensor.greenthresh), *rawDataFrames[i]);
}
} else {
green_equilibrate(0.01 * (raw.bayersensor.greenthresh), rawData);
}
}

View File

@@ -227,7 +227,7 @@ protected:
void cfa_linedn (float linenoiselevel);//Emil's line denoise
void green_equilibrate (float greenthresh);//Emil's green equilibration
void green_equilibrate (float greenthresh, array2D<float> &rawData);//Emil's green equilibration
void nodemosaic(bool bw);
void eahd_demosaic();