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

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #15 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:
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
Alineación de Canales
« Reply #16 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();
--
 David Serrano

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #17 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();
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #18 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
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
Alineación de Canales
« Reply #19 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).
--
 David Serrano

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #20 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 ;)
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline David Serrano

  • PTeam Member
  • PixInsight Guru
  • ****
  • Posts: 503
Alineación de Canales
« Reply #21 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:.
--
 David Serrano

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
Alineación de Canales
« Reply #22 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)



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 :



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.
Saludos.

Manolo L.

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #23 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.
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
Alineación de Canales
« Reply #24 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.
Saludos.

Manolo L.

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #25 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:
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • http://www.astrosurf.com/brego-sky
Alineación de Canales
« Reply #26 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

Offline Juan Conejero

  • PTeam Member
  • PixInsight Jedi Grand Master
  • ********
  • Posts: 7111
    • http://pixinsight.com/
Alineación de Canales
« Reply #27 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.
Juan Conejero
PixInsight Development Team
http://pixinsight.com/

Offline OriolLehmkuhl

  • PixInsight Addict
  • ***
  • Posts: 177
    • http://www.astrosurf.com/brego-sky
Alineación de Canales
« Reply #28 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

Offline ManoloL

  • PixInsight Addict
  • ***
  • Posts: 220
Alineación de Canales
« Reply #29 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.
Saludos.

Manolo L.