Program Za Prepoznavanje Suncevih Pega

  • August 2019
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Program Za Prepoznavanje Suncevih Pega as PDF for free.

More details

  • Words: 1,706
  • Pages: 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.

ASTRONOMIJA

DIZAJN PROGRAMA 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); }

25

ASTRONOMIJA

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

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

ASTRONOMIJA

#define MAXPEGA 100 #define FAILED -1 /* * Alocira memorijski prostor velicine size * 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;

ASTRONOMIJA

/* 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 */ 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 */ 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); }

ASTRONOMIJA

/* * 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; 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

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;

ASTRONOMIJA

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); 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 <[email protected]>\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

ASTRONOMIJA

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

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

Related Documents

Pega Monstros
May 2020 3
Pega Varetas.resol
November 2019 12
Za
June 2020 47