PixInsight Forum

PixInsight => Wish List => Topic started by: ManoloL on 2008 December 13 02:17:21

Title: Alineación de Canales
Post by: ManoloL on 2008 December 13 02:17:21
Hola a todos:

En primer lugar lamento que mi nivel de inglés escrito no me permita traducir esta nota de una forma digna, por lo que solo queda escrita en español.

Uno de los problemas con los que nos encontramos los que practicamos la astrofotografia de muy amplios campos, con objetivos de focal muy corta, son las aberraciones radiales de los colores que hacen que según las estrellas se alejan del centro de la imagen los canales de sus colores se desplazan entre si, llegando a originar en la periferia de los encuadres tres imagenes que dejan de estar superpuestas.
Hay programas como el DSS que permiten, dentro del proceso del calibrado y registro de las imágenes, alinear estos canales.
Pero cuando se quiere hacer esta alineación en una imagen es un proceso de una cierta laboriosidad y que requiere bastante tiempo.
En PixInsight, con la implementación del proceso de StartAlignment, el procedimiento a seguir se ha simplificado, pues resulta mucho más sencillo que al alineamiento manual a que obligaba DynamicAlignment.
Yo he conseguido, partiendo de una imagen RAW de una exposición realizada con una Canon 400d modificada y con un objetivo de 20 mm, una alineación bastante aceptable siguiendo el siguiente procedimiento.
Extracción de los tres canales, obteniendo tres imagenes en gris, mediante ChannelExtraction.
Alineación de las imagenes de los canales rojo y azul, respecto al verde mediante StartAlignment.
Combinación de los canales rojo y azul alineados, con el verde que se usó como referencia, mediante ChannelCombination.
El resultado se puede ver en esta imagen donde se muestra la diferencia entre dos recortes de la imagen, antes y después del proceso indicado.

(http://wrunch.com/images/arx1229162060z.jpg)

Ciertamente este proceso se complica cuando en el encuadre hay zonas sin estrellas por interponerse árboles, montañas, nubes, etc, o sencillamente es una imagen de trazas como una circumpolar, por lo que el proceso no cuenta con puntos de referencia en esas zonas.
Ahora bien y por ello viene mi petición, mientras se este utilizando la misma óptica y no haya cambios que modifiquen las circunstancias que generan la desalineación de los canales, yo creo que es posible aplicar la trasformación que genera el proceso de alineación que se ha conseguido con los canales de una imagen, en otras.
Seria cuestión de que aparte de generarse la alineación se pudiera almacenar de alguna manera la formula resultante para realizarlo y luego poder aplicarlo en otras imagenes.
Esto aparte de utilizarlo en imagenes que carezcan de estrellas que permitan la alineación podría ser muy util, para cuando se han obtenido muchas tomas, obtenida la "formula" en una de ellas, aplicarselo a las demás de una forma rápida.
¿Puede llegar a ser posible?.

Saludos.

Manolo L.
Title: Re: Alineación de Canales
Post by: David Serrano on 2008 December 13 09:38:54
Quote from: "ManoloL"
Ahora bien y por ello viene mi petición, mientras se este utilizando la misma óptica y no haya cambios que modifiquen las circunstancias que generan la desalineación de los canales, yo creo que es posible aplicar la trasformación que genera el proceso de alineación que se ha conseguido con los canales de una imagen, en otras.
Seria cuestión de que aparte de generarse la alineación se pudiera almacenar de alguna manera la formula resultante para realizarlo y luego poder aplicarlo en otras imagenes.


Yo creo que ya es posible.

Si lo estoy entendiendo bien, tú actualmente para arreglar la imagen estás lanzando una serie de procesos sobre la imagen. Esos procesos los puedes guardar en un ProcessContainer y, cuando los tengas todos, metes el Container en el escritorio y lo almacenas en un archivo .psm. A este archivo le pones el nombre que te dé la gana, por ejemplo "450D modificada + filtro quitamanchas + taka 320 f/1.4.psm" (1).

Otro día, llegas con una foto chunga y el proceso para arreglarla es cargar el .psm y arrastrarle el único icono (el Container) sobre la imagen.

--

1.- O les pones nombres más crípticos/normalitos y paralelamente creas un archivo de texto "Alineaciones de canales.txt" en el que relacionas cada .psm con las notas que creas conveniente, sin las limitaciones de los nombres de archivo:
Code: [Select]
001.psm: 450D modificada + filtro quitamanchas + taka 320 f/1.4.
002.psm: el mismo que arriba pero con barlow de plástico.
003.psm: a pelo, sólo cámara con un 11mm.
[/size]

Odio el phpbb, ¿no se puede poner el "code" en pequeño? xD
Title: Re: Alineación de Canales
Post by: ManoloL on 2008 December 13 10:52:45
Quote from: "David Serrano"

Yo creo que ya es posible.

Si lo estoy entendiendo bien, tú actualmente para arreglar la imagen estás lanzando una serie de procesos sobre la imagen. Esos procesos los puedes guardar en un ProcessContainer y, cuando los tengas todos, metes el Container en el escritorio y lo almacenas en un archivo .psm. A este archivo le pones el nombre que te dé la gana, por ejemplo "450D modificada + filtro quitamanchas + taka 320 f/1.4.psm" (1).

Otro día, llegas con una foto chunga y el proceso para arreglarla es cargar el .psm y arrastrarle el único icono (el Container) sobre la imagen.

--



Hola a todos

Gracias por tus indicaciones David.

Es posible que pueda hacerse, pero yo no tengo claro que sea tan sencillo.
El problema es que la alineación de imagenes se hace con dos imagenes y genera, asumiendo que la primera es la de referencia, una tercera que es la registrada de la segunda con respecto a la primera. El proceso lo hace partiendo de las estrellas que encuentra en ambas.
Si yo lanzo ese proceso sobre dos imágenes (canal verde y canal rojo o azul) donde el programa no encuentra estrellas alineables, sospecho que dará error. Creo entender que el programa ejecuta la alineación con lo que hay en las imagenes que se estan intentando alinear y no con los parametros obtenidos de otra alineación anterior.
Otra cosa seria si lo que intentara alinear fuera otra foto parecida con estrellas. En este caso si creo que funcionaria. Pero no es eso lo que pretendo hacer.

Saludos.
Title: Alineación de Canales
Post by: David Serrano on 2008 December 13 13:04:32
Un vistazo rápido a los parámetros de StarAlignment me indica que probablemente tengas razón. Siento no poder decirte mucho más.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 14 10:41:52
Hola Manolo y David

Es perfectamente posible hacerlo, pero es necesario escribir un pequeño script.

Si os fijáis StarAlignment escribe la matriz de transformación en la consola. Por ejemplo:

Code: [Select]
Transformation matrix:
     +1.0275     -0.3920   -102.2984
     +0.3912     +1.0279    -76.1698
     -0.0000     +0.0000     +1.0000


Estas matrices se pueden aplicar para transformar una imagen mediante una proyección homográfica.

Sea H la matriz de transformación (producida por StarAlignment):

Code: [Select]
   / h11 h12 h13 \
H = ( h21 h22 h23 )
    \ h31 h32 h33 /


Definimos:

Code: [Select]
w = h31 + h32 + h33

Sean A, A' las imágenes original y transformada, respectivamente. Para cada píxel p' = {x', y'} de A', las coordenadas del píxel correspondiente p = {x, y} en A (por proyección inversa) vienen dadas por:

Code: [Select]
x = (h11*x' + h12*y' + h13)/w
y = (h21*x' + h22*y' + h23)/w


Naturalmente, conviene asegurarse de que w no es insignificante o cero, aunque si usáis las matrices que produce StarAlignment, siempre se cumple que:

Code: [Select]
w >= 1

De esta forma, cada píxel p' de A' se puede calcular por interpolación sobre A en las coordenadas de p. Esto es lo que hace StarAlignment internamente.

Esto se puede hacer con un script. David, ¿te animas? :)
Title: Alineación de Canales
Post by: David Serrano on 2008 December 14 11:06:27
Quote from: "Juan Conejero"
Esto se puede hacer con un script. David, ¿te animas? :)


Sí, pero como no lo haga desde la ofi... en casa simplemente no puede ser.
Title: Alineación de Canales
Post by: ManoloL on 2008 December 14 14:04:07
Quote from: "Juan Conejero"
Hola Manolo y David

Es perfectamente posible hacerlo, pero es necesario escribir un pequeño script.

Si os fijáis StarAlignment escribe la matriz de transformación en la consola. Por ejemplo:

Code: [Select]
Transformation matrix:
     +1.0275     -0.3920   -102.2984
     +0.3912     +1.0279    -76.1698
     -0.0000     +0.0000     +1.0000

..........................



Hola Juan:

Yo ya me había fijado en la existencia de esa matriz y en que hay una cierta similitud entre los valores que aparecen, al alinear los canales en distintas exposiciones. Lógicamente esta aberración es constante si no hay cambios en la óptica. No se si los cambios de temperatura también tendrán una cierta influencia.
Ciertamente gran parte de tu explicación se escapa a mi compresión, pues mi formación matemática, incluida la geometría, no es muy elevada.
No obstante aplicando la lógica me parecía posible, como indicas que es, aplicar la matriz obtenida con una exposición, a otra distinta.
Curiosamente podemos, partiendo de nuestras imágenes astronómicas, llegar a corregir esta aberración de una foto "normal".
Curiosamente he oído que Photoshop tiene una utilidad para corregir este problema en las fotos cotidianas. No se si será cierto, pero creo que en ellas debe ser más dificil, al no contar con puntitos localizables que se desalinean en los distintos canales, como nos ocurre con las imágenes de las estrellas.

Quedo a la espera, a ver si David o algún otro "valiente" se anima.

Saludos.

Editado:

Después de una lectura mas reposada de la nota veo que la trasformación utilizada no es matemáticamente complicada.
De hecho voy a probar en Excel a hacer simulaciones para ver si las formulas aplicadas partiendo de los valores de las matrices que obtengo al alinear los canales dan resultados coherentes con lo que se puede estimar que ocurra que supongo que son desplazamientos radiales.

Saludos de nuevo.
Title: Alineación de Canales
Post by: David Serrano on 2008 December 15 00:30:29
Quote from: "Juan Conejero"
Code: [Select]
x = (h11*x' + h12*y' + h13)/w
y = (h21*x' + h22*y' + h23)/w


(Ya en la ofi :^P) A mí lo que me ralla es que cuando x' es 0 (o sea, en el borde izquierdo), los valores de x e y dependen exclusivamente de y'. Y, análogamente, cuando y' es 0 (o sea, en el borde superior), los valores de x e y dependen exclusivamente de x'. No le veo mucho sentido, pero tampoco le he dedicado tiempo extra de brain-power.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 02:15:30
Buenos días David

Pues es asín :) Ten en cuenta que x' e y' son las coordenadas en la imagen transformada, o sea que lo que estamos haciendo aquí es una proyección inversa (para cada píxel de la imagen final hallar las coordenadas para interpolar sobre la imagen original).

Ten en cuenta que w depende de transformaciones en ambas coordenadas, o sea que nunca vas a tener coordenadas x, y que sólo dependan de x' o y' (salvo que la transformación sea precisamente esa, p.e. un simple desplazamiento en X o en Y).

HomographicProjection ... ¡suena bien como nombre de un algo (algo en {script, módulo})! :o)
Title: Alineación de Canales
Post by: David Serrano on 2008 December 15 02:59:38
Quote from: "Juan Conejero"
(para cada píxel de la imagen final hallar las coordenadas para interpolar sobre la imagen original).


Tengo algo pero cuando las coordenadas de la imagen original, resultantes de las ecuacioncitas, se salen de los límites, ¿qué hacemos? De momento le puse un setSample (1.0, x', y') y aparecen un montón de píxels blancos.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 03:05:00
Quote
cuando las coordenadas de la imagen original, resultantes de las ecuacioncitas, se salen de los límites, ¿qué hacemos?


Mejor rellenar con negro. Es más eficiente rellenar primero toda la imagen final con negro. Después, cuando las coordenadas interpoladas se salen de la imagen original, simplemente no hagas nada y pasa al siguiente píxel. Esto rompe menos el pipelining de los procesadores.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 03:08:11
<no-vale>
O bien, deja que el runtime de JavaScript haga todo el trabajo por ti. Haz como si la imagen original fuera "infinita" y aplica siempre el valor interpolado a la imagen final.

Image.interpolate() te devolverá cero si las coordenadas están fuera de rango.
</no-vale>

¡Ooops! No, ignora esto que acabo de decir - en las últimas versiones eliminé esto para mejorar las prestaciones. Tienes que verificar la validez de las coordenadas explícitamente. Si no son válidas, Image.interpolate() te devolverá garbage, y eventualmente puedes causar un segfault. No me acordaba  :oops:
Title: Alineación de Canales
Post by: ManoloL on 2008 December 15 03:30:33
Quote from: "David Serrano"
Quote from: "Juan Conejero"
Code: [Select]
x = (h11*x' + h12*y' + h13)/w
y = (h21*x' + h22*y' + h23)/w


(Ya en la ofi :^P) A mí lo que me ralla es que cuando x' es 0 (o sea, en el borde izquierdo), los valores de x e y dependen exclusivamente de y'. Y, análogamente, cuando y' es 0 (o sea, en el borde superior), los valores de x e y dependen exclusivamente de x'. No le veo mucho sentido, pero tampoco le he dedicado tiempo extra de brain-power.


Hola David:
He elaborado una hoja de Excel con los datos de la matriz que me salió para alinear rojo sobre verde y he calculado los resultados del origen de un píxel rojo situado, en la trasformada, en las esquinas, en un punto cercano a una esquina, y en el centro de la imagen.

(http://wrunch.com/images/viu1229338803p.gif)

Los resultados son bastante coherentes:
En las esquinas de la trasformada el píxel rojo debería provenir de fuera del encuadre, por lo que no existe. En un punto de la trasformada cercano a una esquina (X'=3; Y'=2) ya coloca el pixel proveniente de dentro del encuadre original (0,52; 0,28 ). Y en el centro, como era de suponer apenas si lo mueve, solo hay una diferencia de centésimas de píxel.
Por lo que veo para afinar la imagen habría, en este caso, que posteriormente y con el resultado de la alineación obtenido, recortar 2 píxeles de los bordes horizontales y 3 de los bordes verticales de la imagen resultante, para eliminar las estrellas que han "perdido" su componente roja.
Me doy cuenta que todas las estrellas de los bordes son azules. :roll:  :roll:

Saludos.
Title: Alineación de Canales
Post by: OriolLehmkuhl on 2008 December 15 04:26:59
Hola a todos,

que rápido liáis una buena! :D

Quote from: "Juan Conejero"
HomographicProjection ... ¡suena bien como nombre de un algo (algo en {script, módulo})! :o)


oye David, si vas muy liado para "modulolizar" este scriptillo ya lo hago yo ;) no hay problema!

Oriol
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 04:29:11
Quote
A mí lo que me ralla es que cuando x' es 0 (o sea, en el borde izquierdo), los valores de x e y dependen exclusivamente de y'. Y, análogamente, cuando y' es 0 (o sea, en el borde superior), los valores de x e y dependen exclusivamente de x'.


David, antes no te respondí a esto correctamente (Lunes por la mañana, ya sabes... hmmm...)

En el punto x'=y'=0 estas transformaciones siempre equivalen a una traslación pura, de manera que sólo los elementos h13 y h23 (desplazamiento en X y en Y, respectivamente) y la última fila de la matriz (w) intervienen para calcular las coordenadas del punto sobre la imagen original. Esto lo que demuestra es que tanto la rotación como el cambio de escala son invariantes a la traslación. Vaya, si no fuera así StarAlignment no funcionaría ni de coña :)
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 04:31:21
Quote from: "OriolLehmkuhl"
que rápido liáis una buena! :D


Y tanto. Somos extremadamente peligrosos, tío, ten cuidado  :lol:
Title: Alineación de Canales
Post by: David Serrano on 2008 December 15 06:24:42
Quote from: "OriolLehmkuhl"
oye David, si vas muy liado para "modulolizar" este scriptillo ya lo hago yo ;) no hay problema!


Menos mal que apareces :^P. Estaba a punto de pasarte un código que, directamente, *no* funcionaba. Sin embargo, haciendo un poco de clean-up parece que se ha arreglado él solito así por las buenas :^?... En fins, aquí lo tienes. En el campo "Author" ponle tu nombre, y haz pruebas con una imagen pequeña (yo estoy con 100x60). Ah, y los tabulatas son de 4 caracteres.

Code: [Select]
#include <pjsr/SampleType.jsh>
#include <pjsr/ColorSpace.jsh>
#include <pjsr/UndoFlag.jsh>

// configurable data

var matrix = new Array (
    new Array (+1.0275, -0.3920, +0.0000),
    new Array (+0.3912, +1.0279, +0.0000),
    new Array (-0.0000, +0.0000, +1.0000)
);

// end

var win = ImageWindow.activeWindow;
if (win.isNull) throw Error ("Invalid/No image window.");
var img = win.mainView.image;

var new_iw = new ImageWindow (
    img.width, img.height, img.numberOfChannels, img.bitsPerSample,
    img.sampleType == SampleType_Real,
    img.colorSpace != ColorSpace_Gray,
    'result'
);
new_iw.show();
var new_view = new_iw.currentView;
var new_img = new_view.image;

// no way to integrate this into the loop below and no time to investigate it, so...
new_view.beginProcess (UndoFlag_PixelData);
new_img.selectedChannel=0; new_img.fill(0);
new_img.selectedChannel=1; new_img.fill(0);
new_img.selectedChannel=2; new_img.fill(0);
new_view.endProcess();

var w = matrix[2][0] + matrix[2][1] + matrix[2][2];
// TODO (alias letsome1elsedoit): assert w != 0

new_view.beginProcess (UndoFlag_PixelData);
for (var ch = 0; ch < new_img.numberOfChannels; ch++) {
    console.writeln ("working with channel (",ch,")");
    for (var new_y = 0; new_y < new_img.height; new_y++) {
        for (var new_x = 0; new_x < new_img.width; new_x++) {
            var x = (matrix[0][0] * new_x + matrix[0][1] * new_y + matrix[0][2]) / w;
            var y = (matrix[1][0] * new_x + matrix[1][1] * new_y + matrix[1][2]) / w;

            // assert x and y are within bounds
            if (x < 0 || y < 0 || x >= img.width || y >= img.height) {
                //console.writeln ("x (",x,") or y (",y,") out of bounds for coords x (",new_x,") y (",new_y,") ch (",ch,")");
                //console.write ("x");
                continue;
            } else {
                //console.writeln ("YEAH!! SETTING AT LEAST *ONE* PIXEL!! x (",new_x,") y (",new_y,") ch (",ch,")");
                //console.write (".");
                new_img.setSample (img.interpolate (x, y, ch), new_x, new_y, ch);
            }
        }
        console.writeln ("");
    }
}
new_view.endProcess();
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 06:59:23
Sí señor, pero qué grande eres David  :D

Funciona genial, eres un hacha. Con tu permiso lo he pulido un poco:

Code: [Select]

#include <pjsr/SampleType.jsh>
#include <pjsr/ColorSpace.jsh>
#include <pjsr/UndoFlag.jsh>

// configurable data

var matrix = new Array (
    new Array (+1.0275, -0.3920, +0.0000),
    new Array (+0.3912, +1.0279, +0.0000),
    new Array (-0.0000, +0.0000, +1.0000)
);

var w = matrix[2][0] + matrix[2][1] + matrix[2][2];
if ( 1 + w == 1 )
    throw Error( "Singular matrix!" );

var backgroundColor = 0;

// end

var win = ImageWindow.activeWindow;
if (win.isNull) throw Error ("Invalid/No image window.");
var img = win.mainView.image;

var new_iw = new ImageWindow (
    img.width, img.height, img.numberOfChannels, img.bitsPerSample,
    img.sampleType == SampleType_Real,
    img.colorSpace != ColorSpace_Gray,
    'result'
);

var new_view = new_iw.currentView;
var new_img = new_view.image;

new_view.beginProcess (UndoFlag_NoSwapFile);

new_img.fill( backgroundColor );

console.show();
console.writeln( "<b>" + ImageWindow.activeWindow.mainView.id + "</b>" );

console.abortEnabled = true;

new_img.statusEnabled = true;
new_img.initializeStatus( "Homographic projection",
                          new_img.width*new_img.height*new_img.numberOfChannels );

var h00 = matrix[0][0]/w;
var h01 = matrix[0][1]/w;
var h02 = matrix[0][2]/w;

var h10 = matrix[1][0]/w;
var h11 = matrix[1][1]/w;
var h12 = matrix[1][2]/w;

for (var ch = 0, n1 = 0; ch < new_img.numberOfChannels; ch++) {
    for (var new_y = 0; new_y < new_img.height; new_y++) {
        var h01y02 = h01 * new_y + h02;
        var h11y12 = h11 * new_y + h12;
        for (var new_x = 0; new_x < new_img.width; new_x++) {
            var x = h00 * new_x + h01y02;
            var y = h10 * new_x + h11y12;

            // assert x and y are within bounds
            if (x >= 0 && y >= 0 && x < img.width && y < img.height)
                new_img.setSample (img.interpolate (x, y, ch), new_x, new_y, ch);

            if ( ++n1 == 1024 )
            {
               new_img.advanceStatus( n1 );
               n1 = 0;
               gc();
            }
        }
    }
}
new_view.endProcess();

new_iw.show();
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 07:36:16
Por cierto, no hemos explicado para qué sirve realmente (o de dónde viene) cada elemento de la matriz de transformación. En realidad, la matriz de proyección homográfica se puede descomponer como el producto de al menos ocho matrices:

Matriz identidad
Code: [Select]
1  0  0
0  1  0
0  0  1


Traslación en el eje X
Code: [Select]
1  0  dx
0  1  0
0  0  1


Traslación en el eje Y
Code: [Select]
1  0  0
0  1  dy
0  0  1


Rotación respecto del origen un ángulo a (en el sentido contrario a las agujas del reloj)
Code: [Select]
cos(a) sin(a) 0
-sin(a) cos(a) 0
 0      0      1


Factor de escala en el eje X
Code: [Select]
kx 0  0
0  1  0
0  0  1


Factor de escala en el eje Y
Code: [Select]
1  0  0
0  ky 0
0  0  1


Estiramiento en el eje X (chirping effect)
Code: [Select]
1  0  0
0  1  0
cx 0  1


Estiramiento en el eje Y (keystoning effect)
Code: [Select]
1  0  0
0  1  0
0  cy 1
Title: Alineación de Canales
Post by: David Serrano on 2008 December 15 07:54:20
Quote from: "Juan Conejero"
Code: [Select]

// configurable data

[...]

var w = matrix[2][0] + matrix[2][1] + matrix[2][2];
if ( 1 + w == 1 )
    throw Error( "Singular matrix!" );

[...]

// end


Eso no es configurable, hombre!! ¿Pero para qué existen los comentarios? xD. Con respecto al otro post de las matrices, echo de menos mi tiempo libre!!

Por cierto, te puse un mail el Viernes... un poco borde, he de reconocerlo, pero es que olvidé contar hasta 10 antes de escribirlo (insert emoticon for an angel here).
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 08:18:41
Quote
Eso no es configurable, hombre!!


Touchée. No ví el "// end" O:-)

Quote
Con respecto al otro post de las matrices, echo de menos mi tiempo libre!!


Bueno, te comprendo, ahora tienes otras "priority tasks" :) Tranqui, que eso es cuestión de 18 años o así nada más... ¡es broma!  :lol:

Bueno, pues eso, se te echa de menos ;)
Title: Alineación de Canales
Post by: David Serrano on 2008 December 15 08:36:08
Vaya, has respondido antes de que yo actualizara el mensaje anterior. En fins, pues toca repetir algunas cosas por si acaso.

Quote from: "Juan Conejero"
Bueno, te comprendo, ahora tienes otras "priority tasks" :) Tranqui, que eso es cuestión de 18 años o así nada más... ¡es broma!  :lol:


No te creas!! Este fin de semana ha cambiado por completo mi percepción del crío: la churri se fue de parranda todo el finde y me lo dejó encargadito a ver si conseguía mantenerlo vivo. Y bueno, no sólo lo conseguí con creces sino que tuve tiempo de ponerme a empaquetar la 1.4.0 (te puse un mail el Viernes a tal efecto) y de más cosas!!

Así que bueno, a ver si me libro de la churri más a menudo :twisted:.
Title: Alineación de Canales
Post by: ManoloL on 2008 December 15 10:17:00
Hola a todos:
Pues partiendo del Script de David en el estado que lo ha dejado Juan, he realizado dos versiones sustituyendo la matriz que hay por las que obtuve de las imágenes en Tiermes (25-26 Octubre) y con una temperatura entre 0 y 5 ºC, para alinear los colores rojo y azul sobre el verde.
Esos dos scripts los he aplicado a los canales rojo y azul de una de las exposiciones de la Vía Láctea que obtuve cerca de Selas en la noche del 2 al 3 de Agosto (por cierto en la agradable compañía de Ivette y Oriol, entre otros :lol:  :lol: ). La temperatura aunque no la tengo anotada fue muy superior y los píxeles calientes cantan una barbaridad. De hecho cuando he intentado alinear los canales de estas cálidas exposiciones me ha dado error hasta que disminuí drasticamente el numero de estrellas, quizás por la abundancia de estos píxeles desmadrados.
He aplicado el mismo recorte a la imagen original (de Selas) y a la alineada con la matriz procedente de la sesión posterior (de Tiermes)

(http://wrunch.com/images/bfi1229364410x.jpg)

y el resultado ha sido bastante efectivo, ciertamente los píxeles rojos desbordados se confunden en algunos puntos con las imágenes rojas de las estrellas y dan efectos extraños, pero realmente la mejora es muy evidente, pese a la diferencia de temperatura entre ambas exposiciones :

(http://wrunch.com/images/opt1229364477m.jpg)

El "motor" del Script funciona.

Supongo que queda darle una forma más amigable, pero a mi tal como está me sirve.

Muchas gracias a ambos.

Saludos.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 10:55:22
Hola Manolo

Pues es un resultado realmente bueno, me alegro mucho de que te funcione tan bien.

A la vista de la matriz que pusiste en la hoja de cálculo:

Code: [Select]
1.0013     0       -2.4871
0          1.0013  -1.7195
0          0        1


las diferencias entre los dos canales se pueden describir sólo mediante un simple cambio de escala (por lo menos para el conjunto de estrellas que encontró StarAlignment). Descartando los elementos h13 y h23 de la matriz, que sólo aplican un desplazamiento en X y en Y para todos los píxeles por igual, la matriz que has usado define un factor de escala de 1.0013 para ambos ejes.

O sea, que uno de los canales está literalmente inflado desde el centro hacia la periferia, con respecto al otro canal. Interesante 8)

Gracias por plantear el problema; es magnífico como campo de ensayo para un montón de ideas que a buen seguro van a surgir a partir del script que ha escrito David.
Title: Alineación de Canales
Post by: ManoloL on 2008 December 15 11:36:09
Quote from: "Juan Conejero"


O sea, que uno de los canales está literalmente inflado desde el centro hacia la periferia, con respecto al otro canal. Interesante 8)



Hola Juan:

Realmente es lo esperado que ocurra. Como el objetivo no está perfectamente corregido las imágenes se desplazan según se van alejando del centro.
El canal rojo queda inflado con respecto al verde y el azul encogido. De ahí es aspecto de las estrellas con las tres imágenes azul hacía dentro, verde y roja hacía afuera, más o menos superpuestas  y alineadas con respecto al centro de la imagen donde deben estar perfectamente alineadas originalmente.

De nuevo muchas gracias por atender mi petición de una forma tan rápida y efectiva.

Saludos.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 11:39:44
Quote
Realmente es lo esperado que ocurra


Sí claro, pero, ¿no es genial cuando las herramientas dan la razón a la realidad, y viceversa?  :lol:
Title: Alineación de Canales
Post by: OriolLehmkuhl on 2008 December 15 11:53:30
Hola,

pues seré el tonto del grupo :( pero hay cosas que no entiendo... Supongo que hay una matriz H distinta para cada canal, no? y ahora estais aplicando el script mas de una vez...

Así pues el usuario debería decir cual es el canal de referencia para el y después calcular las distintas H para el resto de los canales no? Después siempre se puede dejar la posibilidad de entrar las matrices H a mano también, para los casos que no haya la posibilidad de calcular automáticamente la H. Es eso? o me estoy liando??

He estado mirando el código  StarAlignement y parece factible  8) te quedo bonito eso Juan ;)

Oriol
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 15 12:06:41
Hey Oriol

No no, lo entiendes perfectamente :) Hay varias formas de entender el asunto, creo yo. Una sería una herramienta genérica para aplicar transformaciones por proyección homográfica (lo cual incluye también a todas las transformaciones afines, cuando h31=h32=0). Sería un proceso a incluir en el módulo Geometry.

Otra posible herramienta sería una específica para alinear canales. Bueno, esta se podría incluir en StarAlignment, o quizá mejor (porque SA ya es bastante complicada) hacer una nueva en el módulo ImageRegistration.

Y seguramente más cosas. Vamos, que mola :)

Quote
He estado mirando el código StarAlignement y parece factible  te quedo bonito eso Juan


Gracias gracias :) Como ya te dije, creo que es de lo mejor que he escrito; estoy bastante contento con esa implementación, a pesar de que aún le faltan cosas (sobre todo a la interfaz) y tengo que mejorar la generación de triángulos para que se puedan construir mosaicos con más seguridad.
Title: Alineación de Canales
Post by: OriolLehmkuhl on 2008 December 15 12:16:25
Quote from: "Juan Conejero"
quizá mejor (porque SA ya es bastante complicada) hacer una nueva en el módulo ImageRegistration.


Bueno yo ya empezé a hacer eso :D :D :D de momento automático y que vaya por consola :) aun no va por eso :(

Quote from: "Juan Conejero"

.... tengo que mejorar la generación de triángulos para que se puedan construir mosaicos con más seguridad.


eso me suena a paranoia de mallador ;) te puedo ayudar piensa que mis mallas son tetraedros pero bueno siempre empiezo por triangulitos y algoritmos tipo delaunay los he sufrido ....

Hablamos! ;)

Oriol
Title: Alineación de Canales
Post by: ManoloL on 2008 December 15 14:53:12
Hola de nuevo:

He estado elucubrando sobre el "factor de inflado" y he llegado de forma empírica a la siguiente conclusión:
Si admitimos que cada canal se expande, o contrae, radialmente con arreglo al factor que existe en H(1,1), pueden definirse  automáticamente el resto de los componentes de la matriz:
H(1,2)=0
H(1,3)=(1-H(1,1))*(numero de píxeles por fila)/2
H(2,1)=0
H(2,2)=H(1,1)
H(2,3)=(1-H(1,1))*(número de píxeles por columna)/2
H(3,1)=0
H(3,2)=0
H(3,3)=1

He colocado la formula en la hoja de cálculo y sobre la base del factor 1.0013, las diferencias con lo obtenido en la trasformada, con los datos completos, solo discrepa en centésimas de pixel. Y en el centro coinciden los píxeles de la original y la trasformada usando los datos "sintéticos".

Por cierto para el canal azul el factor es 0.9998 para mis exposiciones con el EF20mm a f:7,1.

He estado viendo otra exposición antigua obtenida a f:3,5 y al aplicar la matriz que me había servido para Tiermes y Selas ( factor del rojo 1.0013) me ha sobrecorregido los canales pasando el color rojo a quedar hacia el centro. Eso me hace pensar que, quizás, con el diafragma más abierto este tipo de aberración es menor (?), lo que contradice lo que siempre he oido de que hay menos aberraciones cuanto más se cierra el diafragma, pero......
Aprovechando mis vacaciones y el mal tiempo seguiré investigando......

Saludos.
Title: Alineación de Canales
Post by: OriolLehmkuhl 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
Title: Alineación de Canales
Post by: ManoloL 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
(http://wrunch.com/images/rgh1195163408s.jpg)
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.
(http://wrunch.com/images/jdv1229414468a.jpg)

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:
(http://wrunch.com/images/opt1229414695b.jpg)

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.
Title: Alineación de Canales
Post by: David Serrano 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!!
Title: Alineación de Canales
Post by: Juan Conejero 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 ;)
Title: Alineación de Canales
Post by: OriolLehmkuhl 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
Title: Alineación de Canales
Post by: Juan Conejero 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? :)
Title: Alineación de Canales
Post by: OriolLehmkuhl 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
Title: Alineación de Canales
Post by: David Serrano 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:
Title: Alineación de Canales
Post by: Juan Conejero 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)
Title: Alineación de Canales
Post by: David Serrano 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 (http://farm4.static.flickr.com/3295/2974603384_e396f2589b.jpg?v=0) no funciona, busca el palabrejo en google images. Es publicidad de Ono.
Title: Alineación de Canales
Post by: Juan Conejero on 2008 December 16 02:23:20
:shock: Absolutely wonderful. Y es que esto de no tener tele...  :)
Title: Alineación de Canales
Post by: ManoloL 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:

(http://wrunch.com/images/opt1229426963t.jpg)

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.
Title: Alineación de Canales
Post by: Juan Conejero 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 ;)
Title: Alineación de Canales
Post by: OriolLehmkuhl 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
Title: Alineación de Canales
Post by: Astrocava 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
Title: Alineación de Canales
Post by: ManoloL on 2008 December 16 11:37:39
Quote from: "cavamen"
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


Hola Sergio:

¡Ojala! pero sospecho que no.
Se puede conseguir que en la esquina en vez de tener tres elipses de distinto color, se superpongan las tres y tengas una elipse blanca, pero con lo que veo que se esta haciendo, la forma de elipse o pera no va a cambiar.
Me alegraría equivocarme.........

Saludos.

Manolo L.
Title: Alineación de Canales
Post by: caliu on 2008 December 16 12:40:38
Supongo que lo de la coma no debe ser muy dificil, en PS hay una herramienta de correcciòn geometrica y habiendola allí seguro que aqui la bordaban :lol:  :lol:  :lol: , lo dificil creo que seria una herramienta capaz de corregir la rotaciòn de campo, eso si que seria la caña :P  :P  :P
Title: Alineación de Canales
Post by: ManoloL on 2008 December 16 12:53:55
Quote from: "caliu"
Supongo que lo de la coma no debe ser muy dificil, en PS hay una herramienta de correcciòn geometrica y habiendola allí seguro que aqui la bordaban :lol:  :lol:  :lol: , lo dificil creo que seria una herramienta capaz de corregir la rotaciòn de campo, eso si que seria la caña :P  :P  :P


Hola Caliu.

Pues me alegraría mucho,  pero para conseguirlo supongo que hay que seguir otros caminos como deconvoluciones o similares....., que poco tienen que ver con la alineación de canales.
O al menos eso pienso yo, que dicho sea de paso, no soy una autoridad en el tema.

Saludos.

Manolo L.
Title: Alineación de Canales
Post by: David Serrano on 2008 December 16 14:19:33
Hace un rato puse un post en la sección de desarrollo en el que muestro un script que implementa los fundamentos básicos para un corrector de coma. Es todavía muy pobre, pero muestra mi plan de ataque.
Title: Alineación de Canales
Post by: David Serrano on 2008 December 16 14:20:30
Ah, y la rotación de campo se soluciona de la misma manera que tengo pensado hacer la correción de coma. Simplemente se usa otra PSF (una en forma de arco) y listos.
Title: Alineación de Canales
Post by: OriolLehmkuhl on 2008 December 17 15:03:24
Hola,

pues ya tengo una versión más completa, que por lo menos realiza el proceso automáticamente des del terminal. Aquí esta el corazón:

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);

    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;
}

static void CorrectImage(const Array<Homography>& H, const Image& img, Image &final) {

    size_type channels = img.NumberOfChannels();
    BicubicPixelInterpolation interType;

    for(size_type c=0; c<channels; ++c) {
        PixelInterpolation::Interpolator<Image::pixel_traits> *interpolator
            = interType.NewInterpolator((Image::pixel_traits *)0, img.PixelData(c), img.Width(), img.Height());
        Image::sample *target = final[c];

        for (size_type new_y = 0; new_y < final.Height(); ++new_y) {
            for (size_type new_x = 0; new_x < final.Width(); ++new_x,++target) {
                FPoint p = H[c]( new_x, new_y );
                if (p.x >= 0 && p.y >= 0 && p.x < img.Width() && p.y < img.Height()) *target = (*interpolator)(p);
            }
        }
        delete interpolator;
    }    
}

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);

     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." );

     Array<Homography> H(3);

     H[1] = RM_RtoG.H;
     H[2] = RM_RtoB.H;

     Image image(img.Width(),img.Height(),img.ColorSpace());
     Image final(img.Width(),img.Height(),img.ColorSpace());
     Image::sample backgroundColor = 0;

     image.Assign(img);
     final.Fill(backgroundColor);

     CorrectImage(H,image,final);

     ImageWindow win( 1, 1, final.IsColor() ? 3 : 1, 32, true, final.IsColor(), true, "Corrected" );
     if ( win.IsNull() )
         throw Error( "Unable to create image window: Mask" );

     ImageVariant imgOut = win.MainView().Image();
     imgOut.CopyImage( final );
     win.Show();
     win.ZoomToFit( false );
}



Ahora queda poner estas funciones en una clasilla para que se pueda utilizar otro dia en algún proceso que lo requiera y claro generar un dialogo para controlar el proceso. En el dialogo se podría activar el modo automático o si es una imagen donde no hay estrellas pues se debería introducir manualmente las matrices :) mmm no se, quizás se podría guardar algún tipo de fichero para no tener que introducir manualmente las mismas matrices? Ya diréis ;)

Oriol
Title: Alineación de Canales
Post by: ManoloL on 2008 December 18 05:51:46
Hola Oriol:

Esta tarde echaré un vistazo a la nueva versión.
Yo con la antigua me he hecho dos scripts: uno para alinear el rojo y otro para alinear el azul. Cada uno tiene introducida la matriz correspondiente que obtuve en Tiermes, y por ahora me ha dado buenos resultados en todas fotos que he realizado con el gran angular a f:7,1.
Los resultados mas espectaculares como ya he indicado es con las trazas. De hecho no me decidía a usar este objetivo para este tipo de foto y solo estaba usando el EF 50mm menos afectado por este fenómeno, aunque cuando se hacen de la zona ecuatorial se requiere un campo más amplio de lo que da este para que se diferencie la curvatura que hay en ambos hemisferios.
En Tiermes, en octubre, quedé frustrado porque con el de 50 mm no pude lograr un encuadre englobando a la esquina de las Termas y el Polo. En mi próxima visita lo intentaré con el de 20 mm, pues es una foto que llevo persiguiendo dos años y ahora creo que está a mi alcance.

Saludos.
Title: Alineación de Canales
Post by: OriolLehmkuhl on 2008 December 18 06:00:13
Uy Manolo,

lo que he puesto es C++ no lo podrás usar como script :? lo siento. Espero que en la próxima realse de PI se pueda usar como una herramienta más de PI :) De momento tendrás que continuar con el script que tienes, disculpa las molestias,

Oriol
Title: Alineación de Canales
Post by: ManoloL on 2008 December 18 07:07:57
Quote from: "OriolLehmkuhl"
Uy Manolo,

lo que he puesto es C++ no lo podrás usar como script :? lo siento. Espero que en la próxima realse de PI se pueda usar como una herramienta más de PI :) De momento tendrás que continuar con el script que tienes, disculpa las molestias,

Oriol

Hola Oriol:

Ya me extrañaba que el resultado fuera este:

Reading 1 image(s):
G:/FotosNuevas/A2008/10Octubre/081026Tiermes/Tiermes081026/400d/IMG_6856.CR2
Decoding Canon EOS 400D DIGITAL file (3906x2602 pixels, ISO=1600, Exposure=1/30s): 100%
Loading raw image: 100%

run -x=auto C:/PCL/src/scripts/AlineacionCanalesB.js

Processing script file: C:/PCL/src/scripts/AlineacionCanalesB.js
*** Error [109]: C:/PCL/src/scripts/AlineacionCanalesB.js, line 1: SyntaxError: missing ; before statement
; template <class P>
..................^

Y no ha sido ninguna molestia. Estoy encantado de probar lo que me echéis.
Yo aunque sea con el script de una forma tan artesana estoy tan contento como un niño con "objetivo" nuevo.

Saludos.

Manolo L.