Author: post
Date: 2012-11-07 19:43:53 +0100 (Wed, 07 Nov 2012)
New Revision: 4309
Modified:
trunk/plugins/denoise/denoise.c
trunk/plugins/denoise/floatplanarimage-x86.cpp
trunk/plugins/denoise/floatplanarimage.cpp
Log:
Make denoising stronger in red/blue/purple areas (since they are more prone to
noise).
Modified: trunk/plugins/denoise/denoise.c
===================================================================
--- trunk/plugins/denoise/denoise.c 2012-11-07 18:14:26 UTC (rev 4308)
+++ trunk/plugins/denoise/denoise.c 2012-11-07 18:43:53 UTC (rev 4309)
@@ -286,7 +286,7 @@
denoise->info.image = tmp;
denoise->info.sigmaLuma = ((float) denoise->denoise_luma * scale) / 3.0;
- denoise->info.sigmaChroma = ((float) denoise->denoise_chroma * scale) /
1.5;
+ denoise->info.sigmaChroma = ((float) denoise->denoise_chroma * scale) /
2.0;
denoise->info.sharpenLuma = 1.5f * (float) denoise->sharpen / 20.0f;
denoise->info.sharpenLuma *= fminf(1.0f, 0.25 + ((100.0f -
fminf(100.0f,denoise->denoise_luma)) / 100.0f));
denoise->info.sharpenCutoffLuma = 0.07f * scale;
Modified: trunk/plugins/denoise/floatplanarimage-x86.cpp
===================================================================
--- trunk/plugins/denoise/floatplanarimage-x86.cpp 2012-11-07 18:14:26 UTC
(rev 4308)
+++ trunk/plugins/denoise/floatplanarimage-x86.cpp 2012-11-07 18:43:53 UTC
(rev 4309)
@@ -44,6 +44,7 @@
temp[i+28] = (0.499); //r->Cr
temp[i+32] = (-0.418); //g->Cr
temp[i+36] = (-0.0813); //b->Cr
+ temp[i+40] = 0.5f; // red/blue scale.
}
asm volatile
@@ -136,6 +137,21 @@
"addps %%xmm7, %%xmm6\n" // Add Cr
"addps %%xmm8, %%xmm6\n" // Add Cr (finished)
+ "xorps %%xmm10,%%xmm10\n"
+ "xorps %%xmm11,%%xmm11\n"
+ "movaps %%xmm0, %%xmm12\n" // Cb
+ "movaps %%xmm6, %%xmm13\n" // Cr
+ "cmpnltps %%xmm0, %%xmm10\n" // Cb > 0 ?
+ "cmpnltps %%xmm6, %%xmm11\n" // Cr > 0 ?
+ "mulps 160(%5), %%xmm12\n" // Cb * 0.5f
+ "mulps 160(%5), %%xmm13\n" // Cr * 0.5f
+ "andps %%xmm10, %%xmm0\n" // If < 0 use original
+ "andps %%xmm11, %%xmm6\n" // If < 0 use original
+ "andnps %%xmm12, %%xmm10\n" // If > 0 use reduced
+ "andnps %%xmm13, %%xmm11\n" // If > 0 use reduced
+ "orps %%xmm10, %%xmm0\n" // Blend
+ "orps %%xmm11, %%xmm6\n" // Blend
+
"movntdq %%xmm3, (%1)\n" // Store Y
"movntdq %%xmm0, (%2)\n" // Store Cb
"movntdq %%xmm6, (%3)\n" // Store Cr
@@ -201,6 +217,20 @@
"movaps (%2), %%xmm1\n" // xmm1: Cb (4 pixels)
"movaps (%3), %%xmm2\n" // xmm2: Cr
"movaps (%1), %%xmm0\n" // xmm0: Y
+ "pxor %%xmm5, %%xmm5\n" // Zero
+ "pxor %%xmm6, %%xmm6\n" // Zero
+ "movaps %%xmm1, %%xmm3\n" // Cb
+ "movaps %%xmm2, %%xmm4\n" // Cr
+ "cmpnltps %%xmm1, %%xmm5\n" // Cb > 0 ?
+ "cmpnltps %%xmm2, %%xmm6\n" // Cr > 0 ?
+ "addps %%xmm3, %%xmm3\n" // Cb * 2f
+ "addps %%xmm4, %%xmm4\n" // Cb * 2f
+ "andps %%xmm5, %%xmm1\n" // If < 0 use original
+ "andps %%xmm6, %%xmm2\n" // If < 0 use original
+ "andnps %%xmm3, %%xmm5\n" // If > 0 use reduced
+ "andnps %%xmm4, %%xmm6\n" // If > 0 use reduced
+ "orps %%xmm5, %%xmm1\n" // Blend
+ "orps %%xmm6, %%xmm2\n" // Blend
"movaps %%xmm1, %%xmm3\n" // xmm3: Cb
"movaps %%xmm2, %%xmm4\n" // xmm4: Cr
"mulps %%xmm12, %%xmm1\n" // xmm1: Cb for green
@@ -370,6 +400,20 @@
"loopback_YUV_SSE2_32:"
"movaps (%2), %%xmm1\n" // xmm1: Cb (4 pixels)
"movaps (%3), %%xmm2\n" // xmm2: Cr
+ "pxor %%xmm0, %%xmm0\n" // Zero
+ "movaps %%xmm1, %%xmm3\n" // Cb
+ "movaps %%xmm2, %%xmm4\n" // Cr
+ "cmpnltps %%xmm1, %%xmm0\n" // Cb > 0 ?
+ "cmpnltps %%xmm2, %%xmm6\n" // Cr > 0 ?
+ "addps %%xmm3, %%xmm3\n" // Cb * 2f
+ "addps %%xmm4, %%xmm4\n" // Cb * 2f
+ "andps %%xmm0, %%xmm1\n" // If < 0 use original
+ "andps %%xmm6, %%xmm2\n" // If < 0 use original
+ "andnps %%xmm3, %%xmm0\n" // If > 0 use reduced
+ "andnps %%xmm4, %%xmm6\n" // If > 0 use reduced
+ "orps %%xmm0, %%xmm1\n" // Blend
+ "orps %%xmm6, %%xmm2\n" // Blend
+ "pxor %%xmm6, %%xmm6\n" // Zero
"movaps (%1), %%xmm0\n" // xmm0: Y
"movaps %%xmm1, %%xmm3\n" // xmm3: Cb
"movaps %%xmm2, %%xmm4\n" // xmm4: Cr
Modified: trunk/plugins/denoise/floatplanarimage.cpp
===================================================================
--- trunk/plugins/denoise/floatplanarimage.cpp 2012-11-07 18:14:26 UTC (rev
4308)
+++ trunk/plugins/denoise/floatplanarimage.cpp 2012-11-07 18:43:53 UTC (rev
4309)
@@ -191,8 +191,14 @@
float g = shortToFloat[(*(pix+1))];
float b = shortToFloat[((*(pix+2))*bluec)>>13];
*Y++ = r * 0.299 + g * 0.587 + b * 0.114 ;
- *Cb++ = r * -0.169 + g * -0.331 + b * 0.499;
- *Cr++ = r * 0.499 + g * -0.418 + b * -0.0813;
+ float cb = r * -0.169 + g * -0.331 + b * 0.499;
+ float cr = r * 0.499 + g * -0.418 + b * -0.0813;
+ if (cr > 0.0f) /* 50% Stronger denoise on red/blue */
+ cr *= 0.5f;
+ if (cb > 0.0f)
+ cb *= 0.5f;
+ *Cb++ = cb;
+ *Cr++ = cr;
pix += image->pixelsize;
}
}
@@ -246,9 +252,15 @@
gfloat *Cr = p[2]->getAt(ox, y+oy);
gushort* out = GET_PIXEL(image,0,y);
for (int x=0; x<image->w; x++) {
- float fr = (Y[x] + 1.402 * Cr[x]);
- float fg = Y[x] - 0.344 * Cb[x] - 0.714 * Cr[x];
- float fb = (Y[x] + 1.772 * Cb[x]) ;
+ float cr = Cr[x];
+ float cb = Cb[x];
+ if (cr > 0.0f) /* 50% Stronger denoise on red/blue */
+ cr += cr;
+ if (cb > 0.0f)
+ cb += cb;
+ float fr = (Y[x] + 1.402 * cr);
+ float fg = Y[x] - 0.344 * cb - 0.714 * cr;
+ float fb = (Y[x] + 1.772 * cb) ;
int r = (int)(fr*fr* r_factor);
int g = (int)(fg*fg);
int b = (int)(fb*fb* b_factor);
_______________________________________________
Rawstudio-commit mailing list
[email protected]
http://rawstudio.org/cgi-bin/mailman/listinfo/rawstudio-commit