From 7f66eb5ec49096ed79d65e4c2e197e814979a6d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fl=C3=B6ssie?= Date: Sat, 9 Jul 2016 11:47:47 +0200 Subject: [PATCH] Move common code out of switch in ImProcFunctions::Median_Denoise() - Move suggested by @heckflosse - Use switch/case - astyle `FTblockDN.cc` - Whitespace cleanups - Apply `median()` on `ffmanager.cc` --- rtengine/FTblockDN.cc | 1547 +++++++++++++++++++++-------------------- rtengine/ffmanager.cc | 13 +- rtengine/improcfun.h | 12 +- 3 files changed, 797 insertions(+), 775 deletions(-) diff --git a/rtengine/FTblockDN.cc b/rtengine/FTblockDN.cc index 633162d4c..b9e42c980 100644 --- a/rtengine/FTblockDN.cc +++ b/rtengine/FTblockDN.cc @@ -95,30 +95,36 @@ float media(float *elements, int N) return elements[N >> 1]; } -void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) +void ImProcFunctions::Median_Denoise(float **src, float **dst, const int width, const int height, const Median medianType, const int iterations, const int numThreads, float **buffer) { int border = 1; switch (medianType) { - case Median::SIZE_3X3_SOFT: - case Median::SIZE_3X3_STRONG: - border = 1; - break; + case Median::TYPE_3X3_SOFT: + case Median::TYPE_3X3_STRONG: { + border = 1; + break; + } - case Median::SIZE_5X5_SOFT: - border = 2; - break; + case Median::TYPE_5X5_SOFT: { + border = 2; + break; + } - case Median::SIZE_5X5_STRONG: - border = 2; - break; + case Median::TYPE_5X5_STRONG: { + border = 2; + break; + } - case Median::SIZE_7X7: - border = 3; - break; + case Median::TYPE_7X7: { + border = 3; + break; + } - default: // includes Median::SIZE_9X9 - border = 4; + case Median::TYPE_9X9: { + border = 4; + break; + } } float **allocBuffer = NULL; @@ -126,8 +132,8 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, medBuffer[0] = src; // we need a buffer if src == dst or if (src != dst && iterations > 1) - if(src == dst || (src != dst && iterations > 1)) { - if(buffer == NULL) { // we didn't get a buufer => create one + if (src == dst || (src != dst && iterations > 1)) { + if (buffer == NULL) { // we didn't get a buufer => create one allocBuffer = new float*[height]; for (int i = 0; i < height; ++i) { @@ -145,11 +151,11 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, float ** medianIn, ** medianOut; int BufferIndex = 0; - for(int iteration = 1; iteration <= iterations; ++iteration) { + for (int iteration = 1; iteration <= iterations; ++iteration) { medianIn = medBuffer[BufferIndex]; medianOut = medBuffer[BufferIndex ^ 1]; - if(iteration == 1) { // upper border + if (iteration == 1) { // upper border for (int i = 0; i < border; ++i) for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; @@ -157,229 +163,215 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, } #ifdef _OPENMP - #pragma omp parallel for num_threads(numThreads) if(numThreads>1) schedule(dynamic,16) + #pragma omp parallel for num_threads(numThreads) if (numThreads>1) schedule(dynamic,16) #endif for (int i = border; i < height - border; ++i) { - if (medianType == Median::SIZE_3X3_SOFT) { - int j = 0; + int j = 0; - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; + for (; j < border; ++j) { + medianOut[i][j] = medianIn[i][j]; + } + + switch (medianType) { + case Median::TYPE_3X3_SOFT: { + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 1][j], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j] + ); + } + + break; } - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 1][j], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i + 1][j] - ); + case Median::TYPE_3X3_STRONG: { + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1] + ); + } + + break; } - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_3X3_STRONG) { - int j = 0; + case Median::TYPE_5X5_SOFT: { + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 2][j], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 2][j] + ); + } - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1] - ); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_5X5_SOFT) { - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 2][j], - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i][j - 2], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i][j + 2], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1], - medianIn[i + 2][j] - ); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if(medianType == Median::SIZE_5X5_STRONG) { - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; + break; } + case Median::TYPE_5X5_STRONG: { #ifdef __SSE2__ - for (; j < width - border - 3; j += 4) { - STVFU( - medianOut[i][j], - median( - LVFU(medianIn[i - 2][j - 2]), - LVFU(medianIn[i - 2][j - 1]), - LVFU(medianIn[i - 2][j]), - LVFU(medianIn[i - 2][j + 1]), - LVFU(medianIn[i - 2][j + 2]), - LVFU(medianIn[i - 1][j - 2]), - LVFU(medianIn[i - 1][j - 1]), - LVFU(medianIn[i - 1][j]), - LVFU(medianIn[i - 1][j + 1]), - LVFU(medianIn[i - 1][j + 2]), - LVFU(medianIn[i][j - 2]), - LVFU(medianIn[i][j - 1]), - LVFU(medianIn[i][j]), - LVFU(medianIn[i][j + 1]), - LVFU(medianIn[i][j + 2]), - LVFU(medianIn[i + 1][j - 2]), - LVFU(medianIn[i + 1][j - 1]), - LVFU(medianIn[i + 1][j]), - LVFU(medianIn[i + 1][j + 1]), - LVFU(medianIn[i + 1][j + 2]), - LVFU(medianIn[i + 2][j - 2]), - LVFU(medianIn[i + 2][j - 1]), - LVFU(medianIn[i + 2][j]), - LVFU(medianIn[i + 2][j + 1]), - LVFU(medianIn[i + 2][j + 2]) - ) - ); - } + + for (; j < width - border - 3; j += 4) { + STVFU( + medianOut[i][j], + median( + LVFU(medianIn[i - 2][j - 2]), + LVFU(medianIn[i - 2][j - 1]), + LVFU(medianIn[i - 2][j]), + LVFU(medianIn[i - 2][j + 1]), + LVFU(medianIn[i - 2][j + 2]), + LVFU(medianIn[i - 1][j - 2]), + LVFU(medianIn[i - 1][j - 1]), + LVFU(medianIn[i - 1][j]), + LVFU(medianIn[i - 1][j + 1]), + LVFU(medianIn[i - 1][j + 2]), + LVFU(medianIn[i][j - 2]), + LVFU(medianIn[i][j - 1]), + LVFU(medianIn[i][j]), + LVFU(medianIn[i][j + 1]), + LVFU(medianIn[i][j + 2]), + LVFU(medianIn[i + 1][j - 2]), + LVFU(medianIn[i + 1][j - 1]), + LVFU(medianIn[i + 1][j]), + LVFU(medianIn[i + 1][j + 1]), + LVFU(medianIn[i + 1][j + 2]), + LVFU(medianIn[i + 2][j - 2]), + LVFU(medianIn[i + 2][j - 1]), + LVFU(medianIn[i + 2][j]), + LVFU(medianIn[i + 2][j + 1]), + LVFU(medianIn[i + 2][j + 2]) + ) + ); + } + #endif - for (; j < width - border; ++j) { - medianOut[i][j] = median( - medianIn[i - 2][j - 2], - medianIn[i - 2][j - 1], - medianIn[i - 2][j], - medianIn[i - 2][j + 1], - medianIn[i - 2][j + 2], - medianIn[i - 1][j - 2], - medianIn[i - 1][j - 1], - medianIn[i - 1][j], - medianIn[i - 1][j + 1], - medianIn[i - 1][j + 2], - medianIn[i][j - 2], - medianIn[i][j - 1], - medianIn[i][j], - medianIn[i][j + 1], - medianIn[i][j + 2], - medianIn[i + 1][j - 2], - medianIn[i + 1][j - 1], - medianIn[i + 1][j], - medianIn[i + 1][j + 1], - medianIn[i + 1][j + 2], - medianIn[i + 2][j - 2], - medianIn[i + 2][j - 1], - medianIn[i + 2][j], - medianIn[i + 2][j + 1], - medianIn[i + 2][j + 2] - ); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else if (medianType == Median::SIZE_7X7) { - std::array pp; - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - -#ifdef __SSE2__ - std::array vpp ALIGNED16; - for (; j < width - border - 3; j += 4) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - vpp[kk] = LVFU(medianIn[i + ii][j + jj]); - } + for (; j < width - border; ++j) { + medianOut[i][j] = median( + medianIn[i - 2][j - 2], + medianIn[i - 2][j - 1], + medianIn[i - 2][j], + medianIn[i - 2][j + 1], + medianIn[i - 2][j + 2], + medianIn[i - 1][j - 2], + medianIn[i - 1][j - 1], + medianIn[i - 1][j], + medianIn[i - 1][j + 1], + medianIn[i - 1][j + 2], + medianIn[i][j - 2], + medianIn[i][j - 1], + medianIn[i][j], + medianIn[i][j + 1], + medianIn[i][j + 2], + medianIn[i + 1][j - 2], + medianIn[i + 1][j - 1], + medianIn[i + 1][j], + medianIn[i + 1][j + 1], + medianIn[i + 1][j + 2], + medianIn[i + 2][j - 2], + medianIn[i + 2][j - 1], + medianIn[i + 2][j], + medianIn[i + 2][j + 1], + medianIn[i + 2][j + 2] + ); } - STVFU(medianOut[i][j], median(vpp)); + break; } + + case Median::TYPE_7X7: { +#ifdef __SSE2__ + std::array vpp ALIGNED16; + + for (; j < width - border - 3; j += 4) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + } + } + + STVFU(medianOut[i][j], median(vpp)); + } + #endif - for (; j < width - border; ++j) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - pp[kk] = medianIn[i + ii][j + jj]; + std::array pp; + + for (; j < width - border; ++j) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + pp[kk] = medianIn[i + ii][j + jj]; + } } + + medianOut[i][j] = median(pp); } - medianOut[i][j] = median(pp); - } - - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; - } - } else { // includes Median::SIZE_9X9 - std::array pp; - int j = 0; - - for (; j < border; ++j) { - medianOut[i][j] = medianIn[i][j]; + break; } + case Median::TYPE_9X9: { #ifdef __SSE2__ - std::array vpp ALIGNED16; - for (; j < width - border - 3; j += 4) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + std::array vpp ALIGNED16; + + for (; j < width - border - 3; j += 4) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + vpp[kk] = LVFU(medianIn[i + ii][j + jj]); + } } + + STVFU(medianOut[i][j], median(vpp)); } - STVFU(medianOut[i][j], median(vpp)); - } #endif - for (; j < width - border; ++j) { - for (int kk = 0, ii = -border; ii <= border; ++ii) { - for (int jj = -border; jj <= border; ++jj, ++kk) { - pp[kk] = medianIn[i + ii][j + jj]; + std::array pp; + + for (; j < width - border; ++j) { + for (int kk = 0, ii = -border; ii <= border; ++ii) { + for (int jj = -border; jj <= border; ++jj, ++kk) { + pp[kk] = medianIn[i + ii][j + jj]; + } } + + medianOut[i][j] = median(pp); } - medianOut[i][j] = median(pp); - } + for (; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } - for(; j < width; ++j) { - medianOut[i][j] = medianIn[i][j]; + break; } } + + for (; j < width; ++j) { + medianOut[i][j] = medianIn[i][j]; + } } - if(iteration == 1) { // lower border + if (iteration == 1) { // lower border for (int i = height - border; i < height; ++i) for (int j = 0; j < width; ++j) { medianOut[i][j] = medianIn[i][j]; @@ -389,19 +381,19 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, BufferIndex ^= 1; // swap buffers } - if(medianOut != dst) { + if (medianOut != dst) { #ifdef _OPENMP - #pragma omp parallel for num_threads(numThreads) if(numThreads>1) + #pragma omp parallel for num_threads(numThreads) if (numThreads>1) #endif - for(int i = border; i < height - border; ++i ) { - for(int j = border; j < width - border; ++j) { + for (int i = border; i < height - border; ++i) { + for (int j = border; j < width - border; ++j) { dst[i][j] = medianOut[i][j]; } } } - if(allocBuffer != NULL) { // we allocated memory, so let's free it now + if (allocBuffer != NULL) { // we allocated memory, so let's free it now for (int i = 0; i < height; ++i) { delete[] allocBuffer[i]; } @@ -413,7 +405,7 @@ void ImProcFunctions::Median_Denoise( float **src, float **dst, const int width, void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidth, int imheight, int &numtiles_W, int &numtiles_H, int &tilewidth, int &tileheight, int &tileWskip, int &tileHskip) { - if(kall == 2) { + if (kall == 2) { if (imwidth < tilesize) { numtiles_W = 1; @@ -438,7 +430,7 @@ void ImProcFunctions::Tile_calc (int tilesize, int overlap, int kall, int imwidt } } - if(kall == 0) { + if (kall == 0) { numtiles_W = 1; tileWskip = imwidth; tilewidth = imwidth; @@ -462,11 +454,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //#endif if (dnparams.luma == 0 && dnparams.chroma == 0 && !dnparams.median && !noiseLCurve && !noiseCCurve) { //nothing to do; copy src to dst or do nothing in case src == dst - if(src != dst) { + if (src != dst) { src->copyData(dst); } - if(calclum) { + if (calclum) { delete calclum; calclum = NULL; } @@ -479,8 +471,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const nrquality nrQuality = (dnparams.smethod == "shal") ? QUALITY_STANDARD : QUALITY_HIGH;//shrink method const float qhighFactor = (nrQuality == QUALITY_HIGH) ? 1.f / (float) settings->nrhigh : 1.0f; - const bool useNoiseCCurve = (noiseCCurve && noiseCCurve.getSum() > 5.f ); - const bool useNoiseLCurve = (noiseLCurve && noiseLCurve.getSum() >= 7.f ); + const bool useNoiseCCurve = (noiseCCurve && noiseCCurve.getSum() > 5.f); + const bool useNoiseLCurve = (noiseLCurve && noiseLCurve.getSum() >= 7.f); const bool autoch = (settings->leveldnautsimpl == 1 && (dnparams.Cmethod == "AUT" || dnparams.Cmethod == "PRE")) || (settings->leveldnautsimpl == 0 && (dnparams.C2method == "AUTO" || dnparams.C2method == "PREV")); float** lumcalc; @@ -491,28 +483,28 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef bool ponder = false; float ponderCC = 1.f; - if(settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PON") { + if (settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PON") { ponder = true; ponderCC = 0.5f; } - if(settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PRE") { + if (settings->leveldnautsimpl == 1 && params->dirpyrDenoise.Cmethod == "PRE") { ponderCC = 0.5f; } - if(settings->leveldnautsimpl == 0 && params->dirpyrDenoise.Cmethod == "PREV") { + if (settings->leveldnautsimpl == 0 && params->dirpyrDenoise.Cmethod == "PREV") { ponderCC = 0.5f; } int metchoice = 0; - if(dnparams.methodmed == "Lonly") { + if (dnparams.methodmed == "Lonly") { metchoice = 1; - } else if(dnparams.methodmed == "Lab") { + } else if (dnparams.methodmed == "Lab") { metchoice = 2; - } else if(dnparams.methodmed == "ab") { + } else if (dnparams.methodmed == "ab") { metchoice = 3; - } else if(dnparams.methodmed == "Lpab") { + } else if (dnparams.methodmed == "Lpab") { metchoice = 4; } @@ -523,7 +515,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const bool denoiseLuminance = (noisevarL > 0.00001f); //printf("NL=%f \n",noisevarL); - if(useNoiseLCurve || useNoiseCCurve) { + if (useNoiseLCurve || useNoiseCCurve) { int hei = calclum->height; int wid = calclum->width; TMatrix wprofi = iccStore->workingSpaceMatrix (params->icm.working); @@ -536,20 +528,20 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef lumcalcBuffer = new float[hei * wid]; lumcalc = new float*[(hei)]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { lumcalc[i] = lumcalcBuffer + (i * wid); } ccalcBuffer = new float[hei * wid]; ccalc = new float*[(hei)]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { ccalc[i] = ccalcBuffer + (i * wid); } float cn100Precalc; - if(useNoiseCCurve) { + if (useNoiseCCurve) { cn100Precalc = SQR(1.f + ponderCC * (4.f * noiseCCurve[100.f / 60.f])); } @@ -557,8 +549,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for schedule(dynamic,16) #endif - for(int ii = 0; ii < hei; ii++) { - for(int jj = 0; jj < wid; jj++) { + for (int ii = 0; ii < hei; ++ii) { + for (int jj = 0; jj < wid; ++jj) { float LLum, AAum, BBum; float RL = calclum->r(ii, jj); @@ -569,14 +561,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef Color::rgbxyz(RL, GL, BL, XL, YL, ZL, wpi); Color::XYZ2Lab(XL, YL, ZL, LLum, AAum, BBum); - if(useNoiseLCurve) { + if (useNoiseLCurve) { float epsi = 0.01f; - if(LLum < 2.f) { + if (LLum < 2.f) { LLum = 2.f; //avoid divided by zero } - if(LLum > 32768.f) { + if (LLum > 32768.f) { LLum = 32768.f; // not strictly necessary } @@ -586,10 +578,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef lumcalc[ii][jj] = SQR((kinterm / 125.f) * (1.f + kinterm / 25.f)); } - if(useNoiseCCurve) { + if (useNoiseCCurve) { float cN = sqrtf(SQR(AAum) + SQR(BBum)); - if(cN > 100) { + if (cN > 100) { ccalc[ii][jj] = SQR(1.f + ponderCC * (4.f * noiseCCurve[cN / 60.f])); } else { ccalc[ii][jj] = cn100Precalc; @@ -604,13 +596,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const short int imheight = src->height, imwidth = src->width; - if (dnparams.luma != 0 || dnparams.chroma != 0 || dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly" ) { + if (dnparams.luma != 0 || dnparams.chroma != 0 || dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly") { // gamma transform for input data float gam = dnparams.gamma; float gamthresh = 0.001f; - if(!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG - if(gam < 1.9f) { + if (!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG + if (gam < 1.9f) { gam = 1.f - (1.9f - gam) / 3.f; //minimum gamma 0.7 } else if (gam >= 1.9f && gam <= 3.f) { gam = (1.4f / 1.1f) * gam - 1.41818f; @@ -621,12 +613,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf gamcurve(65536, LUT_CLIP_BELOW); - if(denoiseMethodRgb) { - for (int i = 0; i < 65536; i++) { + if (denoiseMethodRgb) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; } } else { - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamman((double)i / 65535.0, gam)) * 32768.0f; } } @@ -638,12 +630,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf igamcurve(65536, LUT_CLIP_BELOW); - if(denoiseMethodRgb) { - for (int i = 0; i < 65536; i++) { + if (denoiseMethodRgb) { + for (int i = 0; i < 65536; ++i) { igamcurve[i] = (Color::gamma((float)i / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); } } else { - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { igamcurve[i] = (Color::gamman((float)i / 32768.0f, igam) * 65535.0f); } } @@ -651,7 +643,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef const float gain = pow (2.0f, float(expcomp)); float noisevar_Ldetail = SQR((float)(SQR(100. - dnparams.Ldetail) + 50.*(100. - dnparams.Ldetail)) * TS * 0.5f); - if(settings->verbose) { + if (settings->verbose) { printf("Denoise Lab=%i\n", settings->denoiselabgamma); } @@ -665,34 +657,34 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef LUTf *denoiseigamtab; switch(settings->denoiselabgamma) { - case 0: - denoisegamtab = &(Color::gammatab_26_11); - denoiseigamtab = &(Color::igammatab_26_11); - break; + case 0: + denoisegamtab = &(Color::gammatab_26_11); + denoiseigamtab = &(Color::igammatab_26_11); + break; - case 1: - denoisegamtab = &(Color::gammatab_4); - denoiseigamtab = &(Color::igammatab_4); - break; + case 1: + denoisegamtab = &(Color::gammatab_4); + denoiseigamtab = &(Color::igammatab_4); + break; - default: - denoisegamtab = &(Color::gammatab_55); - denoiseigamtab = &(Color::igammatab_55); - break; + default: + denoisegamtab = &(Color::gammatab_55); + denoiseigamtab = &(Color::igammatab_55); + break; } array2D tilemask_in(TS, TS); array2D tilemask_out(TS, TS); - if(denoiseLuminance) { + if (denoiseLuminance) { const int border = MAX(2, TS / 16); - for (int i = 0; i < TS; i++) { + for (int i = 0; i < TS; ++i) { float i1 = abs((i > TS / 2 ? i - TS + 1 : i)); float vmask = (i1 < border ? SQR(sin((M_PI * i1) / (2 * border))) : 1.0f); float vmask2 = (i1 < 2 * border ? SQR(sin((M_PI * i1) / (2 * border))) : 1.0f); - for (int j = 0; j < TS; j++) { + for (int j = 0; j < TS; ++j) { float j1 = abs((j > TS / 2 ? j - TS + 1 : j)); tilemask_in[i][j] = (vmask * (j1 < border ? SQR(sin((M_PI * j1) / (2 * border))) : 1.0f)) + epsilon; tilemask_out[i][j] = (vmask2 * (j1 < 2 * border ? SQR(sin((M_PI * j1) / (2 * border))) : 1.0f)) + epsilon; @@ -704,28 +696,28 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int tilesize; int overlap; - if(settings->leveldnti == 0) { + if (settings->leveldnti == 0) { tilesize = 1024; overlap = 128; } - if(settings->leveldnti == 1) { + if (settings->leveldnti == 1) { tilesize = 768; overlap = 96; } int numTries = 0; - if(ponder) { + if (ponder) { printf("Tiled denoise processing caused by Automatic Multizone mode\n"); } bool memoryAllocationFailed = false; do { - numTries++; + ++numTries; - if(numTries == 2) { + if (numTries == 2) { printf("1st denoise pass failed due to insufficient memory, starting 2nd (tiled) pass now...\n"); } @@ -738,7 +730,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //output buffer Imagefloat * dsttmp; - if(numtiles == 1) { + if (numtiles == 1) { dsttmp = dst; } else { dsttmp = new Imagefloat(imwidth, imheight); @@ -746,8 +738,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for #endif - for(int i = 0; i < imheight; i++) - for(int j = 0; j < imwidth; j++) { + for (int i = 0; i < imheight; ++i) + for (int j = 0; j < imwidth; ++j) { dsttmp->r(i, j) = 0.f; dsttmp->g(i, j) = 0.f; dsttmp->b(i, j) = 0.f; @@ -763,13 +755,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // calculate max size of numblox_W. int max_numblox_W = ceil(((float)(MIN(imwidth, tilewidth))) / (offset)) + 2 * blkrad; // calculate min size of numblox_W. - int min_numblox_W = ceil(((float)((MIN(imwidth, ((numtiles_W - 1) * tileWskip) + tilewidth) ) - ((numtiles_W - 1) * tileWskip))) / (offset)) + 2 * blkrad; + int min_numblox_W = ceil(((float)((MIN(imwidth, ((numtiles_W - 1) * tileWskip) + tilewidth)) - ((numtiles_W - 1) * tileWskip))) / (offset)) + 2 * blkrad; // these are needed only for creation of the plans and will be freed before entering the parallel loop fftwf_plan plan_forward_blox[2]; fftwf_plan plan_backward_blox[2]; - if(denoiseLuminance) { + if (denoiseLuminance) { float *Lbloxtmp = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof (float)); float *fLbloxtmp = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof (float)); @@ -784,8 +776,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef plan_backward_blox[0] = fftwf_plan_many_r2r(2, nfwd, max_numblox_W, fLbloxtmp, NULL, 1, TS * TS, Lbloxtmp, NULL, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); plan_forward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, Lbloxtmp, NULL, 1, TS * TS, fLbloxtmp, NULL, 1, TS * TS, fwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); plan_backward_blox[1] = fftwf_plan_many_r2r(2, nfwd, min_numblox_W, fLbloxtmp, NULL, 1, TS * TS, Lbloxtmp, NULL, 1, TS * TS, bwdkind, FFTW_MEASURE || FFTW_DESTROY_INPUT ); - fftwf_free ( Lbloxtmp ); - fftwf_free ( fLbloxtmp ); + fftwf_free (Lbloxtmp); + fftwf_free (fLbloxtmp); } #ifndef _OPENMP @@ -794,7 +786,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // Calculate number of tiles. If less than omp_get_max_threads(), then limit num_threads to number of tiles int numthreads = MIN(numtiles, omp_get_max_threads()); - if(options.rgbDenoiseThreadLimit > 0) { + if (options.rgbDenoiseThreadLimit > 0) { numthreads = MIN(numthreads, options.rgbDenoiseThreadLimit); } @@ -802,20 +794,20 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef denoiseNestedLevels = omp_get_max_threads() / numthreads; bool oldNested = omp_get_nested(); - if(denoiseNestedLevels < 2) { + if (denoiseNestedLevels < 2) { denoiseNestedLevels = 1; } else { omp_set_nested(true); } - if(options.rgbDenoiseThreadLimit > 0) + if (options.rgbDenoiseThreadLimit > 0) while(denoiseNestedLevels * numthreads > options.rgbDenoiseThreadLimit) { denoiseNestedLevels--; } #endif - if(settings->verbose) { + if (settings->verbose) { printf("RGB_denoise uses %d main thread(s) and up to %d nested thread(s) for each main thread\n", numthreads, denoiseNestedLevels); } @@ -823,8 +815,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float *LbloxArray[denoiseNestedLevels * numthreads]; float *fLbloxArray[denoiseNestedLevels * numthreads]; - if(numtiles > 1 && denoiseLuminance) - for(int i = 0; i < denoiseNestedLevels * numthreads; i++) { + if (numtiles > 1 && denoiseLuminance) + for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { LbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); fLbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); } @@ -848,14 +840,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // begin tile processing of image #ifdef _OPENMP - #pragma omp parallel num_threads(numthreads) if(numthreads>1) + #pragma omp parallel num_threads(numthreads) if (numthreads>1) #endif { int pos; float* noisevarlum; float* noisevarchrom; - if(numtiles == 1 && isRAW && (useNoiseCCurve || useNoiseLCurve)) { + if (numtiles == 1 && isRAW && (useNoiseCCurve || useNoiseLCurve)) { noisevarlum = lumcalcBuffer; noisevarchrom = ccalcBuffer; } else { @@ -880,25 +872,25 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float interm_med = (float) dnparams.chroma / 10.0; float intermred, intermblue; - if(dnparams.redchro > 0.) { + if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { intermred = (float) dnparams.redchro / 7.0; //increase slower than linear for more sensit } - if(dnparams.bluechro > 0.) { + if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { intermblue = (float) dnparams.bluechro / 7.0; //increase slower than linear for more sensit } - if(ponder && kall == 2) { + if (ponder && kall == 2) { interm_med = ch_M[pos] / 10.f; intermred = max_r[pos] / 10.f; intermblue = max_b[pos] / 10.f; } - if(ponder && kall == 0) { + if (ponder && kall == 0) { interm_med = 0.01f; intermred = 0.f; intermblue = 0.f; @@ -929,16 +921,16 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef if (isRAW) {//image is raw; use channel differences for chroma channels - if(!denoiseMethodRgb) { //lab mode + if (!denoiseMethodRgb) { //lab mode //modification Jacques feb 2013 and july 2014 #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float R_ = gain * src->r(i, j); float G_ = gain * src->g(i, j); @@ -965,8 +957,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef labdn->a[i1][j1] = a; labdn->b[i1][j1] = b; - if(((i1 | j1) & 1) == 0) { - if(numTries == 1) { + if (((i1 | j1) & 1) == 0) { + if (numTries == 1) { noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; } else { @@ -980,13 +972,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } } else {//RGB mode #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float X = gain * src->r(i, j); @@ -1001,8 +993,8 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef labdn->a[i1][j1] = (X - Y); labdn->b[i1][j1] = (Y - Z); - if(((i1 | j1) & 1) == 0) { - if(numTries == 1) { + if (((i1 | j1) & 1) == 0) { + if (numTries == 1) { noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseLCurve ? lumcalc[i >> 1][j >> 1] : noisevarL; noisevarchrom[(i1 >> 1)*width2 + (j1 >> 1)] = useNoiseCCurve ? maxNoiseVarab * ccalc[i >> 1][j >> 1] : 1.f; } else { @@ -1015,13 +1007,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef } } else {//image is not raw; use Lab parametrization #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float L, a, b; float rLum = src->r(i, j) ; //for denoise curves @@ -1049,24 +1041,24 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef labdn->a[i1][j1] = a; labdn->b[i1][j1] = b; - if(((i1 | j1) & 1) == 0) { + if (((i1 | j1) & 1) == 0) { float Llum, alum, blum; - if(useNoiseLCurve || useNoiseCCurve) { + if (useNoiseLCurve || useNoiseCCurve) { float XL, YL, ZL; Color::rgbxyz(rLum, gLum, bLum, XL, YL, ZL, wp); Color::XYZ2Lab(XL, YL, ZL, Llum, alum, blum); } - if(useNoiseLCurve) { + if (useNoiseLCurve) { float kN = Llum; float epsi = 0.01f; - if(kN < 2.f) { + if (kN < 2.f) { kN = 2.f; } - if(kN > 32768.f) { + if (kN > 32768.f) { kN = 32768.f; } @@ -1078,12 +1070,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef noisevarlum[(i1 >> 1)*width2 + (j1 >> 1)] = noisevarL; } - if(useNoiseCCurve) { + if (useNoiseCCurve) { float aN = alum; float bN = blum; float cN = sqrtf(SQR(aN) + SQR(bN)); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero ??? } @@ -1106,20 +1098,20 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float interm_medT = (float) dnparams.chroma / 10.0; bool execwavelet = true; - if(!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { + if (!denoiseLuminance && interm_medT < 0.05f && dnparams.median && (dnparams.methodmed == "Lab" || dnparams.methodmed == "Lonly")) { execwavelet = false; //do not exec wavelet if sliders luminance and chroma are very small and median need } //we considered user don't want wavelet - if(settings->leveldnautsimpl == 1 && dnparams.Cmethod != "MAN") { + if (settings->leveldnautsimpl == 1 && dnparams.Cmethod != "MAN") { execwavelet = true; } - if(settings->leveldnautsimpl == 0 && dnparams.C2method != "MANU") { + if (settings->leveldnautsimpl == 0 && dnparams.C2method != "MANU") { execwavelet = true; } - if(execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 + if (execwavelet) {//gain time if user choose only median sliders L <=1 slider chrom master < 1 wavelet_decomposition* Ldecomp; wavelet_decomposition* adecomp; @@ -1127,66 +1119,66 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float maxreal = max(realred, realblue); //increase the level of wavelet if user increase much or very much sliders - if( maxreal < 8.f) { + if (maxreal < 8.f) { levwav = 5; - } else if( maxreal < 10.f) { + } else if (maxreal < 10.f) { levwav = 6; - } else if( maxreal < 15.f) { + } else if (maxreal < 15.f) { levwav = 7; } else { levwav = 8; //maximum ==> I have increase Maxlevel in cplx_wavelet_dec.h from 8 to 9 } - if(nrQuality == QUALITY_HIGH) { + if (nrQuality == QUALITY_HIGH) { levwav += settings->nrwavlevel; //increase level for enhanced mode } - if(levwav > 8) { + if (levwav > 8) { levwav = 8; } int minsizetile = min(tilewidth, tileheight); int maxlev2 = 8; - if(minsizetile < 256) { + if (minsizetile < 256) { maxlev2 = 7; } - if(minsizetile < 128) { + if (minsizetile < 128) { maxlev2 = 6; } - if(minsizetile < 64) { + if (minsizetile < 64) { maxlev2 = 5; } levwav = min(maxlev2, levwav); - // if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b ); + // if (settings->verbose) printf("levwavelet=%i noisevarA=%f noisevarB=%f \n",levwav, noisevarab_r, noisevarab_b); Ldecomp = new wavelet_decomposition (labdn->L[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); - if(Ldecomp->memoryAllocationFailed) { + if (Ldecomp->memoryAllocationFailed) { memoryAllocationFailed = true; } float madL[8][3]; - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { // precalculate madL, because it's used in adecomp and bdecomp int maxlvl = Ldecomp->maxlevel(); #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for schedule(dynamic) collapse(2) num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_L = Ldecomp->level_W(lvl); int Hlvl_L = Ldecomp->level_H(lvl); float ** WavCoeffs_L = Ldecomp->level_coeffs(lvl); - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madL[lvl][dir - 1] = SQR(Mad(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); } else { madL[lvl][dir - 1] = SQR(MadRgb(WavCoeffs_L[dir], Wlvl_L * Hlvl_L)); @@ -1202,29 +1194,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef adecomp = new wavelet_decomposition (labdn->a[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); - if(adecomp->memoryAllocationFailed) { + if (adecomp->memoryAllocationFailed) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { - if(nrQuality == QUALITY_STANDARD) { - if(!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + if (!memoryAllocationFailed) { + if (nrQuality == QUALITY_STANDARD) { + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - } else { /*if(nrQuality==QUALITY_HIGH)*/ - if(!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + } else { /*if (nrQuality==QUALITY_HIGH)*/ + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - if(!memoryAllocationFailed) - if(!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb )) { + if (!memoryAllocationFailed) + if (!WaveletDenoiseAllAB(*Ldecomp, *adecomp, noisevarchrom, madL, noisevarab_r, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } } } - if(!memoryAllocationFailed) { - if(kall == 0) { + if (!memoryAllocationFailed) { + if (kall == 0) { Noise_residualAB(*adecomp, chresid, chmaxresid, denoiseMethodRgb); chresidtemp = chresid; chmaxresidtemp = chmaxresid; @@ -1235,32 +1227,32 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete adecomp; - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { wavelet_decomposition* bdecomp = new wavelet_decomposition (labdn->b[0], labdn->W, labdn->H, levwav, 1, 1, max(1, denoiseNestedLevels)); - if(bdecomp->memoryAllocationFailed) { + if (bdecomp->memoryAllocationFailed) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { - if(nrQuality == QUALITY_STANDARD) { - if(!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + if (!memoryAllocationFailed) { + if (nrQuality == QUALITY_STANDARD) { + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - } else { /*if(nrQuality==QUALITY_HIGH)*/ - if(!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb )) { //enhance mode + } else { /*if (nrQuality==QUALITY_HIGH)*/ + if (!WaveletDenoiseAll_BiShrinkAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { //enhance mode memoryAllocationFailed = true; } - if(!memoryAllocationFailed) - if(!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb )) { + if (!memoryAllocationFailed) + if (!WaveletDenoiseAllAB(*Ldecomp, *bdecomp, noisevarchrom, madL, noisevarab_b, useNoiseCCurve, autoch, denoiseMethodRgb)) { memoryAllocationFailed = true; } } } - if(!memoryAllocationFailed) { - if(kall == 0) { + if (!memoryAllocationFailed) { + if (kall == 0) { Noise_residualAB(*bdecomp, chresid, chmaxresid, denoiseMethodRgb); chresid += chresidtemp; chmaxresid += chmaxresidtemp; @@ -1274,34 +1266,34 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete bdecomp; - if(!memoryAllocationFailed) { - if(denoiseLuminance) { + if (!memoryAllocationFailed) { + if (denoiseLuminance) { int edge = 0; - if(nrQuality == QUALITY_STANDARD) { - if(!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { //enhance mode + if (nrQuality == QUALITY_STANDARD) { + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { //enhance mode memoryAllocationFailed = true; } - } else { /*if(nrQuality==QUALITY_HIGH)*/ - if(!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL)) { //enhance mode + } else { /*if (nrQuality==QUALITY_HIGH)*/ + if (!WaveletDenoiseAll_BiShrinkL(*Ldecomp, noisevarlum, madL)) { //enhance mode memoryAllocationFailed = true; } - if(!memoryAllocationFailed) - if(!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { + if (!memoryAllocationFailed) + if (!WaveletDenoiseAllL(*Ldecomp, noisevarlum, madL, NULL, edge)) { memoryAllocationFailed = true; } } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { // copy labdn->L to Lin before it gets modified by reconstruction Lin = new array2D(width, height); #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for(int i = 0; i < height; i++) - for(int j = 0; j < width; j++) { + for (int i = 0; i < height; ++i) + for (int j = 0; j < width; ++j) { (*Lin)[i][j] = labdn->L[i][j]; } @@ -1314,78 +1306,78 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete Ldecomp; } - if(!memoryAllocationFailed) { - if( (metchoice == 1 || metchoice == 2 || metchoice == 3 || metchoice == 4) && dnparams.median) { + if (!memoryAllocationFailed) { + if ((metchoice == 1 || metchoice == 2 || metchoice == 3 || metchoice == 4) && dnparams.median) { float** tmL; int wid = labdn->W; int hei = labdn->H; tmL = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { tmL[i] = new float[wid]; } - Median medianTypeL = Median::SIZE_3X3_SOFT; - Median medianTypeAB = Median::SIZE_3X3_SOFT; + Median medianTypeL = Median::TYPE_3X3_SOFT; + Median medianTypeAB = Median::TYPE_3X3_SOFT; - if(dnparams.medmethod == "soft") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_3X3_SOFT; + if (dnparams.medmethod == "soft") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_SOFT; } else { - medianTypeL = Median::SIZE_3X3_SOFT; - medianTypeAB = Median::SIZE_3X3_SOFT; + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_3X3_SOFT; } - } else if(dnparams.medmethod == "33") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_3X3_STRONG; + } else if (dnparams.medmethod == "33") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_3X3_STRONG; } else { - medianTypeL = Median::SIZE_3X3_SOFT; - medianTypeAB = Median::SIZE_3X3_STRONG; + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_3X3_STRONG; } - } else if(dnparams.medmethod == "55soft") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_5X5_SOFT; + } else if (dnparams.medmethod == "55soft") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_SOFT; } else { - medianTypeL = Median::SIZE_3X3_SOFT; - medianTypeAB = Median::SIZE_5X5_SOFT; + medianTypeL = Median::TYPE_3X3_SOFT; + medianTypeAB = Median::TYPE_5X5_SOFT; } - } else if(dnparams.medmethod == "55") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_5X5_STRONG; + } else if (dnparams.medmethod == "55") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_5X5_STRONG; } else { - medianTypeL = Median::SIZE_3X3_STRONG; - medianTypeAB = Median::SIZE_5X5_STRONG; + medianTypeL = Median::TYPE_3X3_STRONG; + medianTypeAB = Median::TYPE_5X5_STRONG; } - } else if(dnparams.medmethod == "77") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_7X7; + } else if (dnparams.medmethod == "77") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_7X7; } else { - medianTypeL = Median::SIZE_3X3_STRONG; - medianTypeAB = Median::SIZE_7X7; + medianTypeL = Median::TYPE_3X3_STRONG; + medianTypeAB = Median::TYPE_7X7; } - } else if(dnparams.medmethod == "99") { - if(metchoice != 4) { - medianTypeL = medianTypeAB = Median::SIZE_9X9; + } else if (dnparams.medmethod == "99") { + if (metchoice != 4) { + medianTypeL = medianTypeAB = Median::TYPE_9X9; } else { - medianTypeL = Median::SIZE_5X5_SOFT; - medianTypeAB = Median::SIZE_9X9; + medianTypeL = Median::TYPE_5X5_SOFT; + medianTypeAB = Median::TYPE_9X9; } } if (metchoice == 1 || metchoice == 2 || metchoice == 4) { - Median_Denoise( labdn->L, labdn->L, wid, hei, medianTypeL, dnparams.passes, denoiseNestedLevels, tmL); + Median_Denoise(labdn->L, labdn->L, wid, hei, medianTypeL, dnparams.passes, denoiseNestedLevels, tmL); } - if(metchoice == 2 || metchoice == 3 || metchoice == 4) { - Median_Denoise( labdn->a, labdn->a, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); - Median_Denoise( labdn->b, labdn->b, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); + if (metchoice == 2 || metchoice == 3 || metchoice == 4) { + Median_Denoise(labdn->a, labdn->a, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); + Median_Denoise(labdn->b, labdn->b, wid, hei, medianTypeAB, dnparams.passes, denoiseNestedLevels, tmL); } - for (int i = 0; i < hei; i++) { - delete [] tmL[i]; + for (int i = 0; i < hei; ++i) { + delete[] tmL[i]; } - delete [] tmL; + delete[] tmL; } //wavelet denoised L channel @@ -1408,14 +1400,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // Main detail recovery algorithm: Block loop //DCT block data storage - if(denoiseLuminance /*&& execwavelet*/) { + if (denoiseLuminance /*&& execwavelet*/) { //residual between input and denoised L channel array2D Ldetail(width, height, ARRAY2D_CLEAR_DATA); //pixel weight array2D totwt(width, height, ARRAY2D_CLEAR_DATA); //weight for combining DCT blocks - if(numtiles == 1) - for(int i = 0; i < denoiseNestedLevels * numthreads; i++) { + if (numtiles == 1) + for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { LbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); fLbloxArray[i] = (float*) fftwf_malloc(max_numblox_W * TS * TS * sizeof(float)); } @@ -1424,7 +1416,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int masterThread = omp_get_thread_num(); #endif #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { #ifdef _RT_NESTED_OPENMP @@ -1441,12 +1433,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for #endif - for (int vblk = 0; vblk < numblox_H; vblk++) { + for (int vblk = 0; vblk < numblox_H; ++vblk) { int top = (vblk - blkrad) * offset; float * datarow = pBuf + blkrad * offset; - for (int i = 0; i < TS; i++) { + for (int i = 0; i < TS; ++i) { int row = top + i; int rr = row; @@ -1456,40 +1448,40 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef rr = MAX(0, 2 * height - 2 - row); } - for (int j = 0; j < labdn->W; j++) { + for (int j = 0; j < labdn->W; ++j) { datarow[j] = ((*Lin)[rr][j] - labdn->L[rr][j]); } - for (int j = -blkrad * offset; j < 0; j++) { + for (int j = -blkrad * offset; j < 0; ++j) { datarow[j] = datarow[MIN(-j, width - 1)]; } - for (int j = width; j < width + TS + blkrad * offset; j++) { + for (int j = width; j < width + TS + blkrad * offset; ++j) { datarow[j] = datarow[MAX(0, 2 * width - 2 - j)]; }//now we have a padded data row //now fill this row of the blocks with Lab high pass data - for (int hblk = 0; hblk < numblox_W; hblk++) { + for (int hblk = 0; hblk < numblox_W; ++hblk) { int left = (hblk - blkrad) * offset; int indx = (hblk) * TS; //index of block in malloc - if(top + i >= 0 && top + i < height) { + if (top + i >= 0 && top + i < height) { int j; - for (j = 0; j < min((-left), TS); j++) { + for (j = 0; j < min((-left), TS); ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data } - for (; j < min(TS, width - left); j++) { + for (; j < min(TS, width - left); ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data totwt[top + i][left + j] += tilemask_in[i][j] * tilemask_out[i][j]; } - for (; j < TS; j++) { + for (; j < TS; ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data } } else { - for (int j = 0; j < TS; j++) { + for (int j = 0; j < TS; ++j) { Lblox[(indx + i)*TS + j] = tilemask_in[i][j] * datarow[left + j]; // luma data } } @@ -1500,7 +1492,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //fftwf_print_plan (plan_forward_blox); - if(numblox_W == max_numblox_W) { + if (numblox_W == max_numblox_W) { fftwf_execute_r2r(plan_forward_blox[0], Lblox, fLblox); // DCT an entire row of tiles } else { fftwf_execute_r2r(plan_forward_blox[1], Lblox, fLblox); // DCT an entire row of tiles @@ -1510,14 +1502,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef // now process the vblk row of blocks for noise reduction - for (int hblk = 0; hblk < numblox_W; hblk++) { - RGBtile_denoise (fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer ); + for (int hblk = 0; hblk < numblox_W; ++hblk) { + RGBtile_denoise (fLblox, hblk, noisevar_Ldetail, nbrwt, blurbuffer); }//end of horizontal block loop //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //now perform inverse FT of an entire row of blocks - if(numblox_W == max_numblox_W) { + if (numblox_W == max_numblox_W) { fftwf_execute_r2r(plan_backward_blox[0], fLblox, Lblox); //for DCT } else { fftwf_execute_r2r(plan_backward_blox[1], fLblox, Lblox); //for DCT @@ -1526,7 +1518,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int topproc = (vblk - blkrad) * offset; //add row of blocks to output image tile - RGBoutput_tile_row (Lblox, Ldetail, tilemask_out, height, width, topproc ); + RGBoutput_tile_row (Lblox, Ldetail, tilemask_out, height, width, topproc); //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -1538,11 +1530,11 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel for num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif - for (int i = 0; i < height; i++) { - for (int j = 0; j < width; j++) { + for (int i = 0; i < height; ++i) { + for (int j = 0; j < width; ++j) { //may want to include masking threshold for large hipass data to preserve edges/detail labdn->L[i][j] += Ldetail[i][j] / totwt[i][j]; //note that labdn initially stores the denoised hipass data } @@ -1557,22 +1549,22 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float Hmask[width + 1] ALIGNED16; float newGain; - if(numtiles > 1) { - for (int i = 0; i < height; i++) { + if (numtiles > 1) { + for (int i = 0; i < height; ++i) { Vmask[i] = 1; } newGain = 1.f; - if(isRAW) { + if (isRAW) { newGain = gain; } - for (int j = 0; j < width; j++) { + for (int j = 0; j < width; ++j) { Hmask[j] = 1.f / newGain; } - for (int i = 0; i < overlap; i++) { + for (int i = 0; i < overlap; ++i) { float mask = SQR(xsinf((M_PI * i) / (2 * overlap))); if (tiletop > 0) { @@ -1597,7 +1589,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //convert back to RGB and write to destination array if (isRAW) { - if(!denoiseMethodRgb) {//Lab mode + if (!denoiseMethodRgb) {//Lab mode realred /= 100.f; realblue /= 100.f; @@ -1605,10 +1597,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for schedule(dynamic,16) num_threads(denoiseNestedLevels) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; //modification Jacques feb 2013 //true conversion Lab==>xyz @@ -1617,7 +1609,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float b = labdn->b[i1][j1]; float c_h = SQR(a) + SQR(b); - if(c_h > 9000000.f) { + if (c_h > 9000000.f) { a *= 1.f + qhighFactor * realred; b *= 1.f + qhighFactor * realblue; } @@ -1638,7 +1630,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef g_ = (*denoisegamtab)[g_]; b_ = (*denoisegamtab)[b_]; - if(numtiles == 1) { + if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; dsttmp->g(i, j) = newGain * g_; dsttmp->b(i, j) = newGain * b_; @@ -1655,14 +1647,14 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for num_threads(denoiseNestedLevels) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float c_h = sqrt(SQR(labdn->a[i1][j1]) + SQR(labdn->b[i1][j1])); - if(c_h > 3000.f) { + if (c_h > 3000.f) { labdn->a[i1][j1] *= 1.f + qhighFactor * realred / 100.f; labdn->b[i1][j1] *= 1.f + qhighFactor * realblue / 100.f; } @@ -1676,7 +1668,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef Y = Y < 32768.0f ? igamcurve[Y] : (Color::gamma((float)Y / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); Z = Z < 32768.0f ? igamcurve[Z] : (Color::gamma((float)Z / 32768.0f, igam, igamthresh, igamslope, 1.0, 0.0) * 65535.0f); - if(numtiles == 1) { + if (numtiles == 1) { dsttmp->r(i, j) = newGain * X; dsttmp->g(i, j) = newGain * Y; dsttmp->b(i, j) = newGain * Z; @@ -1695,10 +1687,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for num_threads(denoiseNestedLevels) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; //modification Jacques feb 2013 float L = labdn->L[i1][j1]; @@ -1706,7 +1698,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef float b = labdn->b[i1][j1]; float c_h = sqrt(SQR(a) + SQR(b)); - if(c_h > 3000.f) { + if (c_h > 3000.f) { a *= 1.f + qhighFactor * realred / 100.f; b *= 1.f + qhighFactor * realblue / 100.f; } @@ -1721,7 +1713,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef g_ = g_ < 32768.0f ? igamcurve[g_] : (Color::gamman((float)g_ / 32768.0f, igam) * 65535.0f); b_ = b_ < 32768.0f ? igamcurve[b_] : (Color::gamman((float)b_ / 32768.0f, igam) * 65535.0f); - if(numtiles == 1) { + if (numtiles == 1) { dsttmp->r(i, j) = newGain * r_; dsttmp->g(i, j) = newGain * g_; dsttmp->b(i, j) = newGain * b_; @@ -1740,22 +1732,22 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef delete labdn; - if(denoiseLuminance) { + if (denoiseLuminance) { delete Lin; } }//end of tile row }//end of tile loop - if(numtiles > 1 || !isRAW || (!useNoiseCCurve && !useNoiseLCurve)) { - delete [] noisevarlum; - delete [] noisevarchrom; + if (numtiles > 1 || !isRAW || (!useNoiseCCurve && !useNoiseLCurve)) { + delete[] noisevarlum; + delete[] noisevarchrom; } } - if(denoiseLuminance) { - for(int i = 0; i < denoiseNestedLevels * numthreads; i++) { + if (denoiseLuminance) { + for (int i = 0; i < denoiseNestedLevels * numthreads; ++i) { fftwf_free(LbloxArray[i]); fftwf_free(fLbloxArray[i]); } @@ -1766,10 +1758,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #endif //copy denoised image to output - if(numtiles > 1) { - if(!memoryAllocationFailed) { + if (numtiles > 1) { + if (!memoryAllocationFailed) { dsttmp->copyData(dst); - } else if(dst != src) { + } else if (dst != src) { src->copyData(dst); } @@ -1781,25 +1773,25 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp parallel for #endif - for(int i = 0; i < dst->height; i++) - for(int j = 0; j < dst->width; j++) { + for (int i = 0; i < dst->height; ++i) + for (int j = 0; j < dst->width; ++j) { dst->r(i, j) = Color::gammatab_srgb[ dst->r(i, j) ]; dst->g(i, j) = Color::gammatab_srgb[ dst->g(i, j) ]; dst->b(i, j) = Color::gammatab_srgb[ dst->b(i, j) ]; } } - if(denoiseLuminance) { + if (denoiseLuminance) { // destroy the plans - fftwf_destroy_plan( plan_forward_blox[0] ); - fftwf_destroy_plan( plan_backward_blox[0] ); - fftwf_destroy_plan( plan_forward_blox[1] ); - fftwf_destroy_plan( plan_backward_blox[1] ); + fftwf_destroy_plan(plan_forward_blox[0]); + fftwf_destroy_plan(plan_backward_blox[0]); + fftwf_destroy_plan(plan_forward_blox[1]); + fftwf_destroy_plan(plan_backward_blox[1]); fftwf_cleanup(); } } while(memoryAllocationFailed && numTries < 2 && (options.rgbDenoiseThreadLimit == 0) && !ponder); - if(memoryAllocationFailed) { + if (memoryAllocationFailed) { printf("tiled denoise failed due to isufficient memory. Output is not denoised!\n"); } @@ -1807,13 +1799,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //median 3x3 in complement on RGB - if(dnparams.methodmed == "RGB" && dnparams.median) { + if (dnparams.methodmed == "RGB" && dnparams.median) { //printf("RGB den\n"); int wid = dst->width, hei = dst->height; float** tm; tm = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { tm[i] = new float[wid]; } @@ -1828,64 +1820,64 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef int methmed = 0; int border = 1; - if(dnparams.rgbmethod == "soft") { + if (dnparams.rgbmethod == "soft") { methmed = 0; - } else if(dnparams.rgbmethod == "33") { + } else if (dnparams.rgbmethod == "33") { methmed = 1; - } else if(dnparams.rgbmethod == "55") { + } else if (dnparams.rgbmethod == "55") { methmed = 3; border = 2; - } else if(dnparams.rgbmethod == "55soft") { + } else if (dnparams.rgbmethod == "55soft") { methmed = 2; border = 2; } - for(int iteration = 1; iteration <= dnparams.passes; iteration++) { + for (int iteration = 1; iteration <= dnparams.passes; ++iteration) { #pragma omp parallel { - if(methmed < 2) + if (methmed < 2) { #pragma omp for - for (int i = 1; i < hei - 1; i++) { - if(methmed == 0) - for (int j = 1; j < wid - 1; j++) { + for (int i = 1; i < hei - 1; ++i) { + if (methmed == 0) + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1)); //3x3 soft } else - for (int j = 1; j < wid - 1; j++) { + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1)); //3x3 } } } else { #pragma omp for - for (int i = 2; i < hei - 2; i++) + for (int i = 2; i < hei - 2; ++i) { - if(methmed == 3) { - for (int j = 2; j < wid - 2; j++) { + if (methmed == 3) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->r(i, j), source->r(i - 1, j), source->r(i + 1, j), source->r(i, j + 1), source->r(i, j - 1), source->r(i - 1, j - 1), source->r(i - 1, j + 1), source->r(i + 1, j - 1), source->r(i + 1, j + 1), source->r(i - 2, j), source->r(i + 2, j), source->r(i, j + 2), source->r(i, j - 2), source->r(i - 2, j - 2), source->r(i - 2, j + 2), source->r(i + 2, j - 2), source->r(i + 2, j + 2), source->r(i - 2, j + 1), source->r(i + 2, j + 1), source->r(i - 1, j + 2), source->r(i - 1, j - 2), source->r(i - 2, j - 1), source->r(i + 2, j - 1), source->r(i + 1, j + 2), source->r(i + 1, j - 2));//5x5 } } else - for (int j = 2; j < wid - 2; j++) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( - source->r(i, j), - source->r(i - 1, j), - source->r(i + 1, j), - source->r(i, j + 1), - source->r(i, j - 1), - source->r(i - 1, j - 1), - source->r(i - 1, j + 1), - source->r(i + 1, j - 1), - source->r(i + 1, j + 1), - source->r(i + 2, j), - source->r(i - 2, j), - source->r(i, j + 2), - source->r(i, j - 2) - ); // 5x5 soft + source->r(i, j), + source->r(i - 1, j), + source->r(i + 1, j), + source->r(i, j + 1), + source->r(i, j - 1), + source->r(i - 1, j - 1), + source->r(i - 1, j + 1), + source->r(i + 1, j - 1), + source->r(i + 1, j + 1), + source->r(i + 2, j), + source->r(i - 2, j), + source->r(i, j + 2), + source->r(i, j - 2) + ); // 5x5 soft } } } @@ -1893,55 +1885,55 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for nowait #endif - for(int i = border; i < hei - border; i++ ) + for (int i = border; i < hei - border; ++i) { - for(int j = border; j < wid - border; j++) { + for (int j = border; j < wid - border; ++j) { dst->r(i, j) = tm[i][j]; } } - if(methmed < 2) + if (methmed < 2) { #pragma omp for - for (int i = 1; i < hei - 1; i++) { - if(methmed == 0) - for (int j = 1; j < wid - 1; j++) { + for (int i = 1; i < hei - 1; ++i) { + if (methmed == 0) + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1)); } else - for (int j = 1; j < wid - 1; j++) { + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1)); } } } else { #pragma omp for - for (int i = 2; i < hei - 2; i++) + for (int i = 2; i < hei - 2; ++i) { - if(methmed == 3) { - for (int j = 2; j < wid - 2; j++) { + if (methmed == 3) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->b(i, j), source->b(i - 1, j), source->b(i + 1, j), source->b(i, j + 1), source->b(i, j - 1), source->b(i - 1, j - 1), source->b(i - 1, j + 1), source->b(i + 1, j - 1), source->b(i + 1, j + 1), source->b(i - 2, j), source->b(i + 2, j), source->b(i, j + 2), source->b(i, j - 2), source->b(i - 2, j - 2), source->b(i - 2, j + 2), source->b(i + 2, j - 2), source->b(i + 2, j + 2), source->b(i - 2, j + 1), source->b(i + 2, j + 1), source->b(i - 1, j + 2), source->b(i - 1, j - 2), source->b(i - 2, j - 1), source->b(i + 2, j - 1), source->b(i + 1, j + 2), source->b(i + 1, j - 2)); // 5x5 } } else - for (int j = 2; j < wid - 2; j++) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( - source->b(i, j), - source->b(i - 1, j), - source->b(i + 1, j), - source->b(i, j + 1), - source->b(i, j - 1), - source->b(i - 1, j - 1), - source->b(i - 1, j + 1), - source->b(i + 1, j - 1), - source->b(i + 1, j + 1), - source->b(i + 2, j), - source->b(i - 2, j), - source->b(i, j + 2), - source->b(i, j - 2) - ); // 5x5 soft + source->b(i, j), + source->b(i - 1, j), + source->b(i + 1, j), + source->b(i, j + 1), + source->b(i, j - 1), + source->b(i - 1, j - 1), + source->b(i - 1, j + 1), + source->b(i + 1, j - 1), + source->b(i + 1, j + 1), + source->b(i + 2, j), + source->b(i - 2, j), + source->b(i, j + 2), + source->b(i, j - 2) + ); // 5x5 soft } } } @@ -1950,56 +1942,56 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for nowait #endif - for(int i = border; i < hei - border; i++ ) + for (int i = border; i < hei - border; ++i) { - for(int j = border; j < wid - border; j++) { + for (int j = border; j < wid - border; ++j) { dst->b(i, j) = tm[i][j]; } } - if(methmed < 2) + if (methmed < 2) { #pragma omp for - for (int i = 1; i < hei - 1; i++) { - if(methmed == 0) - for (int j = 1; j < wid - 1; j++) { + for (int i = 1; i < hei - 1; ++i) { + if (methmed == 0) + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1)); } else - for (int j = 1; j < wid - 1; j++) { + for (int j = 1; j < wid - 1; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1)); } } } else { #pragma omp for - for (int i = 2; i < hei - 2; i++) + for (int i = 2; i < hei - 2; ++i) { - if(methmed == 3) { - for (int j = 2; j < wid - 2; j++) { + if (methmed == 3) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median(source->g(i, j), source->g(i - 1, j), source->g(i + 1, j), source->g(i, j + 1), source->g(i, j - 1), source->g(i - 1, j - 1), source->g(i - 1, j + 1), source->g(i + 1, j - 1), source->g(i + 1, j + 1), source->g(i - 2, j), source->g(i + 2, j), source->g(i, j + 2), source->g(i, j - 2), source->g(i - 2, j - 2), source->g(i - 2, j + 2), source->g(i + 2, j - 2), source->g(i + 2, j + 2), source->g(i - 2, j + 1), source->g(i + 2, j + 1), source->g(i - 1, j + 2), source->g(i - 1, j - 2), source->g(i - 2, j - 1), source->g(i + 2, j - 1), source->g(i + 1, j + 2), source->g(i + 1, j - 2)); // 5x5 } } else - for (int j = 2; j < wid - 2; j++) { + for (int j = 2; j < wid - 2; ++j) { tm[i][j] = median( - source->g(i, j), - source->g(i - 1, j), - source->g(i + 1, j), - source->g(i, j + 1), - source->g(i, j - 1), - source->g(i - 1, j - 1), - source->g(i - 1, j + 1), - source->g(i + 1, j - 1), - source->g(i + 1, j + 1), - source->g(i + 2, j), - source->g(i - 2, j), - source->g(i, j + 2), - source->g(i, j - 2) - ); // 5x5 soft + source->g(i, j), + source->g(i - 1, j), + source->g(i + 1, j), + source->g(i, j + 1), + source->g(i, j - 1), + source->g(i - 1, j - 1), + source->g(i - 1, j + 1), + source->g(i + 1, j - 1), + source->g(i + 1, j + 1), + source->g(i + 2, j), + source->g(i - 2, j), + source->g(i, j + 2), + source->g(i, j - 2) + ); // 5x5 soft } } } @@ -2008,29 +2000,29 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef #pragma omp for #endif - for(int i = border; i < hei - border; i++ ) + for (int i = border; i < hei - border; ++i) { - for(int j = border; j < wid - border; j++) { + for (int j = border; j < wid - border; ++j) { dst->g(i, j) = tm[i][j]; } } } } - for (int i = 0; i < hei; i++) { - delete [] tm[i]; + for (int i = 0; i < hei; ++i) { + delete[] tm[i]; } - delete [] tm; + delete[] tm; } //end median - if(noiseLCurve || useNoiseCCurve) { - delete [] lumcalcBuffer; - delete [] lumcalc; - delete [] ccalcBuffer; - delete [] ccalc; + if (noiseLCurve || useNoiseCCurve) { + delete[] lumcalcBuffer; + delete[] lumcalc; + delete[] ccalcBuffer; + delete[] ccalc; } //#ifdef _DEBUG @@ -2049,7 +2041,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise(int kall, Imagefloat * src, Imagef //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer ) //for DCT +SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, float noisevar_Ldetail, float * nbrwt, float * blurbuffer) //for DCT { int blkstart = hblproc * TS * TS; @@ -2057,17 +2049,17 @@ SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, #ifdef __SSE2__ __m128 tempv; - __m128 noisevar_Ldetailv = _mm_set1_ps( noisevar_Ldetail ); - __m128 onev = _mm_set1_ps( 1.0f ); + __m128 noisevar_Ldetailv = _mm_set1_ps(noisevar_Ldetail); + __m128 onev = _mm_set1_ps(1.0f); for (int n = 0; n < TS * TS; n += 4) { //for DCT - tempv = onev - xexpf( -SQRV( LVF(nbrwt[n])) / noisevar_Ldetailv); - _mm_storeu_ps( &fLblox[blkstart + n], LVFU(fLblox[blkstart + n]) * tempv ); + tempv = onev - xexpf(-SQRV(LVF(nbrwt[n])) / noisevar_Ldetailv); + _mm_storeu_ps(&fLblox[blkstart + n], LVFU(fLblox[blkstart + n]) * tempv); }//output neighbor averaged result #else - for (int n = 0; n < TS * TS; n++) { //for DCT + for (int n = 0; n < TS * TS; ++n) { //for DCT fLblox[blkstart + n] *= (1 - xexpf(-SQR(nbrwt[n]) / noisevar_Ldetail)); }//output neighbor averaged result @@ -2082,25 +2074,25 @@ SSEFUNCTION void ImProcFunctions::RGBtile_denoise (float * fLblox, int hblproc, //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% //%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top ) +void ImProcFunctions::RGBoutput_tile_row (float *bloxrow_L, float ** Ldetail, float ** tilemask_out, int height, int width, int top) { const int numblox_W = ceil(((float)(width)) / (offset)); const float DCTnorm = 1.0f / (4 * TS * TS); //for DCT int imin = MAX(0, -top); - int bottom = MIN( top + TS, height); + int bottom = MIN(top + TS, height); int imax = bottom - top; //add row of tiles to output image - for (int i = imin; i < imax; i++) - for (int hblk = 0; hblk < numblox_W; hblk++) { + for (int i = imin; i < imax; ++i) + for (int hblk = 0; hblk < numblox_W; ++hblk) { int left = (hblk - blkrad) * offset; int right = MIN(left + TS, width); int jmin = MAX(0, -left); int jmax = right - left; int indx = hblk * TS; - for (int j = jmin; j < jmax; j++) { // this loop gets auto vectorized by gcc + for (int j = jmin; j < jmax; ++j) { // this loop gets auto vectorized by gcc Ldetail[top + i][left + j] += tilemask_out[i][j] * bloxrow_L[(indx + i) * TS + j] * DCTnorm; //for DCT } @@ -2125,12 +2117,12 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) int * histo = new int[65536]; //memset(histo, 0, 65536*sizeof(histo)); - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { histo[i] = 0; } //calculate histogram of absolute values of HH wavelet coeffs - for (int i = 0; i < datalen; i++) { + for (int i = 0; i < datalen; ++i) { histo[MAX(0, MIN(65535, abs((int)DataList[i])))]++; } @@ -2139,7 +2131,7 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) while (count < datalen / 2) { count += histo[median]; - median++; + ++median; } //find max of histogram @@ -2154,11 +2146,11 @@ float ImProcFunctions::MadMax(float * DataList, int & max, int datalen) delete[] histo; // interpolate - return (( (median - 1) + (datalen / 2 - count_) / ((float)(count - count_)) ) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); } -float ImProcFunctions::Mad( float * DataList, const int datalen) +float ImProcFunctions::Mad(float * DataList, const int datalen) { //computes Median Absolute Deviation @@ -2166,7 +2158,7 @@ float ImProcFunctions::Mad( float * DataList, const int datalen) int histo[256] ALIGNED64 = {0}; //calculate histogram of absolute values of wavelet coeffs - for (int i = 0; i < datalen; i++) { + for (int i = 0; i < datalen; ++i) { histo[min(255, abs((int)DataList[i]))]++; } @@ -2175,30 +2167,30 @@ float ImProcFunctions::Mad( float * DataList, const int datalen) while (count < datalen / 2) { count += histo[median]; - median++; + ++median; } int count_ = count - histo[median - 1]; // interpolate - return (( (median - 1) + (datalen / 2 - count_) / ((float)(count - count_)) ) / 0.6745); + return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); } -float ImProcFunctions::MadRgb( float * DataList, const int datalen) +float ImProcFunctions::MadRgb(float * DataList, const int datalen) { //computes Median Absolute Deviation //DataList values should mostly have abs val < 65536 because we are in RGB mode int * histo = new int[65536]; - for(int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { histo[i] = 0; } //calculate histogram of absolute values of wavelet coeffs int i; - for (i = 0; i < datalen; i++) { + for (i = 0; i < datalen; ++i) { histo[min(65536, abs((int)DataList[i]))]++; } @@ -2207,14 +2199,14 @@ float ImProcFunctions::MadRgb( float * DataList, const int datalen) while (count < datalen / 2) { count += histo[median]; - median++; + ++median; } int count_ = count - histo[median - 1]; // interpolate - delete [] histo; - return (( (median - 1) + (datalen / 2 - count_) / ((float)(count - count_)) ) / 0.6745); + delete[] histo; + return (((median - 1) + (datalen / 2 - count_) / ((float)(count - count_))) / 0.6745); } @@ -2226,7 +2218,7 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, float madC; float maxresid = 0.f; - for (int lvl = 0; lvl < maxlvl; lvl++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); @@ -2234,8 +2226,8 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - for (int dir = 1; dir < 4; dir++) { - if(denoiseMethodRgb) { + for (int dir = 1; dir < 4; ++dir) { + if (denoiseMethodRgb) { madC = SQR(MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); } else { madC = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); @@ -2243,7 +2235,7 @@ void ImProcFunctions::Noise_residualAB(wavelet_decomposition &WaveletCoeffs_ab, resid += madC; - if(madC > maxresid ) { + if (madC > maxresid) { maxresid = madC; } } @@ -2260,19 +2252,19 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[3]; @@ -2280,18 +2272,18 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif for (int lvl = maxlvl - 1; lvl >= 0; lvl--) { //for levels less than max, use level diff to make edge mask - for (int dir = 1; dir < 4; dir++) { + for (int dir = 1; dir < 4; ++dir) { int Wlvl_L = WaveletCoeffs_L.level_W(lvl); int Hlvl_L = WaveletCoeffs_L.level_H(lvl); @@ -2300,7 +2292,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit if (lvl == maxlvl - 1) { float vari[4]; int edge = 0; - ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], NULL, edge ); + ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], NULL, edge); } else { //simple wavelet shrinkage float * sfave = buffer[0] + 32; @@ -2312,7 +2304,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit float levelFactor = mad_Lr * 5.f / (lvl + 1); #ifdef __SSE2__ __m128 mad_Lv; - __m128 ninev = _mm_set1_ps( 9.0f ); + __m128 ninev = _mm_set1_ps(9.0f); __m128 epsv = _mm_set1_ps(eps); __m128 mag_Lv; __m128 levelFactorv = _mm_set1_ps(levelFactor); @@ -2321,18 +2313,18 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit for (coeffloc_L = 0; coeffloc_L < Hlvl_L * Wlvl_L - 3; coeffloc_L += 4) { mad_Lv = LVFU(noisevarlum[coeffloc_L]) * levelFactorv; mag_Lv = SQRV(LVFU(WavCoeffs_L[dir][coeffloc_L])); - _mm_storeu_ps(&sfave[coeffloc_L], mag_Lv / ( mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev) ) + epsv)); + _mm_storeu_ps(&sfave[coeffloc_L], mag_Lv / (mag_Lv + mad_Lv * xexpf(-mag_Lv / (mad_Lv * ninev)) + epsv)); } - for (; coeffloc_L < Hlvl_L * Wlvl_L; coeffloc_L++) { + for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); sfave[coeffloc_L] = mag_L / (mag_L + levelFactor * noisevarlum[coeffloc_L] * xexpf(-mag_L / (9.f * levelFactor * noisevarlum[coeffloc_L])) + eps); } #else - for (int i = 0; i < Hlvl_L; i++) - for (int j = 0; j < Wlvl_L; j++) { + for (int i = 0; i < Hlvl_L; ++i) + for (int j = 0; j < Wlvl_L; ++j) { int coeffloc_L = i * Wlvl_L + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_L]); @@ -2353,7 +2345,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit } // few remaining pixels - for (; coeffloc_L < Hlvl_L * Wlvl_L; coeffloc_L++) { + for (; coeffloc_L < Hlvl_L * Wlvl_L; ++coeffloc_L) { float sf_L = sfave[coeffloc_L]; //use smoothed shrinkage unless local shrinkage is much less WavCoeffs_L[dir][coeffloc_L] *= (SQR(sfaved[coeffloc_L]) + SQR(sf_L)) / (sfaved[coeffloc_L] + sf_L + eps); @@ -2361,8 +2353,8 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit #else - for (int i = 0; i < Hlvl_L; i++) - for (int j = 0; j < Wlvl_L; j++) { + for (int i = 0; i < Hlvl_L; ++i) + for (int j = 0; j < Wlvl_L; ++j) { int coeffloc_L = i * Wlvl_L + j; float sf_L = sfave[coeffloc_L]; //use smoothed shrinkage unless local shrinkage is much less @@ -2375,9 +2367,9 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkL(wavelet_decomposit } } - for(int i = 2; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 2; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } @@ -2389,7 +2381,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi { int maxlvl = WaveletCoeffs_L.maxlevel(); - if(autoch && noisevar_ab <= 0.001f) { + if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; } @@ -2397,19 +2389,19 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[3]; @@ -2417,25 +2409,25 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { // compute median absolute deviation (MAD) of detail coefficients as robust noise estimator int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); float ** WavCoeffs_ab = WaveletCoeffs_ab.level_coeffs(lvl); - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madab[lvl][dir - 1] = SQR(Mad(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); } else { madab[lvl][dir - 1] = SQR(MadRgb(WavCoeffs_ab[dir], Wlvl_ab * Hlvl_ab)); @@ -2448,7 +2440,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi #endif for (int lvl = maxlvl - 1; lvl >= 0; lvl--) { //for levels less than max, use level diff to make edge mask - for (int dir = 1; dir < 4; dir++) { + for (int dir = 1; dir < 4; ++dir) { int Wlvl_ab = WaveletCoeffs_ab.level_W(lvl); int Hlvl_ab = WaveletCoeffs_ab.level_H(lvl); @@ -2485,7 +2477,7 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } // few remaining pixels - for (; coeffloc_ab < Hlvl_ab * Wlvl_ab; coeffloc_ab++) { + for (; coeffloc_ab < Hlvl_ab * Wlvl_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); WavCoeffs_ab[dir][coeffloc_ab] *= SQR(1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * mad_abr)) - (mag_L / (9.f * mad_Lr)))/*satfactor_a*/); @@ -2493,8 +2485,8 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi #else - for (int i = 0; i < Hlvl_ab; i++) { - for (int j = 0; j < Wlvl_ab; j++) { + for (int i = 0; i < Hlvl_ab; ++i) { + for (int j = 0; j < Wlvl_ab; ++j) { int coeffloc_ab = i * Wlvl_ab + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab ]); @@ -2513,9 +2505,9 @@ SSEFUNCTION bool ImProcFunctions::WaveletDenoiseAll_BiShrinkAB(wavelet_decomposi } } - for(int i = 2; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 2; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } @@ -2529,25 +2521,25 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, int maxlvl = min(WaveletCoeffs_L.maxlevel(), 5); - if(edge == 1) { + if (edge == 1) { maxlvl = 4; //for refine denoise edge wavelet } int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[4]; @@ -2556,25 +2548,25 @@ bool ImProcFunctions::WaveletDenoiseAllL(wavelet_decomposition &WaveletCoeffs_L, buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; buffer[3] = new (std::nothrow) float[maxWL * maxHL + 128]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL || buffer[3] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL || buffer[3] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { ShrinkAllL(WaveletCoeffs_L, buffer, lvl, dir, noisevarlum, madL[lvl], vari, edge); } } } - for(int i = 3; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 3; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } return (!memoryAllocationFailed); @@ -2589,19 +2581,19 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L int maxlvl = WaveletCoeffs_L.maxlevel(); int maxWL = 0, maxHL = 0; - for (int lvl = 0; lvl < maxlvl; lvl++) { - if(WaveletCoeffs_L.level_W(lvl) > maxWL) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + if (WaveletCoeffs_L.level_W(lvl) > maxWL) { maxWL = WaveletCoeffs_L.level_W(lvl); } - if(WaveletCoeffs_L.level_H(lvl) > maxHL) { + if (WaveletCoeffs_L.level_H(lvl) > maxHL) { maxHL = WaveletCoeffs_L.level_H(lvl); } } bool memoryAllocationFailed = false; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel num_threads(denoiseNestedLevels) if(denoiseNestedLevels>1) + #pragma omp parallel num_threads(denoiseNestedLevels) if (denoiseNestedLevels>1) #endif { float *buffer[3]; @@ -2609,25 +2601,25 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L buffer[1] = new (std::nothrow) float[maxWL * maxHL + 64]; buffer[2] = new (std::nothrow) float[maxWL * maxHL + 96]; - if(buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { + if (buffer[0] == NULL || buffer[1] == NULL || buffer[2] == NULL) { memoryAllocationFailed = true; } - if(!memoryAllocationFailed) { + if (!memoryAllocationFailed) { #ifdef _RT_NESTED_OPENMP #pragma omp for schedule(dynamic) collapse(2) #endif - for (int lvl = 0; lvl < maxlvl; lvl++) { - for (int dir = 1; dir < 4; dir++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { + for (int dir = 1; dir < 4; ++dir) { ShrinkAllAB(WaveletCoeffs_L, WaveletCoeffs_ab, buffer, lvl, dir, noisevarchrom, noisevar_ab, useNoiseCCurve, autoch, denoiseMethodRgb, madL[lvl]); } } } - for(int i = 2; i >= 0; i--) - if(buffer[i] != NULL) { - delete [] buffer[i]; + for (int i = 2; i >= 0; i--) + if (buffer[i] != NULL) { + delete[] buffer[i]; } } return (!memoryAllocationFailed); @@ -2638,7 +2630,7 @@ bool ImProcFunctions::WaveletDenoiseAllAB(wavelet_decomposition &WaveletCoeffs_L SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeffs_L, float **buffer, int level, int dir, - float *noisevarlum, float * madL, float * vari, int edge ) + float *noisevarlum, float * madL, float * vari, int edge) { //simple wavelet shrinkage @@ -2655,10 +2647,10 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff // printf("OK lev=%d\n",level); float mad_L = madL[dir - 1] ; - if(edge == 1) { + if (edge == 1) { noisevarlum = blurBuffer; // we need one buffer, but fortunately we don't have to allocate a new one because we can use blurBuffer - for (int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; ++i) { noisevarlum[i] = vari[level]; } } @@ -2668,25 +2660,25 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff __m128 magv; __m128 levelFactorv = _mm_set1_ps(levelFactor); __m128 mad_Lv; - __m128 ninev = _mm_set1_ps( 9.0f ); - __m128 epsv = _mm_set1_ps( eps ); + __m128 ninev = _mm_set1_ps(9.0f); + __m128 epsv = _mm_set1_ps(eps); int i; for (i = 0; i < W_L * H_L - 3; i += 4) { mad_Lv = LVFU(noisevarlum[i]) * levelFactorv; magv = SQRV(LVFU(WavCoeffs_L[dir][i])); - _mm_storeu_ps( &sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); + _mm_storeu_ps(&sfave[i], magv / (magv + mad_Lv * xexpf(-magv / (ninev * mad_Lv)) + epsv)); } // few remaining pixels - for (; i < W_L * H_L; i++) { + for (; i < W_L * H_L; ++i) { float mag = SQR(WavCoeffs_L[dir][i]); sfave[i] = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); } #else - for (int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; ++i) { float mag = SQR(WavCoeffs_L[dir][i]); float shrinkfactor = mag / (mag + levelFactor * noisevarlum[i] * xexpf(-mag / (9 * levelFactor * noisevarlum[i])) + eps); @@ -2702,11 +2694,11 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff for (i = 0; i < W_L * H_L - 3; i += 4) { sfv = LVFU(sfave[i]); //use smoothed shrinkage unless local shrinkage is much less - _mm_storeu_ps( &WavCoeffs_L[dir][i], _mm_loadu_ps( &WavCoeffs_L[dir][i]) * (SQRV( LVFU(sfaved[i] )) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); + _mm_storeu_ps(&WavCoeffs_L[dir][i], _mm_loadu_ps(&WavCoeffs_L[dir][i]) * (SQRV(LVFU(sfaved[i])) + SQRV(sfv)) / (LVFU(sfaved[i]) + sfv + epsv)); } // few remaining pixels - for (; i < W_L * H_L; i++) { + for (; i < W_L * H_L; ++i) { float sf = sfave[i]; //use smoothed shrinkage unless local shrinkage is much less @@ -2715,7 +2707,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff #else - for (int i = 0; i < W_L * H_L; i++) { + for (int i = 0; i < W_L * H_L; ++i) { float sf = sfave[i]; //use smoothed shrinkage unless local shrinkage is much less @@ -2729,13 +2721,13 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllL(wavelet_decomposition &WaveletCoeff SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoeffs_L, wavelet_decomposition &WaveletCoeffs_ab, float **buffer, int level, int dir, float *noisevarchrom, float noisevar_ab, const bool useNoiseCCurve, bool autoch, - bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated ) + bool denoiseMethodRgb, float * madL, float * madaab, bool madCalculated) { //simple wavelet shrinkage const float eps = 0.01f; - if(autoch && noisevar_ab <= 0.001f) { + if (autoch && noisevar_ab <= 0.001f) { noisevar_ab = 0.02f; } @@ -2752,10 +2744,10 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef float madab; float mad_L = madL[dir - 1]; - if(madCalculated) { + if (madCalculated) { madab = madaab[dir - 1]; } else { - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madab = SQR(Mad(WavCoeffs_ab[dir], W_ab * H_ab)); } else { madab = SQR(MadRgb(WavCoeffs_ab[dir], W_ab * H_ab)); @@ -2783,7 +2775,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef } // few remaining pixels - for (; coeffloc_ab < H_ab * W_ab; coeffloc_ab++) { + for (; coeffloc_ab < H_ab * W_ab; ++coeffloc_ab) { float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); sfaveab[coeffloc_ab] = (1.f - xexpf(-(mag_ab / (noisevarchrom[coeffloc_ab] * madab)) - (mag_L / (9.f * mad_L)))); @@ -2791,8 +2783,8 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef #else - for (int i = 0; i < H_ab; i++) { - for (int j = 0; j < W_ab; j++) { + for (int i = 0; i < H_ab; ++i) { + for (int j = 0; j < W_ab; ++j) { int coeffloc_ab = i * W_ab + j; float mag_L = SQR(WavCoeffs_L[dir][coeffloc_ab]); float mag_ab = SQR(WavCoeffs_ab[dir][coeffloc_ab]); @@ -2813,11 +2805,11 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef sfaveabv = LVFU(sfaveabd[coeffloc_ab]); //use smoothed shrinkage unless local shrinkage is much less - _mm_storeu_ps( &WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); + _mm_storeu_ps(&WavCoeffs_ab[dir][coeffloc_ab], LVFU(WavCoeffs_ab[dir][coeffloc_ab]) * (SQRV(sfaveabv) + SQRV(sfabv)) / (sfaveabv + sfabv + epsv)); } // few remaining pixels - for (; coeffloc_ab < H_ab * W_ab; coeffloc_ab++) { + for (; coeffloc_ab < H_ab * W_ab; ++coeffloc_ab) { //modification Jacques feb 2013 float sfab = sfaveab[coeffloc_ab]; @@ -2827,8 +2819,8 @@ SSEFUNCTION void ImProcFunctions::ShrinkAllAB(wavelet_decomposition &WaveletCoef #else - for (int i = 0; i < H_ab; i++) { - for (int j = 0; j < W_ab; j++) { + for (int i = 0; i < H_ab; ++i) { + for (int j = 0; j < W_ab; ++j) { int coeffloc_ab = i * W_ab + j; float sfab = sfaveab[coeffloc_ab]; @@ -2849,7 +2841,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** { //simple wavelet shrinkage - if(lvl == 1) { //only one time + if (lvl == 1) { //only one time float chro = 0.f; float dev = 0.f; float devL = 0.f; @@ -2861,29 +2853,29 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** float skin_c = 0.f; int nsk = 0; - for (int i = 0; i < H_ab; i++) { - for (int j = 0; j < W_ab; j++) { + for (int i = 0; i < H_ab; ++i) { + for (int j = 0; j < W_ab; ++j) { chro += noisevarchrom[i][j]; - nc++; + ++nc; dev += SQR(noisevarchrom[i][j] - (chro / nc)); - if(noisevarhue[i][j] > -0.8f && noisevarhue[i][j] < 2.0f && noisevarchrom[i][j] > 10000.f) {//saturated red yellow + if (noisevarhue[i][j] > -0.8f && noisevarhue[i][j] < 2.0f && noisevarchrom[i][j] > 10000.f) {//saturated red yellow red_yel += noisevarchrom[i][j]; - nry++; + ++nry; } - if(noisevarhue[i][j] > 0.f && noisevarhue[i][j] < 1.6f && noisevarchrom[i][j] < 10000.f) {//skin + if (noisevarhue[i][j] > 0.f && noisevarhue[i][j] < 1.6f && noisevarchrom[i][j] < 10000.f) {//skin skin_c += noisevarchrom[i][j]; - nsk++; + ++nsk; } lume += noisevarlum[i][j]; - nL++; + ++nL; devL += SQR(noisevarlum[i][j] - (lume / nL)); } } - if(nc > 0) { + if (nc > 0) { chromina = chro / nc; sigma = sqrt(dev / nc); nsknc = (float)nsk / (float)nc; @@ -2891,26 +2883,26 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** nsknc = (float)nsk; } - if(nL > 0) { + if (nL > 0) { lumema = lume / nL; sigma_L = sqrt(devL / nL); } - if(nry > 0) { + if (nry > 0) { redyel = red_yel / nry; } - if(nsk > 0) { + if (nsk > 0) { skinc = skin_c / nsk; } } const float reduc = (schoice == 2) ? (float) settings->nrhigh : 1.f; - for (int dir = 1; dir < 4; dir++) { + for (int dir = 1; dir < 4; ++dir) { float mada, madb; - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { mada = SQR(Mad(WavCoeffs_a[dir], W_ab * H_ab)); } else { mada = SQR(MadRgb(WavCoeffs_a[dir], W_ab * H_ab)); @@ -2918,18 +2910,18 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** chred += mada; - if(mada > maxchred) { + if (mada > maxchred) { maxchred = mada; } - if(mada < minchred) { + if (mada < minchred) { minchred = mada; } maxredaut = sqrt(reduc * maxchred); minredaut = sqrt(reduc * minchred); - if(!denoiseMethodRgb) { + if (!denoiseMethodRgb) { madb = SQR(Mad(WavCoeffs_b[dir], W_ab * H_ab)); } else { madb = SQR(MadRgb(WavCoeffs_b[dir], W_ab * H_ab)); @@ -2937,11 +2929,11 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** chblue += madb; - if(madb > maxchblue) { + if (madb > maxchblue) { maxchblue = madb; } - if(madb < minchblue) { + if (madb < minchblue) { minchblue = madb; } @@ -2949,7 +2941,7 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** minblueaut = sqrt(reduc * minchblue); chau += (mada + madb); - nb++; + ++nb; //here evaluation of automatic chaut = sqrt(reduc * chau / (nb + nb)); redaut = sqrt(reduc * chred / nb); @@ -2962,12 +2954,12 @@ SSEFUNCTION void ImProcFunctions::ShrinkAll_info(float ** WavCoeffs_a, float ** void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition &WaveletCoeffs_a, wavelet_decomposition &WaveletCoeffs_b, float **noisevarlum, float **noisevarchrom, float **noisevarhue, int width, int height, float noisevar_abr, float noisevar_abb, LabImage * noi, float &chaut, int &Nb, float &redaut, float &blueaut, float &maxredaut, float &maxblueaut, float &minredaut, float &minblueaut, int schoice, bool autoch, - float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread ) + float &chromina, float &sigma, float &lumema, float &sigma_L, float &redyel, float &skinc, float &nsknc, float &maxchred, float &maxchblue, float &minchred, float &minchblue, int &nb, float &chau, float &chred, float &chblue, bool denoiseMethodRgb, bool multiThread) { int maxlvl = levwav; - for (int lvl = 0; lvl < maxlvl; lvl++) { + for (int lvl = 0; lvl < maxlvl; ++lvl) { int Wlvl_ab = WaveletCoeffs_a.level_W(lvl); int Hlvl_ab = WaveletCoeffs_a.level_H(lvl); @@ -2979,7 +2971,7 @@ void ImProcFunctions::WaveletDenoiseAll_info(int levwav, wavelet_decomposition & ShrinkAll_info(WavCoeffs_a, WavCoeffs_b, lvl, Wlvl_ab, Hlvl_ab, skip_ab, noisevarlum, noisevarchrom, noisevarhue, width, height, noisevar_abr, noisevar_abb, noi, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, - autoch, schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb, multiThread ); + autoch, schoice, lvl, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau, chred, chblue, denoiseMethodRgb, multiThread); } } @@ -2989,8 +2981,8 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa gam = dnparams.gamma; gamthresh = 0.001f; - if(!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG - if(gam < 1.9f) { + if (!isRAW) {//reduce gamma under 1 for Lab mode ==> TIF and JPG + if (gam < 1.9f) { gam = 1.f - (1.9f - gam) / 3.f; //minimum gamma 0.7 } else if (gam >= 1.9f && gam <= 3.f) { gam = (1.4f / 1.1f) * gam - 1.41818f; @@ -3000,12 +2992,12 @@ void ImProcFunctions::RGB_denoise_infoGamCurve(const procparams::DirPyrDenoisePa gamslope = exp(log((double)gamthresh) / gam) / gamthresh; bool denoiseMethodRgb = (dnparams.dmethod == "RGB"); - if(denoiseMethodRgb) { - for (int i = 0; i < 65536; i++) { + if (denoiseMethodRgb) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamma((double)i / 65535.0, gam, gamthresh, gamslope, 1.0, 0.0)) * 32768.0f; } } else { - for (int i = 0; i < 65536; i++) { + for (int i = 0; i < 65536; ++i) { gamcurve[i] = (Color::gamman((double)i / 65535.0, gam)) * 32768.0f; } } @@ -3066,8 +3058,8 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l } } - if(levaut == 0) { //Low denoise - if(chaut > 300.f) { + if (levaut == 0) { //Low denoise + if (chaut > 300.f) { chaut = 0.714286f * chaut + 85.71428f; } } @@ -3076,15 +3068,15 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l delta *= reducdelta; if (lissage == 1 || lissage == 2) { - if (chaut < 200.f && delta < 200.f ) { + if (chaut < 200.f && delta < 200.f) { delta *= 0.95f; - } else if (chaut < 200.f && delta < 400.f ) { + } else if (chaut < 200.f && delta < 400.f) { delta *= 0.5f; - } else if (chaut < 200.f && delta >= 400.f ) { + } else if (chaut < 200.f && delta >= 400.f) { delta = 200.f; - } else if (chaut < 400.f && delta < 400.f ) { + } else if (chaut < 400.f && delta < 400.f) { delta *= 0.4f; - } else if (chaut < 400.f && delta >= 400.f ) { + } else if (chaut < 400.f && delta >= 400.f) { delta = 120.f; } else if (chaut < 550.f) { delta *= 0.15f; @@ -3114,15 +3106,15 @@ void ImProcFunctions::calcautodn_info (float &chaut, float &delta, int Nb, int l } if (lissage == 0) { - if (chaut < 200.f && delta < 200.f ) { + if (chaut < 200.f && delta < 200.f) { delta *= 0.95f; - } else if (chaut < 200.f && delta < 400.f ) { + } else if (chaut < 200.f && delta < 400.f) { delta *= 0.7f; - } else if (chaut < 200.f && delta >= 400.f ) { + } else if (chaut < 200.f && delta >= 400.f) { delta = 280.f; - } else if (chaut < 400.f && delta < 400.f ) { + } else if (chaut < 400.f && delta < 400.f) { delta *= 0.6f; - } else if (chaut < 400.f && delta >= 400.f ) { + } else if (chaut < 400.f && delta >= 400.f) { delta = 200.f; } else if (chaut < 550.f) { delta *= 0.3f; @@ -3176,28 +3168,28 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat lumcalc = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { lumcalc[i] = new float[wid]; } acalc = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { acalc[i] = new float[wid]; } bcalc = new float*[hei]; - for (int i = 0; i < hei; i++) { + for (int i = 0; i < hei; ++i) { bcalc[i] = new float[wid]; } #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif - for(int ii = 0; ii < hei; ii++) { - for(int jj = 0; jj < wid; jj++) { + for (int ii = 0; ii < hei; ++ii) { + for (int jj = 0; jj < wid; ++jj) { float LLum, AAum, BBum; float RL = provicalc->r(ii, jj); float GL = provicalc->g(ii, jj); @@ -3223,12 +3215,12 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat int tilesize; int overlap; - if(settings->leveldnti == 0) { + if (settings->leveldnti == 0) { tilesize = 1024; overlap = 128; } - if(settings->leveldnti == 1) { + if (settings->leveldnti == 1) { tilesize = 768; overlap = 96; } @@ -3262,17 +3254,17 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat LUTf *denoiseigamtab; switch(settings->denoiselabgamma) { - case 0: - denoiseigamtab = &(Color::igammatab_26_11); - break; + case 0: + denoiseigamtab = &(Color::igammatab_26_11); + break; - case 1: - denoiseigamtab = &(Color::igammatab_4); - break; + case 1: + denoiseigamtab = &(Color::igammatab_4); + break; - default: - denoiseigamtab = &(Color::igammatab_55); - break; + default: + denoiseigamtab = &(Color::igammatab_55); + break; } @@ -3286,19 +3278,19 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat LabImage * labdn = new LabImage(width, height); float** noisevarlum = new float*[(height + 1) / 2]; - for (int i = 0; i < (height + 1) / 2; i++) { + for (int i = 0; i < (height + 1) / 2; ++i) { noisevarlum[i] = new float[(width + 1) / 2]; } float** noisevarchrom = new float*[(height + 1) / 2]; - for (int i = 0; i < (height + 1) / 2; i++) { + for (int i = 0; i < (height + 1) / 2; ++i) { noisevarchrom[i] = new float[(width + 1) / 2]; } float** noisevarhue = new float*[(height + 1) / 2]; - for (int i = 0; i < (height + 1) / 2; i++) { + for (int i = 0; i < (height + 1) / 2; ++i) { noisevarhue[i] = new float[(width + 1) / 2]; } @@ -3309,13 +3301,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float interm_med = (float) dnparams.chroma / 10.0; float intermred, intermblue; - if(dnparams.redchro > 0.) { + if (dnparams.redchro > 0.) { intermred = (dnparams.redchro / 10.); } else { intermred = (float) dnparams.redchro / 7.0; //increase slower than linear for more sensit } - if(dnparams.bluechro > 0.) { + if (dnparams.bluechro > 0.) { intermblue = (dnparams.bluechro / 10.); } else { intermblue = (float) dnparams.bluechro / 7.0; //increase slower than linear for more sensit @@ -3338,7 +3330,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat if (isRAW) {//image is raw; use channel differences for chroma channels #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif for (int i = tiletop; i < tilebottom; i += 2) { @@ -3363,7 +3355,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float cN = sqrtf(SQR(aN) + SQR(bN)); noisevarhue[i1 >> 1][j1 >> 1] = xatan2f(bN, aN); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero } @@ -3379,7 +3371,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float cN = sqrtf(SQR(aN) + SQR(bN)); float hN = xatan2f(bN, aN); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero } @@ -3391,7 +3383,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif for (int i = tiletop; i < tilebottom; i += 2) { @@ -3409,13 +3401,13 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat if (!denoiseMethodRgb) { //lab mode, modification Jacques feb 2013 and july 2014 #ifdef _RT_NESTED_OPENMP - #pragma omp parallel for if(multiThread) + #pragma omp parallel for if (multiThread) #endif - for (int i = tiletop; i < tilebottom; i++) { + for (int i = tiletop; i < tilebottom; ++i) { int i1 = i - tiletop; - for (int j = tileleft; j < tileright; j++) { + for (int j = tileleft; j < tileright; ++j) { int j1 = j - tileleft; float R_ = gain * src->r(i, j); float G_ = gain * src->g(i, j); @@ -3443,10 +3435,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } } else { //RGB mode - for (int i = tiletop/*, i1=0*/; i < tilebottom; i++/*, i1++*/) { + for (int i = tiletop/*, i1=0*/; i < tilebottom; ++i/*, ++i1*/) { int i1 = i - tiletop; - for (int j = tileleft/*, j1=0*/; j < tileright; j++/*, j1++*/) { + for (int j = tileleft/*, j1=0*/; j < tileright; ++j/*, ++j1*/) { int j1 = j - tileleft; float X = gain * src->r(i, j); @@ -3464,10 +3456,10 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat } } else {//image is not raw; use Lab parametrization - for (int i = tiletop/*, i1=0*/; i < tilebottom; i++/*, i1++*/) { + for (int i = tiletop/*, i1=0*/; i < tilebottom; ++i/*, ++i1*/) { int i1 = i - tiletop; - for (int j = tileleft/*, j1=0*/; j < tileright; j++/*, j1++*/) { + for (int j = tileleft/*, j1=0*/; j < tileright; ++j/*, ++j1*/) { int j1 = j - tileleft; float L, a, b; float rLum = src->r(i, j) ; //for luminance denoise curve @@ -3492,18 +3484,18 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat //convert Lab Color::XYZ2Lab(X, Y, Z, L, a, b); - if(((i1 | j1) & 1) == 0) { + if (((i1 | j1) & 1) == 0) { float Llum, alum, blum; float XL, YL, ZL; Color::rgbxyz(rLum, gLum, bLum, XL, YL, ZL, wp); Color::XYZ2Lab(XL, YL, ZL, Llum, alum, blum); float kN = Llum; - if(kN < 2.f) { + if (kN < 2.f) { kN = 2.f; } - if(kN > 32768.f) { + if (kN > 32768.f) { kN = 32768.f; } @@ -3513,7 +3505,7 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat float hN = xatan2f(bN, aN); float cN = sqrt(SQR(aN) + SQR(bN)); - if(cN < 100.f) { + if (cN < 100.f) { cN = 100.f; //avoid divided by zero } @@ -3548,26 +3540,65 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat const int levwav = 5; #ifdef _RT_NESTED_OPENMP - #pragma omp parallel sections if(multiThread) + #pragma omp parallel sections if (multiThread) #endif { #ifdef _RT_NESTED_OPENMP #pragma omp section #endif { - adecomp = new wavelet_decomposition (labdn->data + datalen, labdn->W, labdn->H, levwav, 1 ); + adecomp = new wavelet_decomposition (labdn->data + datalen, labdn->W, labdn->H, levwav, 1); } #ifdef _RT_NESTED_OPENMP #pragma omp section #endif { - bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1 ); + bdecomp = new wavelet_decomposition (labdn->data + 2 * datalen, labdn->W, labdn->H, levwav, 1); } } bool autoch = dnparams.autochroma; - if(comptlevel == 0) { - WaveletDenoiseAll_info(levwav, *adecomp, *bdecomp, noisevarlum, noisevarchrom, noisevarhue, width, height, noisevarab_r, noisevarab_b, labdn, chaut, Nb, redaut, blueaut, maxredaut, maxblueaut, minredaut, minblueaut, schoice, autoch, chromina, sigma, lumema, sigma_L, redyel, skinc, nsknc, maxchred, maxchblue, minchred, minchblue, nb, chau , chred, chblue, denoiseMethodRgb, multiThread); //enhance mode + if (comptlevel == 0) { + WaveletDenoiseAll_info( + levwav, + *adecomp, + *bdecomp, + noisevarlum, + noisevarchrom, + noisevarhue, + width, + height, + noisevarab_r, + noisevarab_b, + labdn, + chaut, + Nb, + redaut, + blueaut, + maxredaut, + maxblueaut, + minredaut, + minblueaut, + schoice, + autoch, + chromina, + sigma, + lumema, + sigma_L, + redyel, + skinc, + nsknc, + maxchred, + maxchblue, + minchred, + minchblue, + nb, + chau, + chred, + chblue, + denoiseMethodRgb, + multiThread + ); // Enhance mode } comptlevel += 1; @@ -3578,50 +3609,50 @@ SSEFUNCTION void ImProcFunctions::RGB_denoise_info(Imagefloat * src, Imagefloat delete bdecomp; delete labdn; - for (int i = 0; i < (height + 1) / 2; i++) { - delete [] noisevarlum[i]; + for (int i = 0; i < (height + 1) / 2; ++i) { + delete[] noisevarlum[i]; } - delete [] noisevarlum; + delete[] noisevarlum; - for (int i = 0; i < (height + 1) / 2; i++) { - delete [] noisevarchrom[i]; + for (int i = 0; i < (height + 1) / 2; ++i) { + delete[] noisevarchrom[i]; } - delete [] noisevarchrom; + delete[] noisevarchrom; - for (int i = 0; i < (height + 1) / 2; i++) { - delete [] noisevarhue[i]; + for (int i = 0; i < (height + 1) / 2; ++i) { + delete[] noisevarhue[i]; } - delete [] noisevarhue; + delete[] noisevarhue; }//end of tile row }//end of tile loop - for (int i = 0; i < hei; i++) { - delete [] lumcalc[i]; + for (int i = 0; i < hei; ++i) { + delete[] lumcalc[i]; } - delete [] lumcalc; + delete[] lumcalc; - for (int i = 0; i < hei; i++) { - delete [] acalc[i]; + for (int i = 0; i < hei; ++i) { + delete[] acalc[i]; } - delete [] acalc; + delete[] acalc; - for (int i = 0; i < hei; i++) { - delete [] bcalc[i]; + for (int i = 0; i < hei; ++i) { + delete[] bcalc[i]; } - delete [] bcalc; + delete[] bcalc; #undef TS #undef fTS #undef offset #undef epsilon -}//end of main RGB_denoise +} // End of main RGB_denoise } diff --git a/rtengine/ffmanager.cc b/rtengine/ffmanager.cc index 6a653eb84..8b26c3121 100644 --- a/rtengine/ffmanager.cc +++ b/rtengine/ffmanager.cc @@ -20,14 +20,7 @@ #include "../rtgui/options.h" #include "rawimage.h" #include "imagedata.h" - -#define PIX_SORT(a,b) { if ((a)>(b)) {temp=(a);(a)=(b);(b)=temp;} } -#define med5(a0,a1,a2,a3,a4,median) { \ -p[0]=a0; p[1]=a1; p[2]=a2; p[3]=a3; p[4]=a4; \ -PIX_SORT(p[0],p[1]) ; PIX_SORT(p[3],p[4]) ; PIX_SORT(p[0],p[3]) ; \ -PIX_SORT(p[1],p[4]) ; PIX_SORT(p[1],p[2]) ; PIX_SORT(p[2],p[3]) ; \ -PIX_SORT(p[1],p[2]) ; median=p[2] ;} - +#include "median.h" namespace rtengine { @@ -217,7 +210,6 @@ void ffInfo::updateRawImage() #endif for (int i = 0; i < H; i++) { - int p[5], temp; int iprev = i < 2 ? i + 2 : i - 2; int inext = i > H - 3 ? i - 2 : i + 2; @@ -225,8 +217,7 @@ void ffInfo::updateRawImage() int jprev = j < 2 ? j + 2 : j - 2; int jnext = j > W - 3 ? j - 2 : j + 2; - med5(ri->data[iprev][j], ri->data[i][jprev], ri->data[i][j], - ri->data[i][jnext], ri->data[inext][j], cfatmp[i * W + j]); + cfatmp[i * W + j] = median(ri->data[iprev][j], ri->data[i][jprev], ri->data[i][j], ri->data[i][jnext], ri->data[inext][j]); } } diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index b1a52a9f7..939177bf2 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -185,12 +185,12 @@ class ImProcFunctions public: enum class Median { - SIZE_3X3_SOFT, - SIZE_3X3_STRONG, - SIZE_5X5_SOFT, - SIZE_5X5_STRONG, - SIZE_7X7, - SIZE_9X9 + TYPE_3X3_SOFT, + TYPE_3X3_STRONG, + TYPE_5X5_SOFT, + TYPE_5X5_STRONG, + TYPE_7X7, + TYPE_9X9 }; double lumimul[3];