Fixed wrong border handling in DeHaze

This commit is contained in:
heckflosse
2015-09-02 18:32:06 +02:00
parent aab584fa53
commit 8511131771

View File

@@ -1825,13 +1825,18 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams
{wprof[1][0], wprof[1][1], wprof[1][2]},
{wprof[2][0], wprof[2][1], wprof[2][2]}
};
LabImage * labdeha = new LabImage(W, H);
// We need a buffer with original L data to allow correct blending
float *labTmp[H] ALIGNED16;
float *labTmpBuffer = new float[H * W];
for (int i = 0; i < H; i++) {
labTmp[i] = &labTmpBuffer[i * W];
// red, green and blue still have original size of raw, but we can't use the borders
const int HNew = H-2*border;
const int WNew = W-2*border;
LabImage * labdeha = new LabImage(WNew, HNew);
float *labTmp[HNew] ALIGNED16;
float *labTmpBuffer = new float[HNew * WNew];
for (int i = 0; i < HNew; i++) {
labTmp[i] = &labTmpBuffer[i * WNew];
}
// Conversion rgb -> lab is hard to vectorize because it uses a lut (that's not the main problem)
@@ -1839,24 +1844,24 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < H; i++ )
for (int j = 0; j < W; j++) {
for (int i = border; i < H - border; i++ )
for (int j = border; j < W - border; j++) {
float X, Y, Z, L, aa, bb;
//rgb=>lab
Color::rgbxyz(red[i][j], green[i][j], blue[i][j], X, Y, Z, wp);
//convert Lab
Color::XYZ2Lab(X, Y, Z, L, aa, bb);
labTmp[i][j] = L;
labTmp[i-border][j-border] = L;
if(dehacontlutili) {
L = cdcurve[L]; //apply curve to equalize histogram
}
labdeha->L[i][j] = L;
labdeha->a[i][j] = aa;
labdeha->b[i][j] = bb;
labdeha->L[i-border][j-border] = L;
labdeha->a[i-border][j-border] = aa;
labdeha->b[i-border][j-border] = bb;
}
MSR(labdeha->L, labTmp, W, H, lcur);
MSR(labdeha->L, labTmp, WNew, HNew, lcur);
delete [] labTmpBuffer;
@@ -1872,16 +1877,16 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams
#ifdef _OPENMP
#pragma omp parallel for
#endif
for (int i = 0; i < H; i++ ) {
int j = 0;
for (int i = border; i < H - border; i++ ) {
int j = border;
#ifdef __SSE2__
for (; j < W - 3; j += 4) {
for (; j < W - border - 3; j += 4) {
vfloat L2, a2, b2, x_, y_, z_;
vfloat R, G, B;
L2 = LVFU(labdeha->L[i][j]);
a2 = LVFU(labdeha->a[i][j]);
b2 = LVFU(labdeha->b[i][j]);
L2 = LVFU(labdeha->L[i-border][j-border]);
a2 = LVFU(labdeha->a[i-border][j-border]);
b2 = LVFU(labdeha->b[i-border][j-border]);
Color::Lab2XYZ(L2, a2, b2, x_, y_, z_) ;
Color::xyz2rgb(x_, y_, z_, R, G, B, wipv);
_mm_storeu_ps(&red[i][j], R);
@@ -1889,12 +1894,12 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams
_mm_storeu_ps(&blue[i][j], B);
}
#endif
for (; j < W; j++) {
for (; j < W - border; j++) {
float L2, a2, b2, x_, y_, z_;
float R, G, B;
L2 = labdeha->L[i][j];
a2 = labdeha->a[i][j];
b2 = labdeha->b[i][j];
L2 = labdeha->L[i-border][j-border];
a2 = labdeha->a[i-border][j-border];
b2 = labdeha->b[i-border][j-border];
Color::Lab2XYZ(L2, a2, b2, x_, y_, z_) ;
Color::xyz2rgb(x_, y_, z_, R, G, B, wip);
red[i][j] = R;