raw ca correction: optimized avoid colour shift, #4777
This commit is contained in:
@@ -144,11 +144,17 @@ float* RawImageSource::CA_correct_RT(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
array2D<float> oldraw(W,H);
|
array2D<float>* oldraw = nullptr;
|
||||||
if (avoidColourshift) {
|
if (avoidColourshift) {
|
||||||
|
oldraw = new array2D<float>((W + 1) / 2, H);
|
||||||
|
#pragma omp parallel for
|
||||||
for(int i = 0; i < H; ++i) {
|
for(int i = 0; i < H; ++i) {
|
||||||
for(int j = 0; j < W; ++j) {
|
int j = FC(i, 0) & 1;
|
||||||
oldraw[i][j] = rawData[i][j];
|
for(; j < W - 1; j += 2) {
|
||||||
|
(*oldraw)[i][j / 2] = rawData[i][j];
|
||||||
|
}
|
||||||
|
if(j < W) {
|
||||||
|
(*oldraw)[i][j / 2] = rawData[i][j];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1244,29 +1250,42 @@ float* RawImageSource::CA_correct_RT(
|
|||||||
if (avoidColourshift) {
|
if (avoidColourshift) {
|
||||||
array2D<float> redFactor((W+1)/2, (H+1)/2);
|
array2D<float> redFactor((W+1)/2, (H+1)/2);
|
||||||
array2D<float> blueFactor((W+1)/2, (H+1)/2);
|
array2D<float> blueFactor((W+1)/2, (H+1)/2);
|
||||||
|
array2D<float>* nonGreen;
|
||||||
|
|
||||||
|
#pragma omp parallel
|
||||||
|
{
|
||||||
|
#pragma omp for
|
||||||
for(int i = 0; i < H; ++i) {
|
for(int i = 0; i < H; ++i) {
|
||||||
for(int j = 0; j < W; ++j) {
|
int firstCol = FC(i, 0) & 1;
|
||||||
float factor = (rawData[i][j] * oldraw[i][j] == 0.0 ? 1.0 : oldraw[i][j] / rawData[i][j]);
|
int colour = FC(i, firstCol);
|
||||||
if(FC(i,j) == 0) {
|
nonGreen = colour == 0 ? &redFactor : &blueFactor;
|
||||||
redFactor[i/2][j/2] = factor;
|
int j = firstCol;
|
||||||
} else if(FC(i,j) == 2) {
|
for(; j < W - 1; j += 2) {
|
||||||
blueFactor[i/2][j/2] = factor;
|
(*nonGreen)[i/2][j/2] = (rawData[i][j] * (*oldraw)[i][j / 2] == 0.0 ? 1.0 : (*oldraw)[i][j / 2] / rawData[i][j]);
|
||||||
}
|
}
|
||||||
|
if (j < W) {
|
||||||
|
(*nonGreen)[i/2][j/2] = (rawData[i][j] * (*oldraw)[i][j / 2] == 0.0 ? 1.0 : (*oldraw)[i][j / 2] / rawData[i][j]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
|
#pragma omp for
|
||||||
for(int i = 0; i < H; ++i) {
|
for(int i = 0; i < H; ++i) {
|
||||||
for(int j = 0; j < W; ++j) {
|
int firstCol = FC(i, 0) & 1;
|
||||||
if(FC(i,j) == 0) {
|
int colour = FC(i, firstCol);
|
||||||
rawData[i][j] *= redFactor[i/2][j/2];
|
nonGreen = colour == 0 ? &redFactor : &blueFactor;
|
||||||
} else if(FC(i,j) == 2) {
|
int j = firstCol;
|
||||||
rawData[i][j] *= blueFactor[i/2][j/2];
|
for(; j < W - 1; j += 2) {
|
||||||
|
rawData[i][j] *= (*nonGreen)[i/2][j/2];
|
||||||
|
}
|
||||||
|
if (j < W) {
|
||||||
|
rawData[i][j] *= (*nonGreen)[i/2][j/2];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
delete oldraw;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(plistener) {
|
if(plistener) {
|
||||||
|
Reference in New Issue
Block a user