Fixed wrong border handling in DeHaze
This commit is contained in:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user