Zpracování série snímků úplného zatmění Slunce
Michal Švanda, 2. ročník, fyzika
Úplné zatmění Slunce je jev, který se nekoná každým rokem a obyčejný smrtelník
jen obvykle nevidí vícekrát než jednou za život (zda-li pak vůbec). Astronomové
pořádají za tímto zázrakem nebeské mechaniky hromadné výjezdy, protože jen tak lze získat
ze Země pozorování vnější části sluneční atmosféry - koróny.
11. srpna 1999 jsme měli příležitost vidět tuto událost nedaleko našich hranic. Proto
jsme neváhali a vyrazili směrem k maďarskému Balatonu, kde jsme také úplné zatmění
odpozorovali a vyfotografovali (viz reportáž).
Cílem většiny expedic je získat sérii snímků koróny pořízených v různých expozičních
časech - dle délky expozice se tak zabere jen určitá část koróny. Abychom získali povšechnou
informaci, snímky v závěru skládáme. Lze to udělat ručně v každém pořádném programu
pro zpracování obrazu na PC (např. v Adobe Photoshopu), ale je to práce únavná a
člověk navíc neví, co přesně vlastně dělá.
Rozhodl jsem se tedy využít některých schopností IDL a především toho, že vím,
co se snímkem provádím a tedy tuším, co dostávám jako výsledek.
Princip:
Princip zvýraznění koronárních struktur je asi následující (mnohokrát osvědčená metoda):
každý snímek se rozmázne (ve Photoshopu se to dělá např. radiálním rozostřením, což
podle mne preferuje radiální směry v koróně, což není úplně přesně to, co bychom
potřebovali; já jsme použil mediánový filtr s velikostí buňky 7 pixelů, která se
osvědčila). Získáme snímek, který ukazuje jakési pozadí. Odečtením pozadí od původního
snímku získáme výrazné struktury - tedy koronární paprsky, o které nám jde především.
Tímto způsobem získám sadu koronárních paprsků - každá délka expozice zabere určitou
část z nich, takže kolem slunečního disku vytvoří jakýsi radiální pás - ostatní části
snímku jsou v důsledku odečtu vyhlazeny. Sérii takto získaných struktur posčítáme a tím
vlastně pokryjeme celou nafotografovanou korónu. Protože jsou získané výsledky nekontrastní,
je potřeba je vytáhnout, což znamená aplikaci nějakého filtru na celý obrázek.
Po mnoha pokusech se mi jako nejlepší filtr pro zvýšení kontrastu osvědčil arcusinus.
Před jeho použitím je ale třeba obrázek normovat (tedy jej vydělit maximálním prvkem, protože
arcusinus je definován pouze do jedničky). Samozřejmě filtrační funkci lze měnit zásahem
do zdrojového kódu.
Je jasné, že aby sčítání fungovalo tak, jak má, je zapotřebí, aby všechny obrázky měly
stejný rozměr (použil jsem 550×350 bodú - lze měnit zásahem do zdrojového kódu) a aby se na nich
Slunce vyskytovalo pokaždé na stejném místě a mělo stejný rozměr (ideálně aby bylo uprostřed a
kulaté :-) ). Pokud při pozorování používáte hodinový stroj, tak se vám to zcela jistě podaří
zajistit samo. V opačném případě je nutné snímky vycentrovat. Bohužel tuto proceduru neumím v
IDL napsat a musel jsem to nakonec udělat ručně ve Photoshopu :-(. Bádal jsem nad algoritmem
hledání centra měsíčního disku několik dní a nepřišel jsem zhola na nic. Problém je o to složitější,
že obraz nebude přesně kruhový (záleží na přesnosti skeneru) a krom toho se budou projevovat nejrůznější
světelné jevy. V zásadě ani ve Photoshopu neexistuje žádné jednoznačné řešení, pouze tvrdé manuální
přeměřování souřadnic.
Jak program vypadá?
Jak se tedy ovládá program? Prostředí vypadá zhruba stejně, jako na následujícím obrázku:
Celý proces probíhá interaktivně za spolupráce uživatele. Uživatel rozhoduje, které z obrázků
do sčítání zahrne (tlačítko Add...; načítají se obrázky ve formátu BMP rozměru 550×350
pixelů - jinak je generována chyba programu). Některé detaily dovede již sama od sebe zvýraznit
změna barevné škály (tlačítko Change palette). Po změně palety je nutné obrazovku překreslit
(tlačítko Refresh, které volá proceduru, jež přepočítá všechny snímky a celkový součet - volat
přepočet lze tedy v libovolném okamžiku). Výsledný složený snímek lze uložit ve formátu BMP (
Save as BMP...), GIF (Save as GIF...) nebo vytisknout (Print...).
V okně panelu jsou tři kreslící plochy, z nichž každá má svůj význam - vlevo nahoře je zobrazen
poslední načtený snímek, vpravo nahoře pak z téhož snímku vygenerované pozadí (funkcí median) a
vpravo dole je zobrazen výsledný složený snímek (lze otevřít zvětšený do jiného okna tlačítkem Zoom).
Program lze samozřejmě korektně ukončit stiskem tlačítka Exit.
Jak program funguje?
Programováno pomocí widgetů IDL (generování pomocí editoru IDL).
Celý program je řízen událostmi, které rozlišuje jádro IDL a volá v pravou chvíli příslušné
procedury, které jsou základem celého programu. Jedná se především o proceduru
Prekresli, jejíž hlavní součástí je for cyklus, který pro všechny snímky vypočítá pozadí a
přičte je do výsledného snímku (proměnná Celek), který je dále filtrem (normalizace a aplikace
arcussinu) upraven do výsledného tvaru do proměnné b.
Data jsou uchovávána ve statickém trojrozměrném poli Struktura - první rozměr značí pořadí
obrázku, druhý a třetí pak jejich velikost (pevně 550×350; lze měnit zásahem do zdrojového kódu).
A to je vlastně vše. Ostatní procedury jen odpovídají na volání příslušných událostí (stisky tlačítek)
a zajišťují tak tisk na tiskárně, ukládání výsledku v různých formátech...
Program mnou napsaný je VELMI POMALÝ*pozn., ukládání pomocí statického pole zřejmě není nejlepší volbou, bohužel
programovat v IDL příliš neumím, využíval jsem především znalostí nabitých na přednáškách. Pravdou
je, že bych toho mohl do programu zavést více - volitelná velikost rozměru mediánu, výběr ukládání
a načítání v jiných formátech i rozměrech atd., dokonce jsem se tím pokoušel zabývat (viz zakomentované
řádky ve zdrojovém textu), ale obvykle jsme nad tím strávil odpoledne bez jediného pozitivního výsledku.
Je to můj úplně první program v IDL, tak na to prosím berte alespoň trochu ohled :-).
Ke stažení
Ke stažení jsou k dispozici:
zdrojový text widgetů
zdrojový text eventů
ukázková data
Program je distibuován pod licencí GNU-GPL, nedělám si na něj žádné právní nároky. K jeho spuštění
potřebujete jádro IDL pro Windows verze 5.2 nebo vyšší (po papřičných zásazích ve zdrojovém kódu by
snad mělo fungovat i pod jiným operačním systémem a s jinou verzí, která umí widgety). Přeji vám
hodně úspěchů při vylepšování. :-)
Rychlost programu ovlivnilo několik prohřešků proti filozofii programů v IDL:
- Pracujete s poli 550 x 350 t.j. cca 190 tis. čísel - velice proto záleží na zvoleném typu (Bytarr, Intarr, Fltarr, atd.)
a používání proměnných pro ukládání mezivýsledků, které často ani dále nepotřebujete. (Každá operace navíc vás stojí spoustu času).
- IDL nevyžaduje předem deklarovat proměnné, proto je ani není potřeba před uložením výsledku inicializovat -
uložení nul nebo dokonce posloupnosti čísel vás stojí spoustu zbytečného času (s vyjímkou jestliže zapisujete jen do jejich části).
- Kopírování polí 550 x 350 pomocí For cyklu je to nejhorší (a zbytečné), co z hlediska rychlosti v IDL můžete udělat.
- Úprava velikosti pole pomocí Congrid je opravdu pomalejší než Rebin. Vám je přece jedno jestli pomocí widget interfejsu zobrazujete
pole 200 x 155 nebo 275 x 175, takže raději užívejte Rebin.
- upravený zdrojový text widgetů, upravený zdrojový text eventů
(c) Copyright 2001 by Michal Švanda
http://www.asu.cas.cz/~svanda
svanda@asu.cas.cz
ICQ 56160132