vng4 demosaic: another very small speedup, #4633

This commit is contained in:
heckflosse 2018-10-28 20:37:34 +01:00
parent 19cc60a623
commit 13abcd0f6c
2 changed files with 46 additions and 60 deletions

View File

@ -269,7 +269,7 @@ protected:
void nodemosaic(bool bw); void nodemosaic(bool bw);
void eahd_demosaic(); void eahd_demosaic();
void hphd_demosaic(); void hphd_demosaic();
void vng4_demosaic(const array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue, bool keepGreens = false); void vng4_demosaic(const array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue);
void ppg_demosaic(); void ppg_demosaic();
void jdl_interpolate_omp(); void jdl_interpolate_omp();
void igv_interpolate(int winw, int winh); void igv_interpolate(int winw, int winh);

View File

@ -31,7 +31,7 @@ namespace rtengine
{ {
#define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3) #define fc(row,col) (prefilters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3)
void RawImageSource::vng4_demosaic (const array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue, bool keepGreens) void RawImageSource::vng4_demosaic (const array2D<float> &rawData, array2D<float> &red, array2D<float> &green, array2D<float> &blue)
{ {
BENCHFUN BENCHFUN
const signed short int *cp, terms[] = { const signed short int *cp, terms[] = {
@ -227,67 +227,53 @@ void RawImageSource::vng4_demosaic (const array2D<float> &rawData, array2D<float
for (int col = 2; col < width - 2; col++) { for (int col = 2; col < width - 2; col++) {
float * pix = image[row * width + col]; float * pix = image[row * width + col];
int color = fc(row, col); int color = fc(row, col);
if (keepGreens && (color & 1)) {
green[row][col] = pix[color];
} else {
int * ip = code[row & prow][col & pcol]; int * ip = code[row & prow][col & pcol];
float gval[8] = {}; float gval[8] = {};
int g; while (ip[0] != INT_MAX) { /* Calculate gradients */
while ((g = ip[0]) != INT_MAX) { /* Calculate gradients */ const float diff = std::fabs(pix[ip[0]] - pix[ip[1]]) * ip[2];
const float diff = std::fabs(pix[g] - pix[ip[1]]) * ip[2];
gval[ip[3]] += diff; gval[ip[3]] += diff;
ip += 4; ip += 5;
if (UNLIKELY(ip[-1] != -1)) {
while ((g = *ip++) != -1) { gval[ip[-1]] += diff;
gval[g] += diff; ip++;
} }
} }
ip++; ip++;
const float thold = rtengine::min(gval[0], gval[1], gval[2], gval[3], gval[4], gval[5], gval[6], gval[7]) const float thold = rtengine::min(gval[0], gval[1], gval[2], gval[3], gval[4], gval[5], gval[6], gval[7])
+ rtengine::max(gval[0], gval[1], gval[2], gval[3], gval[4], gval[5], gval[6], gval[7]) / 2; + rtengine::max(gval[0], gval[1], gval[2], gval[3], gval[4], gval[5], gval[6], gval[7]) * 0.5f;
float sum[3] = {}; float sum0 = 0.f;
float t1p2 = pix[color]; float sum1 = 0.f;
float greenval = pix[color];
int num = 0;
if(color & 1) { if(color & 1) {
int num = 0;
for (int g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */ for (int g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */
if (gval[g] <= thold) { if (gval[g] <= thold) {
if(ip[1]) { if(ip[1]) {
sum[0] += (t1p2 + pix[ip[1]]) * 0.5f; sum0 += greenval + pix[ip[1]];
} }
sum[1] += pix[ip[0] + (color ^ 2)]; sum1 += pix[ip[0] + (color ^ 2)];
num++; num++;
} }
} }
sum0 *= 0.5f;
t1p2 += (sum[1] - sum[0]) / num;
} else { } else {
int num = 0;
for (int g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */ for (int g = 0; g < 8; g++, ip += 2) { /* Average the neighbors */
if (gval[g] <= thold) { if (gval[g] <= thold) {
sum[1] += pix[ip[0] + 1];
sum[2] += pix[ip[0] + 3];
if(ip[1]) { if(ip[1]) {
sum[0] += (t1p2 + pix[ip[1]]) * 0.5f; sum0 += greenval + pix[ip[1]];
} }
sum1 += pix[ip[0] + 1] + pix[ip[0] + 3];
num++; num++;
} }
} }
t1p2 += ((sum[1] - sum[0]) + (sum[2] - sum[0])) / num;
}
green[row][col] = 0.5f * (t1p2 + pix[color]);
} }
green[row][col] = greenval + (sum1 - sum0) / (2 * num);
} }
if (row - 1 > firstRow) { if (row - 1 > firstRow) {
interpolate_row_rb_mul_pp(rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1); interpolate_row_rb_mul_pp(rawData, red[row - 1], blue[row - 1], green[row - 2], green[row - 1], green[row], row - 1, 1.0, 1.0, 1.0, 0, W, 1);