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