@B&W Si, sicuramente escluderò il deviatore perchè è un inutile intermezzo nel cammino ottico, fors'anche dannoso ed anche se il mio occhio nn se ne accorge, la telecamera si. Per quanto riguarda il campionamento io con 1500mm di focale e sensore di 3,75 micron sarei a 0,5" per pixel, cioè 1" su 2 pixel. Sarei dunque già nella regola del campionamento ideale che dice che "il potere risolutivo dell'ottica deve essere spalmato su due pixel del sensore". O sbaglio? Introdurre una Barlow mi porterebbe ad un sovracampionamento inutile, no? Oltretutto mi risulta che nel Mediterraneo il seeing non scenda mai sotto il mezzo secondo, e puntualmente in questo sono smentito dalle profonde immagini fatte dagli amici in questo forum.
@Tuvok Allora. Io non conosco (nè potrei conoscere) gli algoritmi utilizzati dai programmi "ufficiali" per ottenere le somme dei frames, tantomeno il criterio per escludere i frames "non buoni". Allora ho scritto una procedura che in pratica mi trasforma il disco planetario di ogni frames in una "palla" di pixel "saturi" cioè molto più luminosi del fondo cielo, e tramite uno "scanner" (matematico) esplora i frames da destra a sinistra e viceversa e dall'alto in basso e viceversa, determinando così 4 punti sulla circonferenza che delimita il cerchio-disco. Facendo la media delle coordinate di questi 4 punti si ottiene "il miglior centro" dei dischi in ogni frame. Basta allora chiedere il crop di ogni frame centrato su tale "centro-disco", sommare tutti i crop (cioè i valori R,G e B di ogni pixel) ottenuti (che saranno così "allineati") e fare la media sul numero di frames. Alla fine si ottiene una somma mediata. Sulle elaborazioni di 1° livello applico una funzione di contrasto molto semplice, descritta di seguito
c = b.GetPixel(x, y);
L = (float)(1f * c.R + 1f * c.G + 1f * c.B); if (L == 0f) { rc = 0; gc = 0; bc = 0; k = 1f; } else { if (L < sog + 1f)//[0, sog] -> (0, sog)^n Lc = (float)Math.Pow(L / sog, n) * sog; else//[sog, 765] -> (sog, 765)^1/n Lc = (float)Math.Pow((L - sog - 1f) / (764f - sog), 1f / n) * (765f - sog) + sog;
k = Lc / L;
rc = (int)(k * c.R); gc = (int)(k * c.G); bc = (int)(k * c.B);
if (rc > 255) rc = 255; if (rc < 0) rc = 0; if (gc > 255) gc = 255; if (gc < 0) gc = 0; if (bc > 255) bc = 255; if (bc < 0) bc = 0; }
la quale, scelta una soglia di separazione tra "chiari" e "scuri" non fa altro che esaltare i chiari ed abbattere (oscurare) i pixel scuri. La funzione è esponenziale.
Posso anche applicare dei "filtrini colorati", sia sommandoli e facendo una media che sottraendoli, in percentuali a mio piacere.
L'elaborazione del 2° livello è più sofisticata. Anzichè analizzare le luminanze dei pixel si analizzano le "crominanze", cioè vettori a due componenti R-G, G-B che sono le differenze di colore in ciascun pixel. Questa analisi ha portato ad un risultato sorprendente: il 90% del disco è costituito da vettori aventi le due componenti entrambe positive, cioè con R>G e G>B, e solo una piccola parte (in basso) contiene quasi esclusivamente pixel con la prima componente negativa, cioè R<G mentre la seconda resta positiva, G>B. Sono dunque pixel "decisamente verdi", laddove il 90% del disco è costituito da pixel "decisamente gialli". Allora questa analisi non permette di discriminare zone a diversa crominanza per "tirar fuori" particolari, permette solo di dedurre che in basso è presente una frangia che - lontano dal risvegliare in me l'idea che possa trattarsi della calotta polare - mi fa pensare piuttosto ad una frangia di diffrazione dovuta non alle ottiche (che sono a specchio e dunque esenti da aberrazione cromatica) ma a qualcos'altro, ad esempio turbolenza atmosferica o specchietto deviatore o chissà il vetrino della telecamera.... Tornando alla parte preponderante del disco, visto che l'analisi delle sole componenti dei vettori crominanti non può portare a nulla, ho dovuto "approfondire" l'analisi andando a studiare l'inclinazione di questi vettori, cioè differenziando i vettori in base ai rapporti tra le due componenti. Vettori "coricati" sull'asse x hanno la componente R-G molto maggiore di quella sull'asse y cioè G-B e sono dunque "più gialli" dei vettori "messi in piedi" cioè aventi la componente G-B maggiore della componente R-G e dunque "più ciani". Ma ciò che conta è che questi vettori descrivono un angolo di 90° e se li dividiamo in gruppi di (ad esempio) 5° otteniamo 18 livelli di crominanza che una qualche informazione devono contenere. Allora basta applicare una funzione di contrasto su questi livelli di crominanza (anzichè l'usuale contrasto sulle luminanze) per tirar fuori ed esaltare una distribuzione di "macchie" altrimenti nascoste ed invisibili. Ecco la procedura:
c = b.GetPixel(x, y); cro = new Vector2(c.R - c.G, c.G - c.B); if (cro.X > 0 & cro.Y > 0) { a = (float)Math.Atan(1f * cro.Y / (1f * cro.X));
am = (float)((int)(a / xl) * xl);//15-30-60 livelli da 0 a 1,5 listPre2.Items.Add(am.ToString()); rc = (int)(170f * am);//rc da 0 a 255 rc = 255 - rc; //rc invertito rc += 100;//rc alzato if (c.R == 0) b.SetPixel(x, y, Color.FromArgb(rc, 0, 0)); else { k = (float)(rc / (1f * c.R)); gc = (int)(c.G * k); bc = (int)(c.B * k);
if (rc > 255) rc = 255; if (rc < 0) rc = 0; if (gc > 255) gc = 255; if (gc < 0) gc = 0; if (bc > 255) bc = 255; if (bc < 0) bc = 0;
b.SetPixel(x, y, Color.FromArgb(rc, gc, bc)); } } else if (cro.X < 0 & cro.Y > 0) { a = (float)Math.Atan(1f * cro.Y / (-1f * cro.X));
am = (float)((int)(a / 0.1f) * 0.1f);//15 livelli da 0 a 1,5 listPre2.Items.Add(am.ToString()); gc = (int)(170f * am);//rc da 0 a 255 gc = 255 - gc; //rc invertito gc += 100;//rc alzato if (c.G == 0) b.SetPixel(x, y, Color.FromArgb(0, gc, 0)); else { k = (float)(gc / (1f * c.G)); rc = (int)(c.R * k); bc = (int)(c.B * k * 3f);
if (rc > 255) rc = 255; if (rc < 0) rc = 0; if (gc > 255) gc = 255; if (gc < 0) gc = 0; if (bc > 255) bc = 255; if (bc < 0) bc = 0;
b.SetPixel(x, y, Color.FromArgb(rc, gc, bc)); } }
Applico anche una procedura che "oscura" la parte centrale del disco ed "illumina" i bordi per compensare l'effetto di "abbagliamento" dovuto alla sfericità del pianeta: la parte centrale del disco riflette la luce solare più che ai bordi e questo nuoce alla corretta lettura delle luminanze e crominanze dei pixel. Naturalmente alla fine di ogni elaborazione la procedura viene riapplicata ma in senso inverso ed anzi più "esaltata" per evidenziare la sfericità del pianeta dando un effetto di rilievo.
Il linguaggio è il fantastico C#.
Allegati: |
geo.png [ 5.74 KiB | Osservato 682 volte ]
|
fil.PNG [ 177.36 KiB | Osservato 682 volte ]
|
_________________ OSSERVO CON: binocolo 8x30 (in vendita per passaggio a strumento inferiore)
|