You are on page 1of 9

Milo{ SAVI]

V2M2S: PROGRAM ZA
PREPOZNAVAWE
SUN^EVIH PEGA

V2M2S:Sunspots recognition program


V2M2S is program which recognizes Sunspots and measures their surface.
As entering parameters program uses a picture of the Sun. Mechanism for spots
detection uses algorithm with feedback. Program has been considered as very
efficient and reliable.

Rezime
V2M2S je program koji prepoznaje Sun~eve pege i ra~una wihovu
povr{inu. Kao ulazne parametre program koristi sliku Sunca. Mehanizam za
detekciju pega koristi algoritam sa povratnom spregom. Program se u ovoj
fazi razvoja pokazao kao veoma efikasan i pouzdan.
ASTRONOMIJA

Milo{ Savi} student Fakulteta tehni~kih nauka u Novom Sadu,


Astronomska grupa Dru{tva istra`iva~a “Vladimir Mandi} - Manda”

23
Zbornik radova Broj 16

UVOD
Sun~eve pege su posledica jakih lokalnih magnetnih poqa u fotosferi
Sunca. Temperatura im je ni`a ~ak za 1500 stepeni nego u okolnoj fotosferi.
Neke od wih su vidqive golim okom. Sastoje se od senke i polusenke.
Naj~e{}e se javqaju u grupama. U svakoj grupi se izdvaja pega vodiqa.
@ivotni vek im se kre}e od nekoliko ~asova do nekoliko meseci. Periodi~nu
zavosnost broja pega, a samim tim i periodi~nost sun~eve aktivnosti otkrio je
Rudolf Volf.
Ciq ovog rada jeste da se napravi program koji }e na osnovu fotografije
Sunca detektovati pege i izra~unati wihovu povr{inu. Tako je mogu}e
automatizovati proces prepoznavawa pega i ra~unawa wihove povr{ine i dobiti
efikasan i pouzdan sistem za posmatrawe Sunca, koje se u ovom slu~aju svodi na
fotografisawe.

IMPLEMENTACIJA
Program napisan u skladu sa ovim radom naziva se V2M2S {to je
skra}enica od Vladimir Mandic Manda Sun Spot. Implementiran je u programskom
jeziku C koriste}i ANSI standard pomenutog jezika, tako da je dati program u
potpunosti portabilan. Kao razvojna platforma kori{}en je LINUX operativni
sistem i GNU GCC kompajler. Program se distribuira pod GPL licencom koju
pokriva Open Source Foundation, {to zna~i da se program distribuira sa svojim
kodom.

DIZAJN PROGRAMA
ASTRONOMIJA

Program kao ulazni parametar koristi sliku Sunca, koja je data kao
tekstualna datoteka u kojoj se nalaze intenziteti osvetqnosti svakog piksela. U
toku inicijalizacije programa kreira se dvodimenzionalni niz (matrica) u koju se
unose date osvetqenosti (u daqem tekstu matrica osvetqenosti). Kreira se i
pomo}na matrica koju koristi mehanizam za prepoznavawe pega koja se
inicijalizuje na nultu vrednost. Ta matrica slu`i da se zabele`e mesta na slici
(pikseli) koji su pose~eni i u daqem tekstu zva}emo je matrica pose~enosti.

24
Broj 16 Zbornik radova

Mehanizam za prepoznavawe pega koristi algoritam sa povratnom spregom (engl.


backtrack algoritam), a kao osnovu koristi ~iwenicu da je pega najosvetqeniji deo
u matrici osvetqenosti i da je wena broj~ana vrednost uvek ve}a od nekog
parametra koji se u~itava iz konfiguracionog fajla. Algoritamska {ema
programa zasniva se na obilasku cele matrice osvetqenosti. Ukoliko je element
matrice osvetqenosti po broj~anoj vrednosti ve}i od parametra koji determini{e
najmawu osvetqenost pege i ukoliko je vrednost u matrici pose~enosti za taj
element nula onda je to znak da je program nai{ao na pegu. Tada se poziva pomo}na
funkcija koja na osnovu jednog piksela pege rekonstrui{e celu pegu i vra}a wenu
povr{inu u pikselima. Ta funkcija je rekurzivna i wena algoritamska {ema
izgleda:
int dx[] = {-1, -1, -1, 1, 1, 1, 0, 0};
int dy[] = {-1, 0, 1, -1, 0, 1, -1, 1};

int PrepoznajPegu(x, y, np)


int x, y, np;
{
int i, pov = 0;

slika[x][y] = np;
for (i = 0; i < 8; i++)
if (PripadaPegi(x + dx[i], y + dy[i]))
pov = PrepoznajPegu(x + dx[i], y + dy[i]);
++pov;
return(pov);
}

Ideja rekonstrukcije se zasniva na proveri da li okolni pikseli uo~enog


piksela za koji znamo da pripada pegi pripadaju tako|e pegi. Za kretawe kroz pegu
koriste se dva niza prira{taja, po x i y osi matrice pose~enosti (u tektu
programa matrica pose~enosti se referi{e kao promenqiva slika, a nizovi
prira{taja kao dx i dy). Ukoliko okolni piksel pripada pegi tada se funkcija
poziva rekurzivno za taj piksel. Na taj na~in matrica pose~enosti se popuwava
redom brojevima od 1 do ukupnog broja pega na slici.
Kada se rekonstrui{u sve pege i odredi wihova povr{ina program
generi{e izve{taj u tekstualnu datoteku u kojoj se nalazi broj pega, povr{ina
ASTRONOMIJA

svake od wih izra~ene u procentima od ukupne povr{ine Sunca i ukupna povr{ina


svih pega izra`enih u procentima od ukupne povr{ine Sunca. Ukupna povr{ina
Sunca se ra~una tako {to se prolazi kroz celu matricu osvetqenosti i broje se
pikseli koji imaju osvetqenost ve}u od neke grani~ne. Smatra se da sve one
vrednosti koje su ispod grani~ne ne pripadaju Sun~evom disku i da su deo pozadine
slike. Ta grani~na vrednost se tako|e u~itava iz konfiguracionog fajla.

25
Zbornik radova Broj 16

UPUTSTVO ZA KORI[]EWE PROGRAMA


Program kao ulazne parametre koristi dva tekstualna fajla. Prvi je
konfiguracioni fajl (conf.txt) u kome se redom nalaze numeri~ki podaci koji
predstavqaju veli~inu matrice osvetqenosti po x i y osi, grani~nu vrednost
osvetqenosti za Sun~evu pegu i grani~nu vrednost osvetqenosti za Sun~ev disk.
Drugi je fajl u kome se nalaze podaci koji reprezentuju vrednosti osvetqenosti
svakog piksela koji se u~itavaju u matricu osvetqenosti (slika.txt). Izve{taj se
generi{e u tekstualni fajl koji se zove out.txt. Fajl slika.txt potrebno je napraviti
u nekom od programa za obradu fotografija a najpogodniji za to su Adobe
Photoshop za Windows platformu i GNU Gimp za Linux platformu.

Izvorni kod V2M2S programa:


/*
* v2m2s.c
*
* Program za prepoznavanje Suncevih pega
* Written by (C) Milos Savic
* Under GPL licence
*/

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

int dx[] = {-1, -1, -1, 1, 1, 1, 0, 0};


int dy[] = {-1, 0, 1, -1, 0, 1, -1, 1};
int duzinaX, duzinaY;
int **slika, **pocetnaSlika;
int osvetljenostPege, osvetljenostSunca;

#define MAXPEGA 100


#define FAILED -1

/*
* Alocira memorijski prostor velicine size
ASTRONOMIJA

* Povratna vrednost funkcije je pointer na


* alocirani memorijski prostor
*/
void *AlocirajMemoriju(size)
int size;
{
void *mem;

26
Broj 16 Zbornik radova

mem = malloc(size);
if (!mem) {
printf("Greska u alokaciji memorije\n");
exit(-1);
}
return(mem);
}

/*
* Stampa matricu matrica koja je dimenzija duzx x duzy
* debug funkcija
*/
void StampajMatricu(matrica, duzx, duzy)
int **matrica, duzx, duzy;
{
int i, j;

for (i = 0; i < duzx; i++) {


for (j = 0; j < duzy; j++)
printf("%d ", matrica[i][j]);
putchar('\n');
}
}

/*
* Alocira memoriju za matricu velicine duzx x duzy
* povratna vrednost funkcije je pointer na alociranu matricu
*/
int **AlocirajMatricu(duzx, duzy)
int duzx, duzy;
{
int **matrica, i, j;

/* alociraj memoriju za pointere na pointere */


matrica = (int **) AlocirajMemoriju(sizeof(int *) * duzx);
/* alociraj za svaki pointer niz */
for (i = 0; i < duzx; i++)
matrica[i] = (int *) AlocirajMemoriju(sizeof(int) * duzy);
/* inicijalizuj matricu */
ASTRONOMIJA

for (i = 0; i < duzx; i++)


for (j = 0; j < duzy; j++)
matrica[i][j] = 0;
return(matrica);
}
/*
* proverava da li pixel sa kordinatama x,y pripada pegi
* povratna vrednost TRUE if yes OTHERWISE FALSE

27
Zbornik radova Broj 16

*/
int PripadaPegi(x, y)
int x, y;
{
if (0 <= x && x < duzinaX && 0 <= y && y < duzinaY)
return(pocetnaSlika[x][y] >= osvetljenostPege && slika[x][y] == 0);
else
return(0);
}

/*
* backtrack funkcija koja rekonstruise pegu na kordinati (x,y)
* povratna vrednost funkcije je povrsina pege
*/
int PrepoznajPegu(x, y, np)
int x, y, np;
{
int i, pov = 0;

slika[x][y] = np;
for (i = 0; i < 8; i++)
if (PripadaPegi(x + dx[i], y + dy[i]))
pov = PrepoznajPegu(x + dx[i], y + dy[i]);
++pov;
return(pov);
}

/*
* funkcija prepoznaje sve pege na slici
* i generise izvestaj
*/
void PrepoznajPege()
{
int i, j;
int np = 0;
int povPege[MAXPEGA];
int povrsinaSunca = 0;
FILE *fp;
int upp = 0;
ASTRONOMIJA

printf("Trazim povrsinu sunca...\n");


for (i = 0; i < duzinaX; i++)
for (j = 0; j < duzinaY; j++)
if (pocetnaSlika[i][j] >= osvetljenostSunca)
povrsinaSunca++;
printf("Pocinjem sa procesom prepoznavanja pega...\n");
for (i = 0; i < duzinaX; i++)

28
Broj 16 Zbornik radova

for (j = 0; j < duzinaY; j++)


if (slika[i][j] == 0 && pocetnaSlika[i][j] >= osvetljenostPege) {
povPege[np] = PrepoznajPegu(i, j, np + 1);
np++;
}
printf("Generisem izvestaj...\n");
fp = fopen("out.txt", "w");
if (!fp) {
printf("Ne mogu da otvorim izlaznu datoteku\n");
exit(FAILED);
}
fprintf(fp, "Broj pega: %d\n", np);
fprintf(fp, "======================\n");
for (i = 0; i < np; i++) {
fprintf(fp, "Pega no. %d: povrsina %d procenata\n",
i + 1, povPege[i] * 100 / povrsinaSunca);
upp += povPege[i] * 100 / povrsinaSunca;
}
fprintf(fp, "\n\nUkupna povrsina pega %d procenata\n", upp);
fclose(fp);
printf("Izvestaj generisan u datoteci out.txt\n");
}

/*
* Funkcija inicijalizuje globalne promenljive iz konfiguracionog fajla
* ucitava sliku i inicijalizuje matricu posecenosti
*/
void Inicijalizacija(void)
{
FILE *fp;
int i, j;

fp = fopen("conf.txt", "r");
if (!fp) {
printf("Ne moze se otvoriti konfiguracioni fajl\n");
exit(FAILED);
}
fscanf(fp, "%d %d %d %d", &duzinaX, &duzinaY, &osvetljenostPege,
&osvetljenostSunca);
fclose(fp);
ASTRONOMIJA

pocetnaSlika = AlocirajMatricu(duzinaX, duzinaY);


slika = AlocirajMatricu(duzinaX, duzinaY);
fp = fopen("slika.txt", "r");
if (!fp) {
printf("Ne moze se otvoriti fajl sa slikom\n");
exit(FAILED);
}

29
Zbornik radova Broj 16

for (i = 0; i < duzinaX; i++)


for (j = 0; j < duzinaY; j++)
fscanf(fp, "%d", &pocetnaSlika[i][j]);
fclose(fp);
}

int main()
{
printf("V2M2S: program za prepoznavanje pega na Suncu\n");
printf("Written by (C) Milos Savic <ms26403@yahoo.com>\n");
Inicijalizacija();
PrepoznajPege();
}

ZAKQU^AK
U ovom radu opisali smo kqu~ne aspekte u razradi jednog programa za
prepoznavawe pega na Suncu na osnovu fotografija. Postigli smo da se proces
prepoznavawa pega automatizuje {to omogu}ava veoma brzu i efikasnu, ali {to je
jo{ va`nije ta~niju detekciju i merewe povr{ina pega. Ovakva metoda puno je
boqa od metode projekcije lika Sunca na papir kroz teleskop. Eventualni
nedostaci mogu se pripisati samo kvalitetu fotografija koje koristimo kao
ulazni parametar. Program se u ovoj fazi implementacije pokazao kao veoma
upotrebqiv i daqe modifikacije programa svodi}e se samo na poboq{awe
mehanizma za prepoznavawe pega i evenutualnom prelasku sa backtrack rekurzivne
algoritamske {eme na nerekurzivnu algoritamsku {emu kori{}ewem dinami~kog
programirawa.

ZAHVALNICA
Zahvaqujem se Branislavu Savi}u Savanu koji je dao ideju za pisawe ovog
programa.
ASTRONOMIJA

30
Broj 16 Zbornik radova

LITERATURA

[1] Jovi} O. 2003. Aktivnost Sunca u 1999. i 2000. godini. Zbornik


radova, 15. Dru{tvo istra`iva~a ''Vladimir Mandi} - Manda'',
Vaqevo
[2] Kernighan B., Ritchie D. 1989. Programski jezik C. Savremena
administracija, Beograd

ASTRONOMIJA

31

Rate