Author: post
Date: 2009-10-19 19:49:59 +0200 (Mon, 19 Oct 2009)
New Revision: 2726

Modified:
   trunk/plugins/denoise/complexfilter-x86.cpp
   trunk/plugins/denoise/complexfilter.cpp
   trunk/plugins/denoise/complexfilter.h
   trunk/plugins/denoise/denoise.c
   trunk/plugins/denoise/denoiseinterface.h
   trunk/plugins/denoise/fftdenoiser.cpp
   trunk/plugins/denoise/fftdenoiseryuv.cpp
   trunk/plugins/denoise/fftdenoiseryuv.h
Log:
Denoiser: 
- Adjust settings based on scale, so 100% view visually matches scaled view. 
- "Beta" (noise-retain) parameter can now be set individually on chroma/luma 
components.
- Per-block division of beta is factored out.
- Overall strength of sharpen/denoise adjusted (more agressive settings are now 
possible, especially chroma noise).

Modified: trunk/plugins/denoise/complexfilter-x86.cpp
===================================================================
--- trunk/plugins/denoise/complexfilter-x86.cpp 2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/complexfilter-x86.cpp 2009-10-19 17:49:59 UTC (rev 
2726)
@@ -366,7 +366,6 @@
 #if defined (__x86_64__)
 void ComplexWienerFilterDeGrid::processSharpen_SSE3( ComplexBlock* block )
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   fftwf_complex* outcur = block->complex;
   fftwf_complex* gridsample = grid->complex;
   float gridfraction = degrid*outcur[0][0]/gridsample[0][0];
@@ -461,7 +460,6 @@
 
 void ComplexWienerFilterDeGrid::processSharpen_SSE3( ComplexBlock* block ) 
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   fftwf_complex* outcur = block->complex;
   fftwf_complex* gridsample = grid->complex;
   float gridfraction = degrid*outcur[0][0]/gridsample[0][0];
@@ -552,7 +550,6 @@
 
 void ComplexWienerFilterDeGrid::processSharpen_SSE( ComplexBlock* block ) 
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   fftwf_complex* outcur = block->complex;
   fftwf_complex* gridsample = grid->complex;
   float gridfraction = degrid*outcur[0][0]/gridsample[0][0];
@@ -648,7 +645,6 @@
 
 void ComplexWienerFilterDeGrid::processNoSharpen_SSE( ComplexBlock* block ) 
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   fftwf_complex* outcur = block->complex;
   fftwf_complex* gridsample = grid->complex;
   float gridfraction = degrid*outcur[0][0]/gridsample[0][0];
@@ -722,7 +718,6 @@
 #if defined (__x86_64__)
 void ComplexWienerFilterDeGrid::processNoSharpen_SSE3( ComplexBlock* block )
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   fftwf_complex* outcur = block->complex;
   fftwf_complex* gridsample = grid->complex;
   float gridfraction = degrid*outcur[0][0]/gridsample[0][0];
@@ -882,7 +877,6 @@
 #else // 32 bits
 void ComplexWienerFilterDeGrid::processNoSharpen_SSE3( ComplexBlock* block ) 
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   fftwf_complex* outcur = block->complex;
   fftwf_complex* gridsample = grid->complex;
   float gridfraction = degrid*outcur[0][0]/gridsample[0][0];

Modified: trunk/plugins/denoise/complexfilter.cpp
===================================================================
--- trunk/plugins/denoise/complexfilter.cpp     2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/complexfilter.cpp     2009-10-19 17:49:59 UTC (rev 
2726)
@@ -158,7 +158,7 @@
 ComplexWienerFilter::ComplexWienerFilter( int block_width, int 
block_height,float _beta, float _sigma ) :
 ComplexFilter(block_width, block_height)
 {
-  beta = _beta;
+  lowlimit = (_beta-1)/_beta;
   sigmaSquaredNoiseNormed = _sigma*_sigma/norm;
 }
 
@@ -175,7 +175,6 @@
 
 void ComplexWienerFilter::processNoSharpen( ComplexBlock* block )
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   int x,y;
   float psd;
   float WienerFactor;
@@ -197,7 +196,6 @@
 
 void ComplexWienerFilter::processSharpen( ComplexBlock* block )
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   int x,y;
   float psd;
   float WienerFactor;
@@ -227,7 +225,7 @@
 ComplexFilter(block_width, block_height), 
 pfactor(pattern_strength)
 {
-  beta = _beta;
+  lowlimit = (_beta-1)/_beta;
   pattern = _pattern;
 }
 
@@ -240,7 +238,6 @@
 
 void ComplexPatternFilter::processNoSharpen( ComplexBlock* block )
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   g_assert(bw == block->w);
   g_assert(bh == block->h);
   int x,y;
@@ -279,7 +276,7 @@
                                                      fftwf_plan plan_forward, 
FFTWindow *_window)
 : DeGridComplexFilter(block_width, block_height, _degrid, _window, 
plan_forward) 
 {
-  beta = _beta;
+  lowlimit = (_beta-1)/_beta;
   sigmaSquaredNoiseNormed = _sigma*_sigma/norm;
 }
 
@@ -308,7 +305,6 @@
     return processNoSharpen_SSE(block);
 #endif
 
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   int x,y;
   float psd;
   float WienerFactor;
@@ -349,7 +345,6 @@
     return processSharpen_SSE(block);
 #endif
 
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   int x,y;
   float psd;
   float WienerFactor;
@@ -386,7 +381,7 @@
 DeGridComplexFilter(block_width, block_height, _degrid, _window, 
plan_forward), 
 pattern(_pattern)
 {
-  beta = _beta;
+  lowlimit = (_beta-1)/_beta;
   sigmaSquaredNoiseNormed = _sigma*_sigma/norm;
 }
 
@@ -401,7 +396,6 @@
 
 void ComplexFilterPatternDeGrid::processNoSharpen( ComplexBlock* block )
 {
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   int x,y;
   float psd;
   float WienerFactor;
@@ -436,7 +430,6 @@
   if (sigmaSquaredNoiseNormed <= 1e-15f)
     return processSharpenOnly(block);
 
-  float lowlimit = (beta-1)/beta; //     (beta-1)/beta>=0
   int x,y;
   float psd;
   float WienerFactor;

Modified: trunk/plugins/denoise/complexfilter.h
===================================================================
--- trunk/plugins/denoise/complexfilter.h       2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/complexfilter.h       2009-10-19 17:49:59 UTC (rev 
2726)
@@ -38,7 +38,7 @@
   const int bw;
   const int bh;
   const float norm; // Normalization factor
-  float beta;
+  float lowlimit;
   float sharpen;
   float sigmaSquaredSharpenMin;
   float sigmaSquaredSharpenMax;

Modified: trunk/plugins/denoise/denoise.c
===================================================================
--- trunk/plugins/denoise/denoise.c     2009-10-19 17:43:25 UTC (rev 2725)
+++ trunk/plugins/denoise/denoise.c     2009-10-19 17:49:59 UTC (rev 2726)
@@ -242,6 +242,9 @@
                g_object_unref(input);
                return response;
        }
+       
+       gfloat scale = 1.0;
+       rs_filter_get_recursive(RS_FILTER(denoise), "scale", &scale, NULL);
 
        output = rs_image16_copy(input, TRUE);
        g_object_unref(input);
@@ -254,17 +257,22 @@
        else
                tmp = g_object_ref(output);
 
+
        denoise->info.image = tmp;
-       denoise->info.sigmaLuma = ((float) denoise->denoise_luma) / 3.0;
-       denoise->info.sigmaChroma = ((float) denoise->denoise_chroma) / 2.0;
-       denoise->info.sharpenLuma = ((float) denoise->sharpen) / 20.0;
-       denoise->info.sharpenCutoffLuma = 0.1f;
-       denoise->info.beta = 1.0;
+       denoise->info.sigmaLuma = ((float) denoise->denoise_luma * scale) / 3.0;
+       denoise->info.sigmaChroma = ((float) denoise->denoise_chroma * scale) / 
1.5;
+       denoise->info.sharpenLuma = (float) denoise->sharpen / 20.0f;
+       denoise->info.sharpenCutoffLuma = 0.15f * scale;
+       denoise->info.betaLuma = 1.025;
        denoise->info.sharpenChroma = 0.0f;
-       denoise->info.sharpenMinSigmaLuma = denoise->info.sigmaLuma * 1.25;
-
+       denoise->info.sharpenMinSigmaLuma = denoise->info.sigmaLuma * 2.0;
+       denoise->info.sharpenMaxSigmaLuma = denoise->info.sharpenMinSigmaLuma + 
denoise->info.sharpenLuma * 2.0f;
        denoise->info.redCorrection = (1.0+denoise->warmth)*(2.0-denoise->tint);
        denoise->info.blueCorrection = 
(1.0-denoise->warmth)*(2.0-denoise->tint);
+       
+       //TODO: Enable, when DCP is inserted
+//     denoise->info.redCorrection = 1.0f;
+//     denoise->info.blueCorrection = 1.0f;
 
        denoiseImage(&denoise->info);
        g_object_unref(tmp);

Modified: trunk/plugins/denoise/denoiseinterface.h
===================================================================
--- trunk/plugins/denoise/denoiseinterface.h    2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/denoiseinterface.h    2009-10-19 17:49:59 UTC (rev 
2726)
@@ -41,7 +41,9 @@
   RS_IMAGE16* image;            // This will be input and output
   float sigmaLuma;              // In RGB mode this is used for all planes, 
YUV mode only luma.
   float sigmaChroma;            // Used only in YUV mode.
-  float beta;                   // Used in all modes.
+  float betaLuma;               // In RGB mode this is used for all planes, 
YUV mode only luma.
+  float betaChroma;             // Used only in YUV mode.
+
   /* Sharpening - Luma is used for all planes in RGB */
   float sharpenLuma;            // sharpening strength (default=0 - not 
sharpen)
   float sharpenCutoffLuma;      // sharpening cutoff frequency, relative to 
max (default=0.3)

Modified: trunk/plugins/denoise/fftdenoiser.cpp
===================================================================
--- trunk/plugins/denoise/fftdenoiser.cpp       2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/fftdenoiser.cpp       2009-10-19 17:49:59 UTC (rev 
2726)
@@ -168,7 +168,7 @@
 void FFTDenoiser::setParameters( FFTDenoiseInfo *info )
 {
   sigma = info->sigmaLuma *SIGMA_FACTOR;
-  beta = max(1.0f, info->beta);
+  beta = max(1.0f, info->betaLuma);
   sharpen = info->sharpenLuma;
   sharpenCutoff = info->sharpenCutoffLuma;
   sharpenMinSigma = info->sharpenMinSigmaLuma*SIGMA_FACTOR;
@@ -195,8 +195,9 @@
     }
     info->_this = t;
     // Initialize parameters to default
-    info->beta = 1.0f;
-    info->sigmaLuma = 1.0f;
+    info->betaLuma = 1.0f;
+       info->betaChroma = 1.0f;
+       info->sigmaLuma = 1.0f;
     info->sigmaChroma = 1.0f;
     info->sharpenLuma = 0.0f;
     info->sharpenChroma = 0.0f;

Modified: trunk/plugins/denoise/fftdenoiseryuv.cpp
===================================================================
--- trunk/plugins/denoise/fftdenoiseryuv.cpp    2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/fftdenoiseryuv.cpp    2009-10-19 17:49:59 UTC (rev 
2726)
@@ -57,11 +57,11 @@
   filter->setSharpen(sharpen, sharpenMinSigma, sharpenMaxSigma, sharpenCutoff);
   img.setFilter(0,filter,&window);
 
-  filter = new ComplexWienerFilterDeGrid(img.bw, img.bh, beta, sigmaChroma, 
1.0, plan_forward, &window);
+  filter = new ComplexWienerFilterDeGrid(img.bw, img.bh, betaChroma, 
sigmaChroma, 1.0, plan_forward, &window);
   filter->setSharpen(sharpenChroma, sharpenMinSigmaChroma, 
sharpenMaxSigmaChroma, sharpenCutoffChroma);
   img.setFilter(1,filter,&window);
 
-  filter = new ComplexWienerFilterDeGrid(img.bw, img.bh, beta, sigmaChroma, 
1.0, plan_forward, &window);
+  filter = new ComplexWienerFilterDeGrid(img.bw, img.bh, betaChroma, 
sigmaChroma, 1.0, plan_forward, &window);
   filter->setSharpen(sharpenChroma, sharpenMinSigmaChroma, 
sharpenMaxSigmaChroma, sharpenCutoffChroma);
   img.setFilter(2,filter,&window);
 
@@ -80,6 +80,7 @@
   FFTDenoiser::setParameters(info);
   sigmaLuma = info->sigmaLuma*SIGMA_FACTOR;
   sigmaChroma = info->sigmaChroma*SIGMA_FACTOR;
+  betaChroma = info->betaChroma;
   sharpen = info->sharpenLuma;
   sharpenCutoff = info->sharpenCutoffLuma;
   sharpenMinSigma = info->sharpenMinSigmaLuma*SIGMA_FACTOR;

Modified: trunk/plugins/denoise/fftdenoiseryuv.h
===================================================================
--- trunk/plugins/denoise/fftdenoiseryuv.h      2009-10-19 17:43:25 UTC (rev 
2725)
+++ trunk/plugins/denoise/fftdenoiseryuv.h      2009-10-19 17:49:59 UTC (rev 
2726)
@@ -29,6 +29,7 @@
   virtual ~FFTDenoiserYUV(void);
   virtual void denoiseImage(RS_IMAGE16* image);
   virtual void setParameters( FFTDenoiseInfo *info);
+  float betaChroma;
   float sigmaLuma;
   float sigmaChroma;
   float sharpenChroma;           


_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit

Reply via email to