raw ca correction: avoid colour shift per iteration, #4777

This commit is contained in:
heckflosse
2018-09-09 12:53:44 +02:00
parent ddbf94e940
commit f85ec677ff

View File

@@ -141,10 +141,14 @@ float* RawImageSource::CA_correct_RT(
} }
} }
array2D<float>* redFactor = nullptr;
array2D<float>* blueFactor = nullptr;
array2D<float>* oldraw = nullptr; array2D<float>* oldraw = nullptr;
if (avoidColourshift) { if (avoidColourshift) {
// copy raw values before ca correction redFactor = new array2D<float>((W+1)/2, (H+1)/2);
blueFactor = new array2D<float>((W+1)/2, (H+1)/2);
oldraw = new array2D<float>((W + 1) / 2, H); oldraw = new array2D<float>((W + 1) / 2, H);
// copy raw values before ca correction
#pragma omp parallel for #pragma omp parallel for
for (int i = 0; i < H; ++i) { for (int i = 0; i < H; ++i) {
for (int j = FC(i, 0) & 1; j < W; j += 2) { for (int j = FC(i, 0) & 1; j < W; j += 2) {
@@ -1215,33 +1219,11 @@ float* RawImageSource::CA_correct_RT(
// clean up // clean up
free(bufferThr); free(bufferThr);
} }
}
if (autoCA && fitParamsTransfer && fitParamsOut) {
// store calculated parameters
int index = 0;
for (int c = 0; c < 2; ++c) {
for (int d = 0; d < 2; ++d) {
for (int e = 0; e < 16; ++e) {
fitParamsTransfer[index++] = fitparams[c][d][e];
}
}
}
}
if (freeBuffer) {
free(buffer);
buffer = nullptr;
}
if (avoidColourshift) { if (avoidColourshift) {
// to avoid or at least reduce the colour shift caused by raw ca correction we compute the per pixel difference factors // to avoid or at least reduce the colour shift caused by raw ca correction we compute the per pixel difference factors
// of red and blue channel and apply a gaussian blur to them. // of red and blue channel and apply a gaussian blur to them.
// Then we apply the resulting factors per pixel on the result of raw ca correction // Then we apply the resulting factors per pixel on the result of raw ca correction
array2D<float> redFactor((W+1)/2, (H+1)/2);
array2D<float> blueFactor((W+1)/2, (H+1)/2);
#pragma omp parallel #pragma omp parallel
{ {
#ifdef __SSE2__ #ifdef __SSE2__
@@ -1253,7 +1235,7 @@ float* RawImageSource::CA_correct_RT(
for (int i = 0; i < H; ++i) { for (int i = 0; i < H; ++i) {
const int firstCol = FC(i, 0) & 1; const int firstCol = FC(i, 0) & 1;
const int colour = FC(i, firstCol); const int colour = FC(i, firstCol);
const array2D<float>* nonGreen = colour == 0 ? &redFactor : &blueFactor; const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor;
int j = firstCol; int j = firstCol;
#ifdef __SSE2__ #ifdef __SSE2__
for (; j < W - 7; j += 8) { for (; j < W - 7; j += 8) {
@@ -1276,7 +1258,7 @@ float* RawImageSource::CA_correct_RT(
// odd height => factors for one channel are not set in last row => use values of preceding row // odd height => factors for one channel are not set in last row => use values of preceding row
const int firstCol = FC(0, 0) & 1; const int firstCol = FC(0, 0) & 1;
const int colour = FC(0, firstCol); const int colour = FC(0, firstCol);
const array2D<float>* nonGreen = colour == 0 ? &blueFactor : &redFactor; const array2D<float>* nonGreen = colour == 0 ? blueFactor : redFactor;
for (int j = 0; j < (W + 1) / 2; ++j) { for (int j = 0; j < (W + 1) / 2; ++j) {
(*nonGreen)[(H + 1) / 2 - 1][j] = (*nonGreen)[(H + 1) / 2 - 2][j]; (*nonGreen)[(H + 1) / 2 - 1][j] = (*nonGreen)[(H + 1) / 2 - 2][j];
} }
@@ -1287,29 +1269,52 @@ float* RawImageSource::CA_correct_RT(
const int ngRow = 1 - (FC(0, 0) & 1); const int ngRow = 1 - (FC(0, 0) & 1);
const int ngCol = FC(ngRow, 0) & 1; const int ngCol = FC(ngRow, 0) & 1;
const int colour = FC(ngRow, ngCol); const int colour = FC(ngRow, ngCol);
const array2D<float>* nonGreen = colour == 0 ? &redFactor : &blueFactor; const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor;
for (int i = 0; i < (H + 1) / 2; ++i) { for (int i = 0; i < (H + 1) / 2; ++i) {
(*nonGreen)[i][(W + 1) / 2 - 1] = redFactor[i][(W + 1) / 2 - 2]; (*nonGreen)[i][(W + 1) / 2 - 1] = (*nonGreen)[i][(W + 1) / 2 - 2];
} }
} }
} }
// blur correction factors // blur correction factors
gaussianBlur(redFactor, redFactor, (W+1)/2, (H+1)/2, 30.0); gaussianBlur(*redFactor, *redFactor, (W+1)/2, (H+1)/2, 30.0);
gaussianBlur(blueFactor, blueFactor, (W+1)/2, (H+1)/2, 30.0); gaussianBlur(*blueFactor, *blueFactor, (W+1)/2, (H+1)/2, 30.0);
// apply correction factors to avoid (reduce) colour shift // apply correction factors to avoid (reduce) colour shift
#pragma omp for #pragma omp for
for (int i = 0; i < H; ++i) { for (int i = 0; i < H; ++i) {
const int firstCol = FC(i, 0) & 1; const int firstCol = FC(i, 0) & 1;
const int colour = FC(i, firstCol); const int colour = FC(i, firstCol);
const array2D<float>* nonGreen = colour == 0 ? &redFactor : &blueFactor; const array2D<float>* nonGreen = colour == 0 ? redFactor : blueFactor;
for (int j = firstCol; j < W; j += 2) { for (int j = firstCol; j < W; j += 2) {
rawData[i][j] *= (*nonGreen)[i/2][j/2]; rawData[i][j] *= (*nonGreen)[i/2][j/2];
} }
} }
} }
}
}
if (autoCA && fitParamsTransfer && fitParamsOut) {
// store calculated parameters
int index = 0;
for (int c = 0; c < 2; ++c) {
for (int d = 0; d < 2; ++d) {
for (int e = 0; e < 16; ++e) {
fitParamsTransfer[index++] = fitparams[c][d][e];
}
}
}
}
if (freeBuffer) {
free(buffer);
buffer = nullptr;
}
if (avoidColourshift) {
delete oldraw; delete oldraw;
delete redFactor;
delete blueFactor;
} }
if (plistener) { if (plistener) {