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

Reply via email to