Author Topic: Reducción Ruido/Noise reduction  (Read 6633 times)

Offline Silvercup

  • PixInsight Addict
  • ***
  • Posts: 187
Reducción Ruido/Noise reduction
« on: 2009 September 24 16:12:08 »
Hola:

He estado intentando reducir el ruido en imagenes con pocas tomas o con poco tiempo de integración. en general tomas H-Alpha. Ya sé que para eso está ACDNR y GREYCstoration pero en el caso de imágenes con poca señal no me convence demasiado, sobre todo GREYCstoration. Viendo las tomas el ruido era básicamente falta de señal con tamaños de 1 pixel, entonces pensé en hacer un script que moviese la imagen 1px arriba, abajo, izquierda y derecha y despues hacer un average con las 4 imágenes y posteriormente combinarlas con la imagen original mediante average o sumandolas con alguna proporción entre las dos.

Bueno, el resultado es este. Izquierda Original, derecha Script:



Y este es un average del original con una imágen a la que se le ha pasado 3 veces el script (zoom 2x).



A ver que os parece, ¿podeis probarlo en vuestras imágenes y me deciis que tal va?.

Créditos: La imágen fue tomada por Daniel Bosch. Espero que no le importe que la haya usado. Las mías no son tan buenas.

Saludos, Silvercup.



Hi:

I've been trying to reduce noise in images with a few exposures or with low integration time, generally H-Alpha images. I know that's what ACDNR and GREYCstoration for, but in the case of images with low signal does not convince me too much, especially GREYCstoration. By inspecting takes the noise level was basically lack of signal with pixel sizes of 1px, then I thought to make a script to move the image 1px up, down, left and right and then make an average with 4 images and then combine them with the original image width average or adding them with some proportion between each image.

Well, the result is this. Original Left, Right Script:


 
And that is an average of the original with an image which has been run 3 times the script (zoom 2x).



What do you think about this procedure?, can you try it in your images and I tell me your opinion?.

Credits: The image was taken by Daniel Bosch. I hope he don't mind that I use it. Mine are not so good.

Greetings, Silvercup.


Code: [Select]
#include <pjsr/ColorSpace.jsh>
#include <pjsr/UndoFlag.jsh>
#define VERSION "1.0"

var Imagenum = 4;
var targetView = new Array(Imagenum);
var targetPoints = new Array(Imagenum);
var window = ImageWindow.activeWindow;
var originalView = window.mainView;
targetPoints[1] = new Point( 0, 1 );
targetPoints[2] = new Point( 0, -1 );
targetPoints[3] = new Point( 1, 0 );
targetPoints[4] = new Point( -1, 0 );

targetView[0]= new ImageWindow(originalView.image.width,
            originalView.image.height,
            originalView.image.numberOfChannels,
            window.bitsPerSample,
            window.isFloatSample,
            originalView.image.colorSpace != ColorSpace_Gray,
            "targetView0");

    targetView[0].mainView.beginProcess(UndoFlag_NoSwapFile);
    targetView[0].mainView.image.assign( originalView.image );

    var p = new IntegerResample;
    with ( p )
    {
      zoomFactor = 2;
      subsampleMode = Average;
      xResolution = 72.000;
      yResolution = 72.000;
      metric = false;
      forceResolution = false;
}
    p.executeOn(targetView[0].mainView);
    targetView[0].mainView.endProcess();
    targetView[0].show();


for (var i = 1; i <= Imagenum; i++) {

targetView[i]= new ImageWindow(targetView[0].mainView.image.width,
            targetView[0].mainView.image.height,
            targetView[0].mainView.image.numberOfChannels,
            window.bitsPerSample,
            window.isFloatSample,
            targetView[0].mainView.image.colorSpace != ColorSpace_Gray,
            "targetView"+i);

    targetView[i].mainView.beginProcess(UndoFlag_NoSwapFile);
    targetView[i].mainView.image.assign( targetView[0].mainView.image );
    targetView[i].mainView.image.selectedPoint = targetPoints[i];
    targetView[i].mainView.image.apply( targetView[0].mainView.image );
    targetView[i].mainView.endProcess();
};

var p = new PixelMath;
with ( p )
{
   expression = "avg(targetView1,targetView2,targetView3,targetView4)";
   expression1 = "";
   expression2 = "";
   expression3 = "";
   useSingleExpression = true;
   symbols = "";
   use64BitWorkingImage = false;
   rescale =false;
   rescaleLower = 0.0000000000;
   rescaleUpper = 1.0000000000;
   truncate = true;
   truncateLower = 0.0000000000;
   truncateUpper = 1.0000000000;
   createNewImage = false;
   newImageId = "";
   newImageWidth = 0;
   newImageHeight = 0;
   newImageAlpha = false;
   newImageColorSpace = SameAsTarget;
   newImageSampleFormat = SameAsTarget;
}

    targetView[0].mainView.beginProcess(UndoFlag_NoSwapFile);
    p.executeOn(targetView[0].mainView);
    var p = new IntegerResample;
    with ( p )
    {
      zoomFactor = -2;
      subsampleMode = Average;
      xResolution = 72.000;
      yResolution = 72.000;
      metric = false;
      forceResolution = false;
    }
    p.executeOn(targetView[0].mainView);
    targetView[0].mainView.endProcess();




for (var i = 1; i <= Imagenum; i++) {
targetView[i].undoAll();
targetView[i].purge();
targetView[i].close();
targetView[i]=null;
}
 

Offline Carlos Milovic

  • PTeam Member
  • PixInsight Jedi Master
  • ******
  • Posts: 2172
  • Join the dark side... we have cookies
    • http://www.astrophoto.cl
Re: Reducción Ruido/Noise reduction
« Reply #1 on: 2009 September 24 17:39:03 »
Hola/Hi Silvercup

Lo que haces es simplemente una convolución ;)
Puedes definir el Kernel como
[0 1 0
 1 1 1
 0 1 0]
Puedes cambiar el valor central, para establecer distintos pesos (y después, normalizar el filtro, con la suma de todos los valores), mientras mayor, más pesa la imagen inicial.

Dicho sea de paso, esto es prácticamente lo mismo que hago en el módulo Sharpen, pero con otro filtro de convolución (laplacianos). Y, el resultado también debería ser muy similar a ajustar GaussianBlur con una forma (shape) mucho más grande que 2, y tienes que ajustar sigma. Por supuesto, trabajar con las primeras escalas en ATrousWavelets tambien es muy similar.

Creo que no me demoraré nada en modificar el código de Sharpen para que haga esto mismo, y lo dejamos junto a las otras convoluciones (ya que no es un algoritmo elaborado de reducción de ruido, ese es el mejor lugar).


English summary:
This procedure is a convolution (see kernel filter above). To get a similar result you may try GaussianBlur (or ATrousWavelets) with a shape paremeter larger than 2, so it is more similar to a common average.
Since this algorithm is almost the same as the one in the Sharpen process, I'll write a new one implementing this. I just need to change the type of kernels, and add another threshold parameter, to protect strong sharp edges.
Regards,

Carlos Milovic F.
--------------------------------
PixInsight Project Developer
http://www.pixinsight.com

Offline Nocturnal

  • PixInsight Jedi Council Member
  • *******
  • Posts: 2727
    • http://www.carpephoton.com
Re: Reducción Ruido/Noise reduction
« Reply #2 on: 2009 September 24 18:47:02 »
Interesting stuff! A bit above my pay grade but I'm paying attention :)
Best,

    Sander
---
Edge HD 1100
QHY-8 for imaging, IMG0H mono for guiding, video cameras for occulations
ASI224, QHY5L-IIc
HyperStar3
WO-M110ED+FR-III/TRF-2008
Takahashi EM-400
PIxInsight, DeepSkyStacker, PHD, Nebulosity

Offline Carlos Milovic

  • PTeam Member
  • PixInsight Jedi Master
  • ******
  • Posts: 2172
  • Join the dark side... we have cookies
    • http://www.astrophoto.cl
Re: Reducción Ruido/Noise reduction
« Reply #3 on: 2009 September 24 22:37:02 »
See the Announcements section ;)
Ver los anuncios.
Regards,

Carlos Milovic F.
--------------------------------
PixInsight Project Developer
http://www.pixinsight.com