Author Topic: Alineación de Canales  (Read 18668 times)

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • View Profile
    • http://www.astrosurf.com/brego-sky
Alineación de Canales
« Reply #30 on: 2008 December 15 16:22:36 »
Bueno,

pues ya se calculan las H de cada canal :), Juan esta función de StarDetector.cpp;

Code: [Select]

static void GetStars( StarDetector::star_list& S, Image& img,
               int structureLayers, int noiseLayers,
               float sensitivity, float peakResponse, float maxDistortion, bool invert )


debería no se privada del cpp, o se hace un método estático en de la clase StarDetector o se hace una función general. A mi me gustaría más lo primero, tienes algún problema si ya lo cambio así  :?

Hablamos,

Oriol

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
    • View Profile
Alineación de Canales
« Reply #31 on: 2008 December 16 00:11:15 »
Hola de nuevo:
Pues aquí continuo con mis elucubraciones al respecto.
He rescatado de mi archivo una foto que elaboré hace ahora un año con una exposición única de 30 segundos a ISO 1600 en mi 400d modificada y con el objetivo EF 20mm a f:3,5 ; disparada en una concentración de aficionados donde habían llevado unos colegas del foro de Hubble a un autocar de alumnos, que estaban realizando un curso de astronomía, para hacer observación.
De forma casi milagrosa logré que nadie pasará por delante del objetivo durante esos segundos y al final llegue a esta imagen

Como la imagen está muy reducida no se nota, pero el canal rojo está desplazado hacía fuera respecto a los otros dos.
He intentado aplicar en ella la matriz que obtuve de Tiermes, pero me he encontrado con que llegaba a una imagen nueva donde se sobrecorregia el canal rojo y ahora el halo rojo quedaba hacia dentro de las estrellas.
Entonces he recurrido a mi calculador de la matriz sintética partiendo del un valor de aproximadamente la mitad del "inflamiento". He decidido tomar este como 1.0007, en vez del 1.0013 y he obtenido estos resultados.


con ellos he realizado una nueva versión del script que he ejecutado sobre el canal rojo de la imagen, y he reconstruido la imagen con este canal realineado, dejando los otros dos tal como estaban.
Aquí tenemos el resultado en una zona cercana a una de las esquinas de la imagen vista a plena resolución:


La imagen de la izquierda es la original, la de la derecha tiene el canal rojo alineado como se ha explicado. He conseguido alinear los canales bastante aceptablemente partiendo de un coeficiente obtenido empíricamente.

Saludos.
Saludos.

Manolo L.

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
    • View Profile
Alineación de Canales
« Reply #32 on: 2008 December 16 00:21:02 »
Quote from: "OriolLehmkuhl"
Bueno yo ya empezé a hacer eso :D :D :D de momento automático y que vaya por consola :) aun no va por eso :(


Hmm... desarrollo cerrado... tanto linux y tanta leche y al final no aprendemos nada eh?? :P.

RELEASE EARLY, RELEASE OFTEN

OSCOJORRONCIO!!
--
 David Serrano

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7096
    • View Profile
    • http://pixinsight.com/
Alineación de Canales
« Reply #33 on: 2008 December 16 00:50:19 »
Code: [Select]

static void GetStars( StarDetector::star_list& S, Image& img,
               int structureLayers, int noiseLayers,
               float sensitivity, float peakResponse, float maxDistortion, bool invert )


Yo creo que no necesitas exponer públicamente esa función. Me explico. En StarDetector.h tienes la definición de la clase StarDetector:

Code: [Select]

class PCL_CLASS StarDetector
{
public:

   typedef Array<Star>  star_list;

   //
   // Detected stars, sorted by brightness in descending order.
   //
   star_list S;

   StarDetector( const ImageVariant& img,
                 int   structureLayers = 5,
                 int   noiseLayers = 1,
                 float sensitivity = 0.1,
                 float peakResponse = 0.75,
                 float maxDistortion = 0.5,
                 bool  invert = false );

   virtual ~StarDetector()
   {
   }

   static void GetStructureMap( ImageVariant& img, int structLayers, int noiseLayers, bool invert );

   static void GetStructures( ImageVariant& img, int structLayers, int noiseLayers, bool invert );
};


El constructor de StarDetector te proporciona toda la funcionalidad que necesitas; hacer pública la función GetStars no va a añadir nada que no tengas ya :) Por ejemplo, para detectar las estrellas en una imagen basta con instanciar StarDetector:

Code: [Select]

// Tenemos una imagen de trabajo. Aquí es Image, pero podría ser cualquier
// formato, como UInt16Image, DImage, etc.
Image img;
...
// Detectamos estrellas en img usando todos los parámetros por defecto
// de StarDetector.
StarDetector S( ImageVariant( &img ) );

// Recorremos la lista de estrellas detectadas.
for ( StarDetector::star_list::const_iterator i = S.S.Begin(); i != S.S.End(); ++i )
{
   // i apunta a un objeto Star
   std::cout << String().Format( "\nFound a star at %.3f,%.3f with intensity %.3f", i->pos.x, i->pos.y, i->total );
}


Fíjate que en el ejemplo estamos usando ImageVariant como un simple "contenedor universal" para transportar la imagen. El constructor de ImageVariant que estamos usando, en concreto:

Code: [Select]
template <class P> ImageVariant( Generic2DImage<P>* img )

no toma posesión de la imagen, sino que simplemente la referencia y permite enchufarla a cualquier proceso, liberándonos de tener que resolver la especialización del template. Toda la PCL y el código de la mayoría de los módulos está lleno de construcciones de este tipo. Ahora ya sabes por qué podemos soportar siete tipos de datos con total "naturalidad". Nunca escucharás algo como "muchas funciones no están disponibles en xx bits" hablando de PixInsight ;)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • View Profile
    • http://www.astrosurf.com/brego-sky
Alineación de Canales
« Reply #34 on: 2008 December 16 00:54:25 »
Hola David,

tampoco quiero enfadarme, pero me parece que no es lo que dices  :? Ahora mismo solo se calculan unas matrices, además el código no esta bien ni de coña, hay un montón de cosas ha mejorar ya que de momento es bastante inestable... un poco de paciencia no?? que nosotros también tenemos vida y obligaciones... yo hace rato que ya estoy trabajando y no dormí mucho ...

En fin,

Oriol

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7096
    • View Profile
    • http://pixinsight.com/
Alineación de Canales
« Reply #35 on: 2008 December 16 01:01:45 »
Caballeros, que haya buen rollo por favor.

No sé lo que hay en el mensaje de David de antes, pero evidentemente no es una buena idea tener este tipo de enfrentamientos, y muchísimo menos públicamente. David, ¿qué pasa, hombre?  :roll:

Hala, que todos estamos aquí para divertirnos. Si no, ¿para qué diablos? :)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • View Profile
    • http://www.astrosurf.com/brego-sky
Alineación de Canales
« Reply #36 on: 2008 December 16 01:12:22 »
Quote from: "Juan Conejero"

Code: [Select]
template <class P> ImageVariant( Generic2DImage<P>* img )


Vaya no había visto este constructor :( Entonces no hace falta liberar nada, tienes razón!

Gracias Juan,

Oriol

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
    • View Profile
Alineación de Canales
« Reply #37 on: 2008 December 16 01:57:14 »
No hombre, de enfrentamientos nada, buen rollete! si yo soy el primero en defender que cada uno es libre de hacer lo que quiera siempre que no moleste ni ofenda a los demás. Y por supuesto no me he molestado ni ofendido porque se esté creando código PCL de forma no pública. De hecho, hasta ahora siempre ha sido así!

Se trata de que simplemente me parece positivo postear código aunque no funcione, sobre todo teniendo en cuenta que la única doc de la PCL es la referencia de doxygen (o sea, el propio código fuente pocamente cocinado). Quién sabe cuándo puede aparecer algún lector interesado, que al ver el código se decida a probarlo y a aportar ese pequeño bit que falta, o si hay alguien que haya probado y lo haya dejado de lado, o...

Nada más, espíritu constructivo!  :arrow:
--
 David Serrano

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7096
    • View Profile
    • http://pixinsight.com/
Alineación de Canales
« Reply #38 on: 2008 December 16 02:00:27 »
OK, pero tengo una duda... ¿lo de oscojorroncio qué quiere decir?  :lol: Es que no lo había oído nunca y me mola  8)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
    • View Profile
Alineación de Canales
« Reply #39 on: 2008 December 16 02:17:52 »
Quote from: "Juan Conejero"
OK, pero tengo una duda... ¿lo de oscojorroncio qué quiere decir?  :lol: Es que no lo había oído nunca y me mola  8)


Get a life!! :D

Si este enlace no funciona, busca el palabrejo en google images. Es publicidad de Ono.
--
 David Serrano

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7096
    • View Profile
    • http://pixinsight.com/
Alineación de Canales
« Reply #40 on: 2008 December 16 02:23:20 »
:shock: Absolutely wonderful. Y es que esto de no tener tele...  :)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
    • View Profile
Alineación de Canales
« Reply #41 on: 2008 December 16 03:35:41 »
Hola:

Como el hilo lo abrí yo, me permito continuar con mi "rollo".
Ahora lo he aplicado a una foto de trazas ecuatoriales, obtenida con suma de máximos.
Los resultados en las esquinas a plena resolución y donde las trazas originales parecían arco iris han sido espectaculares:
Aquí está la prueba:



Aquí como el diafragma estaba a 7,1 me ha servido la matriz de Tiermes para rojos y azules.
Mi objetivo Canon EF 20 mm 2,8, que me tenia bastante insatisfecho, se ha revalorizado con esta utilidad.

Saludos.
Saludos.

Manolo L.

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7096
    • View Profile
    • http://pixinsight.com/
Alineación de Canales
« Reply #42 on: 2008 December 16 04:46:38 »
Hola Manolo

Ese resultado es impresionante. La diferencia entre colores ha desaparecido... es como si te hubieran regalado un objetivo nuevo  :D

Me alegro mucho de que te esté siendo tan útil. Seguro que a mucha gente le sirve también esta herramienta. Gracias por la idea original ;)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • View Profile
    • http://www.astrosurf.com/brego-sky
Alineación de Canales
« Reply #43 on: 2008 December 16 08:30:53 »
Hola,

pues parece que la causa de que el codigo funcionara inestable era que tenia una pcl antigua, con la que me paso esta mañana Juan lo que hay va bien  :) A ver si esta noche programo la parte del script. Pongo por aqui las funciones del corazon del programa, de momento solo calculan las H:

Code: [Select]


template <class P>
static void GetStars( StarDetector::star_list& S, const Generic2DImage<P>& image , int channel)
{
    Image img(image.Width(),image.Height(),image.ColorSpace());
    img.Assign(image);

    Console console;

    Image tmp(img.Width(),img.Height());
    size_type N = img.NumberOfPixels();
    const Image::sample *original = img[channel];
    Image::sample *temporal = tmp[0];

    for(size_type i=0;i<N;++i,++original,++temporal) (*temporal) = (*original);
   
    ImageVariant aux(&tmp);
    StarDetector sd(aux);

    S = sd.S;
}

template <class P> inline
static void __DoChannelCorrection( Generic2DImage<P>& img)
{
     Array<Star> SR;
     Array<Star> SG;
     Array<Star> SB;
     Console console;

     GetStars(SR,img,0);
     GetStars(SG,img,1);
     GetStars(SB,img,2);

     console.WriteLn( String().Format( "%d %d %d", SR.Length(), SG.Length(), SB.Length() ) );


     StarMatcher SM_RtoG( SR, SG);
     StarMatcher SM_RtoB( SR, SB);

     Array<FPoint> P1_RtoG,P2_RtoG;
     Array<FPoint> P1_RtoB,P2_RtoB;

     for ( StarMatcher::match_list::const_iterator i = SM_RtoG.M.Begin(); i != SM_RtoG.M.End(); ++i )
     {
         P1_RtoG.Add( SR[i->i1].pos );
         P2_RtoG.Add( SG[i->i2].pos );
     }

     for ( StarMatcher::match_list::const_iterator i = SM_RtoB.M.Begin(); i != SM_RtoB.M.End(); ++i )
     {
         P1_RtoB.Add( SR[i->i1].pos );
         P2_RtoB.Add( SB[i->i2].pos );
     }

     if ( P1_RtoG.Length() < 6 )
         throw Error( String().Format( "%u star pair match(es) found (Red-Green)- need at least six matched star pairs.", P1_RtoG.Length() ) );
     if ( P1_RtoB.Length() < 6 )
         throw Error( String().Format( "%u star pair match(es) found (Red-Blue)- need at least six matched star pairs.", P1_RtoB.Length() ) );
     
     RANSACPointMatcher RM_RtoG( P1_RtoG, P2_RtoG, 1000 );
     RANSACPointMatcher RM_RtoB( P1_RtoB, P2_RtoB, 1000 );

     if ( (RM_RtoG.M1.Length() < 6) || (RM_RtoB.M1.Length() < 6) )
         throw Error( "RANSAC: Unable to find a valid set of star pair matches." );

     Matrix  H_RtoG( RM_RtoG.H );

     console.WriteLn( "Transformation matrix (Red-Green):" );
     console.WriteLn( String().Format( "%+12.4f%+12.4f%+12.4f", H_RtoG[0][0], H_RtoG[0][1], H_RtoG[0][2] ) );
     console.WriteLn( String().Format( "%+12.4f%+12.4f%+12.4f", H_RtoG[1][0], H_RtoG[1][1], H_RtoG[1][2] ) );
     console.WriteLn( String().Format( "%+12.4f%+12.4f%+12.4f", H_RtoG[2][0], H_RtoG[2][1], H_RtoG[2][2] ) );

     Matrix H_RtoB( RM_RtoG.H );

     console.WriteLn( "Transformation matrix (Red-Blue):" );
     console.WriteLn( String().Format( "%+12.4f%+12.4f%+12.4f", H_RtoB[0][0], H_RtoB[0][1], H_RtoB[0][2] ) );
     console.WriteLn( String().Format( "%+12.4f%+12.4f%+12.4f", H_RtoB[1][0], H_RtoB[1][1], H_RtoB[1][2] ) );
     console.WriteLn( String().Format( "%+12.4f%+12.4f%+12.4f", H_RtoB[2][0], H_RtoB[2][1], H_RtoB[2][2] ) );
}




Apa!

Oriol

Offline Astrocava

  • PixInsight Addict
  • ***
  • Posts: 180
    • View Profile
    • Astrocava.com
Alineación de Canales
« Reply #44 on: 2008 December 16 09:09:07 »
Perdonad que me meta en esto sin saber demasiado pero, ¿sería posible aprovechar esta herramienta para corregir la coma de los telescopios?

Es que según iba leyendo, me parecía que tienen bastante en común estos dos problemas.

Sergio
Moonfish ED80 over a Meade LX200GPS 8"