You are on page 1of 60

UNIVERSITATEA BUCUREŞTI

FACULTATEA DE MATEMATICĂ ŞI INFORMATICĂ


SPECIALIZAREA INFORMATICĂ

Aplicaţie a dimensiunii fractale

LUCRARE DE LICENŢĂ

Coordonator Absolvent
Conf.dr.Liviu Dinu Conăcel Elena-Cristina
Abstract
Lumea noastră este infinit de complexă din punct de vedere vizual. Geometria frac-
tală este prima limbă convingătoare a complexităţii vizuale; ne oferă un vocabular
potent pentru formele complexe. Prin geometria fractală putem descrie comple-
xităţi haotice ı̂n simple ecuaţii. Studiul de faţa incearcă să coreleze complexitatea
vizuală cu percepţia frumuseţii prin intermediul dimensiunii fractale. Măsurarea
este aplicată asupra reprezentanţilor expresionismul abstract, ı̂n ı̂ncercarea de a co-
rela şi unifica conceptele ce definesc complexitatea vizuală şi percepţia frumuseţii.

2
Cuprins

1 Prezentare generală 5
1.1 Motivarea alegerii temei . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2 Problematica tratată . . . . . . . . . . . . . . . . . . . . . . . . . . 8

2 Fractali 10
2.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.2 Dimensiune fractală . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.2.2 Dimensiunea Hausdorff . . . . . . . . . . . . . . . . . . . . . 11
2.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.4 Rezumat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15

3 Modelare procedurală 16
3.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.2 Algoritm grayscale . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3 Detecţia de margini . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.1 Detecţia de margini prin histerezis . . . . . . . . . . . . . . 20
3.4 Corelarea datelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
3.5 Box-counting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24

4 Motivarea alegerii mediilor de programare utilizate 29


4.1 Introducere in limbajul de programare Java . . . . . . . . . . . . . 29
4.1.1 Platforma Java . . . . . . . . . . . . . . . . . . . . . . . . . 30
4.1.2 Limbajul Java . . . . . . . . . . . . . . . . . . . . . . . . . . 31
4.1.3 Rezumat . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
4.2 Librarii folosite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.1 Introducere . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.2 java.util . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.3 java.imageio . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.2.4 java.awt . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37

3
4.2.5 java.swing . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38

5 Descrierea aplicaţiei 40

6 Interpretarea rezultatelor 44
6.1 Rezultate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
6.2 Analiză şi interpretare . . . . . . . . . . . . . . . . . . . . . . . . . 44

7 Concluzii 50

8 Anexe 51
8.1 Realizarea graficelor . . . . . . . . . . . . . . . . . . . . . . . . . . 51
8.2 Realizarea interfeţei . . . . . . . . . . . . . . . . . . . . . . . . . . . 54

4
Capitolul 1

Prezentare generală

1.1 Motivarea alegerii temei


Judecata estetică este un dimeniu de interes universal, ı̂n sensul ı̂n care poate
ajuta la ı̂nţelegerea unor concepte geenrale ce determină lucrurile pe care le găsim
plăcute şi le căutăm. În lucrarea de faţa ı̂ncerc să determin, prin mijloace informa-
tice, media şi pragul complexităţii vizuale ı̂n pictură. Pornind de la informa’c tii
deja existente ce plasează complexitatea ideală ı̂n jurul numărului 1.54 (conform
Sprott, 1996), am aplicat măsurătoarea necesară ı̂n domeniul expresioniştilor, un
domeniu ı̂ncă necercetat, din cunoştinţele noastre. Rezultatele obţinute nu sunt
total intuitive doarece numărul preponderent asociat operelor, şi anume de 1.8
depăşeste aşeptările. Această mărime este concludentă pentru curentul analizat,
dar şi pictură ı̂n general, deoarce oferă informaţii legate de specificitatea şi orienta-
rea artei. Mai exact, este o dovadă a separării picturii abstracte de cea tradiţională,
păstrând-o totuşi ı̂n aria ce o face general apreciată.

Aprecierea artei este cu siguranţa un domeniu foarte subiectiv şi personal.


Stând ı̂n faţa unei picturi de Pollock sau Giacometti şi urmărind modelele dense
create de imaginar, nimeni nu poate pre-determina dacă acesta va fi plăcut sau
nu. Un computer calculează parametrii vizualului cu totul diferit faţa de un obser-
vator uman. Oamenii observă toţi parametrii unui tablou concomitent (mărimea,
culoaream complexitatea, textura), aceştia având un impact total. În schimb, in-
formatizând procesul, se relevă o metodă reducţionistă - ce separă informaţia şi
calculează fiecare parametru izolat. În consecinţă, deşi o analiză computerizată
nu va putea spune dacă o operă va fi plăcută sau nu, poate spune care sunt mode-
lele cu precizie. În czul de faţa, aceasta este realizată prin dimensiunea fractală,
cuantificare a complexităţii vizuale, oferind o nouă perspectivă asupra ce este con-

5
siderat frumos.
Complexitatea vizuală a fost mereu un factor predictor al preferinţelor pentru
lucrările de natură artistică. Diferite studii examinează măsura ı̂n care complexi-
tatea artelor poate fi previzibilă din punct de vedere automatizat.Actualul studiu
trateaza modalitatea ı̂n care dimensiunea fractală este o măsură a judecăţilor de
percepere a frumuseţii şi o legatură directă cu procesul de creaţie.

Ipoteza ı̂n care aplicabilitatea unei legi matematice se poate extinde la o


corelaţie ı̂ntre percepţia timpului, complexităţii şi atractivităţii subiective este
ı̂n primul rând confirmată de proprietăţile dinamice asemanătoare fractalilor ale
naturii ı̂nconjurătoare(conform Mandelbrot, 1992). În perioada anilor 60, cer-
cetătorii au ı̂nceput să examineze cum sistemele naturale, ca de exemplu, vremea,
se schimbă ı̂n timp. Descoperirile au arătat că aceste sisteme nu sunt guvernate
de legi ale hazardului, ci au un substrat compus din foarte subtile forme de ordine.
Prima etichetă a fost cea de haos, iar un nou domeniu a dezvoltat teoria haosului
pentru a explica dinamica naturii. Apoi, ı̂n anii 70, o nouă formă a geometriei
s-a creat pentru a descrie modelele pe care procesele haotice le lasă ı̂n urmă. Cu
numele de fractali, dat de descoperitorul lor, Benoit Mandelbrot, noile forme erau
complet diferite de formele euclidiane. Contrastând cu liniile artificiale, fracta-
lii consistă din modele ce reapar la nivele din ce in ce mai mici de magnificaţie,
creând forme de complexitate imensă. Se construieşte astfel o nouă modalitate de
a gândi ce se bazează pe o vedere intuitivă a lumii ı̂nconjurătoare, ı̂n care ordinea
este o replicare a simetriilor, ı̂ncoporând nepredictibilităţi şi asimetrii, simulând
ambiguitatea contrariilor.

Această teorie ar putea prezenta importanţă culturală, ı̂n sensul ı̂n care ea sub-
liniază că arta şi ştiinţa nu sunt componente separate ale unei culturii, ci se află ı̂n
stransa dependenţa(Marcus, 1982). Putem concepe, ı̂n consens cu teoria haosului,
dinamica nelianiară complexă a proceselor culturale ca pe un sistem fluid interac-
tiv, ı̂n care fiecare disciplină contribuie cu propriul flux, iar ideile interacţionează
şi se influenţează reciproc. Un asemenea univers se poate auto-ordona, iar evoluţia
sa apare ca o formă de cooperare şi coordonare a componentelor interactive.

Abordarea holistică a modului de ı̂ntelegere a procesului de creaţie presu-


pune o mutaţie de la modelul linear, simplist, mecanist la unul conformist ı̂n care
fluctuaţiile sunt stări de normalitate corespunzătoare stărilor de ordine ascunse ı̂n
haos. În acest sens, se poate spune că nu există diferenţe notabile ı̂ntre experienţele
creatoare din lumea artei şi lumea ştiinţei, ı̂n afară de evaluare. Modelul de evoluţie

6
a activităţii creatorului unei opere de artă urmează un curs propriu, individual,
asemănător unui sistem dinamic neliniar complex. La fel cum prin bifurcaţii şi
salturi, un sistem ı̂ncearcă să ajungă la o stare de echiliru, munca artistului poate
să evidenţieze fluctuaţii ı̂n concentrare, salturi peste etape, pendulări ı̂ntre 2 etape
sau revenire la etape anterioare. Privind procesul de creaţie ca un proces haotic,
este posibil să descoperim şi modul ı̂n care acesta se combină cu alte activităţi.
Arta aduce la o distanţă măsurabila inventivitatea umană, ı̂n raport cu creşterea
organică, deoarece, cel puţin pentru moment, voinţa omului pare să se identifice
cu forţele universale ale universului(conform Marcus, 1982).

Estetica experimentală are o istorie lungă. De exemplu, tatăl lui Galileo a


efectuat experimente legate de estetica intervalelor de muzica, ı̂n 1588, ı̂n funcţie
de diferite scări muzicale şi sincronizări. Gustav Fechner a fost primul care a
ı̂nceput investigaţiile serioase ı̂n acest domeniu, pornind de la dreptiunghiul de
aur, ı̂n 1876. În 1933, George David Birkhoff, unul dintre primii matematicieni
americani notabili, a sugerat o formulă pentru complexitatea imaginii şi a propus-o
ca o măsură a esteticii. Iar ı̂n 1938, Rashevsky, fondatorul biologiei matematice,
a sugerat o conexiune ı̂ntre estetică şi neuropsihologie. Munca lui Mandelbrot a
adus deasemenea atenţia asupra relaţiei dintre fractalii matematici şi sistemele
dinamice ı̂n domeniul esteticii.

Baza esteticii fractalice a ı̂nceput cu studiile lui Clint Sprott. Acesta a propus
dimensiunea fractală ca măsură a complexităţii unei imagini fractalice, şi a exa-
minat relaţia sa cu percepţia estetică. Articolul său din 1994, arată o preferinţă
generală ce culminează ı̂n jurul dimensiunii de 1.51 pentru sisteme de funcţii ite-
rate, ı̂n spaţial 2D, prin calculul mediei dimensiunii a 76 de imagini notate cu
5, pe o scara de la 1 la 5. Experimentul a fost extins de Aks si Sprott ı̂n 1996,
măsurând judecăţile vizând estetica a 24 de subiecţi cărora le sunt prezentate 324
de imagini fractalice; şi de Fred Abraham ı̂n 2001, respective Mitina şi Abraham
ı̂n 2003, aceştia din urmă măsurând răspunsul a 18 subiecţi ı̂n faţa a 16 imagini.
Rezultatele au arătat o preferinţa pentru dimensiunea de 1.54, ı̂n faţa celei de
0.59, 1.07 si 2.27.

Lucrarea de faţă ı̂şi propune să computerizeze dimensiunea fractală, având ca


bază algoritmul lui Sprott. Ipotezele premergătoare vor fi testate prin aplicarea
algoritmului pe o serie de picturi abstracte celebre, ce au dat naştere la dezbateri
şi controverse legate de estetica şi percepţia lor de către public.

7
1.2 Problematica tratată
Pictura, la fel ca restul artelor vizuale, creaţia plastică şi arhitectura, designul,
grafica de calculator şi estetica, este potenţial beneficiară a unui mod de a privi
structura sa ı̂ntr-o alcătuire ascunsă, de a-i descoperi libertăţile şi restricţiile, re-
gulile de funcţionare şi izomorfismul lor cu universal biologic şi uman.

O practică milenară umană a dezvăluit sincretismul complex al universului


artistic, ı̂n care proprietăţile matematice sunt ı̂n strânsă corelaţie cu efectul artis-
tic. Astfel, se poate discuta de descoperiri făcute ı̂n urmă cu secole, ca reapariţia
şirului lui Fibonacci ı̂n natură şi cele mai simple structuri ce dau aparenţa ordinii
şi frumuseţii, sau descoperiri mai recente, ca regulile morfologice ale eredităţii.

Una dintre principalele discuţii ce probabil sunt lipsite de finalitate, este legată
de măsura ı̂n care creatorii s-au ı̂ndreptat instinctiv spre anumite regularităţi mate-
matice sau le-au ales deliberat. Psihologia experimentală a demonstrat ı̂nclinarea
oamenilor spre a alege structuri bazate pe reguli simple, generale, prezente la mai
multe nivele de organizare ale universului. Artistul devine din ce ı̂n ce mai mult
dublat de un cercetător ştiinţific, şi ı̂n ciuda faptului că s-a teoretizat şi s-a pledat
pentru menţinerea unui statut esenţial distinct al artei, trebuie acceptată reali-
tatea, conform căreia graniţele dintre ştiinţă şi artă nu mai este atât de clare pe
cât se părea ı̂ntr-o reprezentare idealizată. Evoluţia culturii reface astfel, la nivel
superior, o situaţie care era dominantă ı̂n perioada Antichităţii sau Renaşterii .

Artistul supune cu un scop determinat proprietăţile materiei, transformând-o


ı̂n limbaj, prin proiectarea asupra sa a funcţiunilor fundamentale ale limbajului
articulat. Era nevoie de descoperirea unor procedee care să permită să se stabi-
lească, pentru o structură vizuală discretă, posibilitatea parcurgerii sale ı̂ntr-un
mod organizat.
Procesele de cuantificare şi convergenţă sunt simptomatice pentru modul ı̂n
care arta modernă dezvoltă o tendinţă generală de diminuare a funcţiilor metafo-
rice şi augmentare a funcţiei simbolice. Brâncuşi spunea despre opera sa : Ceea
ce ei numesc abstract, este de fapt foarte realist, fiindcă ceea ce e real nu e ex-
terior, ci idea, esenţa lucrurilor. Arta modernă este mai puţin preocupată de a
simula realitatea existentă, obsesia ei e mai degrabă instaurarea unei noi realităţi,
a cărei relaţie cu realitatea contingentă devine din ce ı̂n ce mai indirectă şi mai
profundă . De la mimesis la simbol, arta s-a esenţializat, a străbătut un proces de
abstractizare, sinesteziile pe care ea se bazează sunt din ce ı̂n ce mai sofisticate.

8
În concluzie, lucrarea de faţa incearcă sa argumenteze că viziunea matematică
oferă o perspectivă mai clară a viziunii artistice a creatorilor, explicând ı̂ntr-o anu-
mită măsură procesul de creaţie, prin reguli ce par sa ordoneze haosul din spatele
trăirilor, percepţiilor şi să aducă la un nivel tangibil raportul dintre reproducerea
realităţii şi instaurarea unei noi ordini.

Structura lucrării conţine descrierea elementelor necesare pentru determinarea


algoritmilor de lucru, dezvoltarea aplicaţiei şi interpretarea rezultatelor. Capitolul
1 descrie motivarea generală generală a alegerii temei şi ı̂ncadrarea acesteia ı̂ntr-
un curent mai larg de semiotică vizuală, ı̂mpreună cu rezultatele existente deja
din studii anterioare legate de dimensiunea fractală. Capitolul 2 face trecerea la
noţiunile teoretice folosite. Este descris conceptul de fractal şi dimensiune frac-
tală, şi sunt oferite explicaţii legate de utilitatea acestei dimensiuni, ı̂n comparaţie
cu cea topologică şi vis-a-vis de formele naturale. Se realizează o descriere deta-
liată a elementelor ce determină complexitatea vizuală, ı̂mpreună cu exemple din
natură. Capitolul 3 prezintă algoritmii ce fac posibilă măsurătoarea dimensiunii
fractale. Se prezintă procedural paşii necesari procesului de analiză a imaginii şi
interpretare a rezultatelor. Capitolul 4 descrie modul de programare folosit. Se
dau detalii clare despre platforma şi funcţiile folosite, ı̂mpreuna cu librării afe-
rente necesare. În capitolul 5 este prezentată aplicaţia ce permite utilizatorului să
utilizeze funcţiile descrise ı̂n capitolele anterioare , oferind o interfaţă grafică ce
o face uşor de folosit. Capitolul 6 face analiza şi interpretarea rezultatelor. Sunt
prezentate dimensiunile fractale pentru operele selectate din cadrul curentului ex-
presionist şi sunt corelate, oferind explicaţii despre posibilele informaţii şi direcţii
ce rezultă de aici. Capitolul 7 oferă concluziile licenţei, arătând rezultatul şi uti-
litatea ei. Anexe şi materiale auxiliare se găsesc ı̂n interiorul anexelor.

9
Capitolul 2

Fractali

2.1 Introducere
Ce este un fractal ? Un fractal este ”o figură geometrică fragmentată sau frântă
care poate fi divizată ı̂n părţi, astfel ı̂ncât fiecare dintre acestea să fie (cel puţin
aproximativ) o copie miniaturală a ı̂ntregului”. Termenul a fost introdus de Benoit
Mandelbrot ı̂n 1975 şi este derivat din latinescul fractus, ı̂nsemnând ”spart” sau
”fracturat”.
Cuvântul ”fractal” denotă o formă ce este construită recursiv sau auto-similară,
mai exact, o formă ce denotă similaritate la toate scările de magnificaţie şi este de
aceea caracterizată ca ”infinit complexă”. Fractalii prezintă detalii la toate scările,
de la foarte mic la foarte mare, de aceea pot avea o formă prea neregulată pentru
a fi descrisă ı̂n limbajul geometriei euclidiene. La nivel local şi global este ı̂n gene-
ral autosimilar (autosimilaritate exactă, quasi-autosimilaritate, şi autosimilaritate
stocastică), şi autoafin (proprietatea geometrică ce atestă invarianţa la scalare).
Câteva exemple sunt:

1. Setul Cantor

2. Sierpinski

3. Curba lui Koch: construcţia sa vizuală poate fi imaginată ca un segment ce


suferă recursiv următoarele alteraţii:
a. diviziunea segmentului ı̂n 3 segmente de lungimi egale.
b. trasarea unui triunghi echilateral ce are segmentul de mijloc din pasul 1
ca bază.
c. ştergerea segmentului ce reprezintă baza triunghiului de la pasul 2.

10
Curba lui Koch reprezintă forma ce se formează atunci când numărul iteraţiilor
paşilor descrişi tinde la infinit.

4. Setul lui Mandelbrot:


Exemple de aproximări fractalice se găsesc ı̂n natura cu uşurinţa. Aceste
obiecte reflectă proprietaţi de structura auto-similară la o scară extinsă, dar
finită. Exemplele includ norii, fulgii de nea, munţii, reţele hidrografice, sis-
temul vascular şi faimosul exemplu

5. Coasta Marii Britanii

2.2 Dimensiune fractală


2.2.1 Introducere
O dimensiune topologică defineşte diferenţa de bază ı̂ntre seturi topologice ”ı̂nrudite”.
În ı̂ncercarea de a găsi o dimensiune topologică, se pot intâlni mai multe obstacole:
spre deosebire de un spaţiu vectorial, nu poţi determina dimensiunea ca maximum
de vectori liniar independenţi.
De aceea, pentru a găsi o definiţie intuitivă a unei dimensiuni topologice trebuie
căutate diferite proprietăţi ce au aceleaşi efecte ca dimensiunea geometrică.

Un exemplu cheie de ı̂nţelegere a dimensiunii fractale ı̂l reprezintă setul Can-


tor. Acesta are dimensiunea topologică zero, dar totuşi, are aceeaşi cardinalitate
ca o linie reală - ı̂n acest sens aşteptându-ne ca dimensiunea sa să fie 1. Dar setul
lui Cantor nu are intervale ı̂n interiorul său, astfel denotând o dimensiune egală
cu zero.

Răspunsul stă atunci undeva la mijloc. Dimensiunea setului Cantor ar trebui


să aibă dimensiunea mai mare ca zero, dar mai mică decât unu.

2.2.2 Dimensiunea Hausdorff


Introducere

Dimensiunile topologice cunoscute, ca de exemplu dimeniunea Lebesgue, ne oferă


o noţiune ı̂n ceea ce priveşte o dimensiune geometrică pentru un spaţiu topologic.
Aşa cum este de aşteptat, dimensiunea topologică a lui Rn este n. Dar există

11
seturi topologice pentru care dimensiunile topologice pot părea naive.

În acest scop a fost inventată dimensiunea fractală. Dimensiunile topologice


au fost construite pe câteva noţiuni topologice, ca aceea că limita unui spaţiu are
o dimeniune mai mică decât 1. Dimensiunea Hausdorff (dimensiunea fractală)
se bazează pe o noţiune diferită, necaracteristică topologiei(conform Engelking,
1978).

Ne vom uita ı̂n continuare la Rn pentru a observa altă trasătură ce implică


dimensiunea geometrică, pentru a ı̂nţelege dimensiunea Hausdorff. Dacă ne ima-
ginăm un patrăt ı̂n R2 cu latura de 1, aria sa va fi, de asemenea 1. Dacă magnificăm
şi comparăm cele 2 pătrate:
log(Arie)
Magnificare Latura aria Factorul: log(Latura)
1 1 1 -
2 2 4 2
3 3 9 2
4 4 16 2

Tabela 2.1

Dacă luăm un cub in R3 cu latura de lungime 1, volumul este deasemenea 1.


Dacă magnificăm, obţinem următoarele rezultate:

log(Arie)
Magnificare Latura aria Factorul: log(Latura)
1 1 1 -
2 2 8 3
3 3 27 3
4 4 64 3

Tabela 2.2

Mai general, dacă luăm un cub I n , si magnificăm spaţiul de k ori, cubul va


creşte de k n ori.
Acesta este un alt efect al dimensiunii geometrice. Definiţia dimensiunii Haus-
dorff este bazată pe această noţiune legată de dimensiune. Din aceste considerente
este nevoie de o metrică (pentru a măsura creşterea spaţiului ). Această dimen-
siune oferă rezultatele dorite pentru fractali, după cum vom demonstra, dar mai
ı̂ntâi este nevoie de o formalizare a definiţiei.

12
În 1919, matematicianul Hausdorff, a introdus o noua dimensiune, dimensiu-
nea fractală. Aceasta dimensiune măsoară numărul de diametre mai mici necesare
pentru a acoperi o figură. Dacă acest număr este intreg, atunci dimensiunea este
topologică, altfel, dimensiunea este fractală.

Besicovitch, dezvoltând lucrările anterioare ale lui Hausdorff, a afirmat că for-
mele ar putea avea ı̂ntr-adevăr dimensiuni fracţionare cum ar fi 1,3 sau 2,5. Curbe
precum cele ale lui Sierpinski şi ale lui Koch ar putea fi explicate cu ajutorul aces-
tei dimensiuni.

În mod concret, dimensiunea Hausdorff/Besicovitch este definită prin rapor-


tul dintre logaritmul numărului de copii şi logaritmul mărimii seminţei cores-
punzătoare unei copii.

Definiţie formală

Dimensiunea Hausdorff este definită doar pentru spaţii metrice, folosind concepte
la lungime şi volum, ce necesită o metrică.

Definitie 1. Fie X o metrica şi C o colectie de sub-seturi. Atunci norma lui C


este
norm(C) = sup{diam(B) : B ∈ C}.

Definiţia dimensiunii Hausdorff este dată folosind o măsură a spaţiului, deci


vom defini ı̂n primul rând măsura Hausdorff.

Definitie 2. Fie A subset al lui X. Atunci Hd (A, e) = inf { diam(Bi )d : C =


P

{Bi }, norm(C) < e}, unde C este o acoperire numărabilă a lui A.

Încercăm să folosim o noţiune geomtrică pentru a defini o noua dimensiune.


P
Suma diam(Bi ) poate fi gândită ca ”mărimea” unui segment 1 − d ı̂n spaţiu.
diam(Bi )d este volumul numărului de cuburi d-dimensionale necesare
P
Suma
pentru a acoperi spaţiul.
Pentru a putea folosi Hd cu uşurinţa, definim măsura:

Definitie 3. P-dimensiunea Hausdorff Md este Md (A) = sup{Hd (A, e)}.

Observatie 1. a < b ⇔ Hd (A, a) ≥ Hd (A, b), de aceea Md (A) = lime→0 (A, e).

Această măsură ne spune ”volumul” lui A dacă ar fi ı̂ntr-un spaţiu d-dimensional.

13
Definitie 4. Dimensiunea Hausdorff a lui A este

dimH (A) = sup{d : 0 < Md (A) < ∞}.

Observatie 2. Dacă p ≤ d, atunci Mp (A) ≥ Md (A).

Definiţia este naturală, dimensiunea lui A fiind cea mai mare dimensiune pentru
care volumul lui A este finit.

Teorema 1. Dacă 0 < Md (A) < ∞ atunci dimH (A) = d.

Demonstratie. Arătăm ı̂n primul rând că dacă p < d, atunci Mp (A) = ∞. Md (A) >
0 ⇒ există 1 > δ > 0, t > 0 astfel ı̂ncât Hd (A, δ) = t, din definiţia lui Hd .
Iar prin definiţie, pentru orice e < σ avem Hd (A, e) ≤ t. Alegem e astfel ı̂ncât
ed−p < Nt ; e < δ, unde N este un număr arbitrar. Fie C = {Bi }, cu norm(C) < e.
Amintim că x < y ⇔ x−1 > y −1 .
diam(Bi )p = diam(Bi )p−d diam(Bi )d ≥ ep−d diam(Bi )d ≥
P P P

ep−d Hd (A, e) ≥ Nt = N.
diam(Bi )p nu converge, pentru orice
P
Pentru orice n, există un e astfel ı̂ncât
set C, cu norm(C) ≤ e. Rezultă că Mp (A) = lime→0 Hd (A, e) = ∞.
Atunci, dacă d < p, din demonstraţia anterioară rezultă că Md (A) = ∞,
contrazicând presupunerea.
Rezultă că demonstraţia este completă.

2.3 Exemple
Pentru fractali simpli, dimensiunea se poate calcula cu uşurinţă folosind noţiunea
geometrică a dimensiunii Hausdorff. Dimensiunea este intuitivă: raportul dintre
magnificare şi numărul de parţi auto-similare după magnificare log(partiauto−similare)
log(magnif icare)
.
Să luăm de exemplu setul Cantor:

Magnificare Numărul de parţi auto-similare Factorul: log(partiauto−similare)


log(magnif icare)
1 1 -
3 2 0.630929754
9 4 0.630929754

Tabela 2.3

log(N ) log(2)
d= =⇒ d = = 0.63.
log(r) log(3)

14
Putem observa că măsura setului lui Cantor este ı̂ntre un punct (dimensiune
0) şi o dreaptă (dimensiune 1), aşa cum era de aşteptat.

Un alt exemplu este curba lui Koch. Putem observa că lungimea curbei creşte
la fiecare iteraţie, având lungime infinită. Calculând dimensiunea Hausdorff pentru
aceasta obţinem:
log(N ) log(4)
d= =⇒ d = = 1.26.
log(r) log(3)

2.4 Rezumat
Cele demonstrate anterior sunt logice ı̂n sensul ı̂n care pentru a acoperi un pătrat
(o formă geometrică bidimensioanală) cu linii (o formă geometrică unidimensio-
nală) avem nevoie de o infinitate de linii. Aşa cum am mai spus, măsura ne dă un
”volum” al setului. Dacă dimensiunea este d, atunci, dacă incercăm să măsurăm
un set A cu o dimensiune p < d atunci volumul său p-dimensional va fi ∞. Ul-
tima teoremă ne ajută ı̂n determinarea măsurii unui spaţiu. Atunci când găsim o
măsură Hausdorff d care nu este 0 inseamnă că am găsit dimensiunea căutată.

Din punct de vedere vizual, acest concept ne oferă un cursor continuu pentru
complexitatea vizuală a unui fractal. Partea ı̂ntreagă din dimensiunea fractală,
adică 2 spre exemplu, ne arată ı̂n ce dimensiune euclidiană se află fractalul. Iar
partea fracţionară, de exemplu ,3 din 2,3, se numete incrementul fractalic. În
esenţă, cu cât acest increment creşte, fractalul ocupă local din ce ı̂n ce mai mult
din dimensiunea euclidiană ı̂n care se află, spre exemplu un plan, spre ocuparea
locală a unei pări din dimensiunea euclidiană imediat următoare, adică spaţiu.

Pentru a explica de ce folosesc cuvântul local ı̂n exemplul de mai sus, ofer
următorul exemplu: chiar dacă o minge este un obiect tridimensional, suprafaţa
sa nu este, iar cu cât mărim sau cu cât facem zoom pe acea suprafaţă, ea devine
local planară. Deci ı̂n principiu o suprafaţă nu trebuie să fie neapărat un plan
euclidian plat pentru a avea o dimensiune fractală de 2.0, şi nici nu trebuie să
ocupe toate cele trei dimensiuni pentru a avea o dimensiune fractală de 3.0.
Principala atracţie a geometriei fractale stă ı̂n abilitatea acesteia de a descrie
formele iregulate sau fragmentate ce nu pot fi analizate cu geometria clasică eu-
clidiană. Conceptul oferă o modalitate de scalare a sistemelor din planul real şi
oferă o interpretare geometrică relativ simplă şi uşor de manipulat prin tehnici
matematice.

15
Capitolul 3

Modelare procedurală

3.1 Introducere
Pentru a computeriza metoda de determinare a dimensiunii Hausdorff se foloseşte
următorul algoritm ce conţine etapele:

• se citeste imaginea originală şi se procesează până la o formă binară;

• se aplică procedura de determinare a marginilor pentru a selecta zona de


analiză;

• se determină punctele curbei ”log-log”;

• se asociază dreapta corespunzătoare punctelor obţinute şi se calculează panta;

• se determină dimensiunea fractală;

3.2 Algoritm grayscale


Prima parte a implementării o reprezintă transformarea imaginii pe care se va lucra
ı̂n una grayscale. Pentru aceasta este necesar un algoritm ce urmează următorii
paşi:

• se iau valorile fundamentale de roşu, verde şi albastru ale fiecărui pixel;

• se foloseşte o formulă matematică pentru a transforma aceste numere ı̂ntr-o


singură valoare;

• se ı̂nlocuiesc valorile originale de roşu, verde şi albastru cu valoarea obţinută


de gri.

16
Metoda cea mai comună de conversie la grayscale este folosirea mediei. Astfel,
nuanţă de gri reprezintă media aritmetică a valorilor de roşu, verde şi albastru.
Formula este simplă şi rapidă şi produce rezultate rezonabile, dar are şi dezavan-
taje. Principalul dezavantaj este că nu reprezintă optim nuanţele de gri relativ la
percepţia umană a luminozităţii. De aceea, este nevoie de o formulă puţin mai
complexă, ı̂n care valoarea nuanţei de gri se calculează astfel:

gray = (Red ∗ 0.299 + Green ∗ 0.587 + Blue ∗ 0.114)

Algoritmul ţine cont de faptul că retina umană nu este uniformă pentru toate
culorile. Oamenii percep culoarea verde mai intens decât roşu, iar culoarea roşie
mai intens decât pe cea albastră. Formula de mai sus tratează fiecare culoare ı̂n
parte, aşa cum este percepută de retina umană.
Împlementarea algoritmului din cadrul aplicaţiei este prezentat ı̂n continuare:

1 // f u n c t i a de d e t e r m i n a r e a n u a n t e i de g r i
2 private int luminance ( int r , int g , int b ) {
3 return ( int ) Math . round ( 0 . 2 9 9 ∗ r + 0 . 5 8 7 ∗ g + 0 . 1 1 4 ∗ b ) ;
4 }
5 // p r o c e s a r e a i m a g i n i i p i x e l cu p i x e l
6 private void readLuminance ( ) {
7 int alpha , red , green , blue , gray ;
8 int g r a y P i x e l ;
9 f or ( int i = 0 ; i < width ; i ++)
10 f or ( int j = 0 ; j < h e i g h t ; j ++)
11 {
12 a l p h a = new C o l o r ( s o u r c e I m a g e . getRGB ( i , j ) ) . getAlpha ( ) ;
13 r e d = new C o l o r ( s o u r c e I m a g e . getRGB ( i , j ) ) . getRed ( ) ;
14 g r e e n = new C o l o r ( s o u r c e I m a g e . getRGB ( i , j ) ) . getGreen ( ) ;
15 b l u e = new C o l o r ( s o u r c e I m a g e . getRGB ( i , j ) ) . g e t B l u e ( ) ;
16
17 gray = luminance ( red , green , b l u e ) ;
18
19 g r a y P i x e l = new C o l o r ( gray , gray , gray ) . getRGB ( ) ;
20 g r a y s c a l e I m a g e . setRGB ( i , j , g r a y P i x e l ) ;
21 }
22 }

17
3.3 Detecţia de margini
Detecţia marginilor este numele dat unui set de metode matematice ce ţintesc
spre a defini punctele dintr-o imagine digitală ı̂n care luminozitatea imaginii se
schimbă brusc, sau mai formal, are discontinuităţi. Punctele ı̂n care imaginea ı̂şi
schimbă luminozitatea brusc sunt ı̂n mod general organizate ı̂ntr-un set de seg-
mente de linii curbe numite margini. Aceeaşi problemă poate fi aplicată pentru
găsirea discontinuităţilor ı̂n semnale 1D, cunoscută şi sub numele de detecţie de
paşi; sau ı̂n găsirea discontinuităţilor ı̂n funcţie de timp, denumită şi detecţia de
schimbare. Scopul general al detecţiei de margini este de a reduce cantitatea de
date din image, conservând proprietăţile structurale ce sunt necesare procesării
următoare.

Detectorul de margini Canny este un operator ce foloseşte un algoritm ı̂n mai


mulţi paşi pentru a detecta o varietate largă de margini ı̂n studiul imaginilor. A
fost dezvoltat de John F. Canny ı̂n 1986. Canny a oferit şi o teorie computaţională
de detecţie a marginilor explicând cum funcţionează tehnica. Scopul creării algo-
ritmul a fost optimalitatea ı̂n relaţie cu următoarele caracterisitici:

• detecţie - probabilitatea ca o margine reală să fie detectată ar trebui să fie
maximizată, ı̂n timp ce probabilitatea ca puncte ce nu aparţin marginii să
fie localizate să fie minimă;

• localizare - marginile detectate trebuie să fie cât mai apropiate de marginile
reale;

• numărul de răspunsuri - o margine reală nu trebuie să aibă mai mult de un


corespondent detectat.

Pentru rularea algoritmului este nevoie de 5 paşi:

• Netezire - inlăturarea zgomotului;

• Determinarea gradienţilor - marginile ar trebui marcate acolo unde gradienţii


imaginii au magnitudine mare;

• Suprimarea non-maximală - doar maximele locale trebuie marcate ca mar-


gini;

• Dublu mărginirea - marginile potenţiale sunt determinate prin determinarea


pragurilor de limitare;

18
• Detecţia de margini prin histerezis - marginile finale sunt determinate prin
suprimarea tuturor marginilor ce nu sunt conectate la o margine tare.

Netezire

Este inevitabil ca toate imaginile să aibă o anumite cantitate de zgomot. Pentru
a evita riscul ca acest zgomot să fie confundat cu margini, el trebuie redus. Prin
urmare, imaginea este ı̂n primul rând trecută printr-un filtru gaussian(conform
Canny, 1986). Nucleul unui filtru Gaussian cu o deviaţie standard de σ = 1.4 este
:
 
2 4 5 4 2
4 9 12 9 4
 
1  
B= 5 12 15 12 5 
159  
4 9 12 9 4
 

2 4 5 4 2

Determinarea gradienţilor

În principiu, algoritmul Canny gaseşte margini acolo unde intensitatea nuanţelor
de gri se schimbă brusc. Aceste zone sunt găsite prin determinarea gradienţilor
imaginii. Gradienţii sunt determinaţi pentru fiecare pixel al imaginii netezite
aplicând operatorul Sobel. Primul pas ı̂l reprezintă aproximarea gradientului in
direcţia x si y prin aplicarea nucleelor(conform Canny, 1986):
 
−1 0 1
KGX = −2 0 2
 

−1 0 1
 
1 2 1
KGY =  0 0 0
 

−1 −2 −1
Gradienţii de magnitudine poti fi determinaţi ca distanţă euclidiană aplicând
teorema lui Pitagora: q
|G| = G2x + G2y

unde Gx şi Gy sunt gradienţii pe direcţia x, respectiv y. După acest pas,


marginile sunt late si nu indică ı̂n mod exact unde sunt mariginile reale. Pen-
tru a determina aceasta va fi nevoie să fie calculate direcţiile marginilor, folosind

19
următoarea formulă:  
|Gy |
θ = arctan
|Gx |

Suprimarea non-maximală

Scopul acestui pas este de converti marginile netezite ale imaginii ı̂n margini
ascuţite. În principiu asta se realizează prin păstrarea tuturor maximelor locale
din imaginea gradienţilor, si stergând totul ı̂n rest. Algoritmul este utilizat pentru
fiecare pixel din imaginea gradienţilor:

1. Se aproximeaza direcţia gradientului, notată cu θ la cel mai apropiat 45◦

2. Se compară puterea marginii pixelului curent cu puterea pixelului ı̂n direcţia


gradientului pozitiv, respectiv negativ. De exemplu, dacă direcţia gradien-
tului este nord (theta = 90◦ ), se compară cu pixelii de la nord şi sud.

3. Dacă puterea marginii pixelului curent este cea mai mare, se păstrează va-
loarea, altfel se şterge(conform Canny, 1986).

Dublu-mărginirea

Pixelii ce fac parte din margine după suprimarea non-maximală sunt marcaţi cu
valoarea lor individual. Majoritatea vor fi margini adevă rate ale imaginii, dar alţii
pot fi cauzaţi de zgomot sau variaţii de culori din cauza suprafeţelor aspre. Cea
mai simplă modalitate de a le diferenţia este folosind praguri, astefel incât doar
valorile ce trec peste această limită să fie păstrate. Algoritmul de detecţie Canny
foloseşte dublă mărginire. Pixelii ce fac parte din margine şi au valoarea mai mare
decât pragul superior sunt marcaţi ca puternici; iar cei ce sunt sub pragul inferior
sunt suprimaţi.

3.3.1 Detecţia de margini prin histerezis


Marginile puternice sunt interpetate ca margini sigure şi sunt incluse imediat ı̂n
imaginea finală. Marginile slabe sunt incluse dacă şi numai dacă sunt conectate
la margini puternice. Logica din spatele acestei raţiuni se bazează pe faptul ca
zgomotul sau alte deviaţii sunt puţin probabile ı̂n margini puternice (cu ajustările
necesare ı̂n setarea limitărilor). Astfel, marginile puternice vor fi datorate aproape
sigur doar marginilor reale. Marginile slabe ce sunt distribuite independent de alte
margini ı̂n cadrul imaginii şi neadiacente vor fi reduse. Marginile slabe reale sunt
cel mai probabil conectate la margini puternice.

20
Prezint ı̂n continuare implementarea din cadrul aplicaţiei, ce are la bază algo-
rimtul oferit de Tom Gibara([17]):

1 // f u n c t i a de p r o c e s a r e
2 public void p r o c e s s ( ) {
3 width = s o u r c e I m a g e . getWidth ( ) ;
4 height = sourceImage . getHeight ( ) ;
5 p i c s i z e = width ∗ h e i g h t ;
6 initArrays () ;
7 readLuminance ( ) ;
8 i f ( contrastNormalized ) normalizeContrast () ;
9 computeGradients ( g a u s s i a n K e r n e l R a d i u s , g a u s s i a n K e r n e l W i d t h ) ;
10 int low = Math . round ( l o w T h r e s h o l d ∗ MAGNITUDE SCALE) ;
11 int h i g h = Math . round ( h i g h T h r e s h o l d ∗ MAGNITUDE SCALE) ;
12 p e r f o r m H y s t e r e s i s ( low , h i g h ) ;
13 w r i t e E d g e s ( data ) ;
14 }
15 // f u n c t i a de d e t e r m i n a r e a h i s t e r e z i s u l u i
16 private void p e r f o r m H y s t e r e s i s ( int low , int h i g h ) {
17 Arrays . f i l l ( data , 0 ) ;
18 int o f f s e t = 0 ;
19 f or ( int y = 0 ; y < h e i g h t ; y++) {
20 f or ( int x = 0 ; x < width ; x++) {
21 i f ( data [ o f f s e t ] == 0 && magnitude [ o f f s e t ] >= h i g h ) {
22 f o l l o w ( x , y , o f f s e t , low ) ;
23 }
24 o f f s e t ++;
25 }
26 }
27 }
28
29 private void f o l l o w ( int x1 , int y1 , int i 1 , int t h r e s h o l d ) {
30 int x0 , x2 , y0 , y2 ;
31
32 i f ( x1 == 0 ) x0 = x1 ;
33 e l s e x0 = x1 − 1;
34 i f ( x1 == width − 1 ) x2 = x1 ;
35 e l s e x2 = x1 + 1;
36
37 i f ( y1 == 0 ) y0 = y1 ;
38 e l s e y0 = y1 − 1 ;
39 i f ( y1 == h e i g h t − 1 ) y2 = y1 ;
40 e l s e y2 = y1 + 1 ;
41
42

21
43 data [ i 1 ] = magnitude [ i 1 ] ;
44 f or ( int x = x0 ; x <= x2 ; x++) {
45 f or ( int y = y0 ; y <= y2 ; y++) {
46 int i 2 = x + y ∗ width ;
47 i f ( ( y != y1 | | x != x1 )
48 && data [ i 2 ] == 0
49 && magnitude [ i 2 ] >= t h r e s h o l d ) {
50 f o l l o w (x , y , i2 , threshold ) ;
51 return ;
52 }
53 }
54 }
55 }
56 // f u n c t i a de d u bl u −m a r g i n i r e
57 private void t h r e s h o l d E d g e s ( ) {
58 f or ( int i = 0 ; i < p i c s i z e ; i ++) {
59 i f ( data [ i ] > 0 ) data [ i ] = −1;
60 e l s e data [ i ] = 0 x f f 0 0 0 0 0 0 ;
61 }
62 }

3.4 Corelarea datelor


Scopul acestei proceduri este de a transforma datele statistice ı̂n ecuaţii ce pot fi
folosite mai departe ı̂n analiză. Orice algoritm de potrivire la dreapta sau curba de
pătrate minimă optimizează constantele unei ecuaţii de potrivire prin minimizarea
sumelor pătratelor deviaţiei datelor actuale de la cele prezise de ecuaţie.
Se dă un set de date experimentale :

x 1 , y1

x 2 , y2

x n , yn

unde x este variabila independentă (cea considerată fixă ı̂n momentul ms̆urătorii),
iar y este variabila dependentă (cea care trebuie determinată). Valorile xi sunt
listate in ordine crescătoare.
Considerăm ı̂n continuare că relaţia dintre x şi y este una liniară (ı̂n caz contrar

22
incercarea de a potrivi punctele pe o dreaptă este zadarnică). Fie

y = ax + b

ecuaţia. Vrem să determinăm valorile ce reprezintă panta a şi intercepţia b. Dacă
presupunem ca fiecare punct are pondere egală, adica fiecare yi are aceeaşi eroare
ataşată, atunci putem determina a şi b minimizând suma pătratelor deviaţiei va-
lorilor actuale ale yi de la valoarea liniei calculată a lui y. Formulele pentru a şi b
sunt următoarele:

(n ni=1 xi yi ) − ( ni=1 xi )( ni=1 yi )


P P P
a=
(n ni=1 x2i ) − ( ni=1 xi )2
P P

Pn
x2i )( ni=1 yi ) − ( ni=1 xi )( ni=1 xi yi )
P P P
( i=1
b=
(n ni=1 x2i ) − ( ni=1 xi )2
P P

În cadrul lucrării de faţă algoritmul este folosit ı̂n determinarea tangentei ne-
cesare calculului dimensiunii fractale. Prezint ı̂n continuare implementarea ı̂n ca
drul aplicaţiei:

1 // f u n c t i a de d e t e r m i n a r e a p a n t e i s i i n t e r c e p t i e i
2 void f i t ( double [ ] x , double [ ] y ) {
3 showVector ( x ) ;
4 showVector ( y ) ;
5 i f ( x . l e n g t h != y . l e n g t h ) System . out . p r i n t l n ( ” S i r u r i l e t r e b u i e s a
a i b a a c e e a s i d i m e n s i u n e ” + x . l e n g t h +” ”+y . l e n g t h ) ;
6 else {
7 int n = x . l e n g t h ;
8 double sumx , sumy , sumxy , sumx2 ;
9 sumx = sumy = sumxy = sumx2 = 0 ;
10 f or ( int i = 0 ; i < n ; i ++){
11 sumx += x [ i ] ;
12 sumy += y [ i ] ;
13 sumxy += x [ i ] ∗ y [ i ] ;
14 sumx2 += x [ i ] ∗ x [ i ] ;
15 }
16 s l o p e = ( ( n∗sumxy ) −(sumx ∗ sumy ) ) / ( ( n ∗ sumx2 ) −(sumx ∗ sumx ) ) ;
17 i n t e r c e p t = ( ( sumx2 ∗ sumy ) −(sumx ∗ sumxy ) ) / ( ( n ∗ sumx2 ) −(sumx ∗
sumx ) ) ;
18 }
19 }

23
3.5 Box-counting
Metoda box-count strânge si analizează date din modele complexe prin spargerea
imaginii ı̂n piese din ce ı̂n ce mai mici, ı̂n general cu forma patrată. Procesul
poate fi asemănat cu magnificarea şi micşorarea folosind metode ce examinează ı̂n
ce mod detaliile se schimbă odată cu scara la care sunt măsurate. În practică, se
schimbă măsura elementului cu care se inspectează modelul.
Teoretic, algoritmul are rolul de a cuantifica dimensiunea fractală, dar din per-
spective practice, aceasta presupune ca scalare să fie cunoscuta ı̂naintea analizei.
În practica, factorul de scalare nu poate fi cunoscut ı̂n precedenţă, de aceea algo-
ritmul box-count ı̂ncearcă să găsească ı̂n mod optim o metodă de a tăia imaginea
pentru a descoperi factorul de scalare. Metoda fundamentală de implementare
ı̂ncepe cu un set de masurători - dimensiuni ale pătratelor - notat cu N , şi calibre,
notat cu ǫ. Apoi pătratele de mărime ǫ sunt transpuse pe model şi numărate.
Pentru a face aceasta, pentru fiecare elemente de la 1 la N , se ia un pătrat de
latură ǫ si se foloseşte pentru a scana un set de date (parte a imaginii) prestabilit
printr-un plan de acoperire; iar la fiecare pas se măsoară numărul de caracteristici
relevante.
Datele relevante colectate ı̂n cadrul procesului depinde de subiectul investigat
si de tipul de analiză realizat. În cadrul lucrării de faţa algoritmul a fost aplicat
pe imagini binare (ce au doar 2 culori: alb şi ngru). Informaţia prelucrata este
bazată pe informaţia bruta dată de pixeli cu privire la natura lor. Atunci când
se aplică algoritmul, la fiecare numărare pentru a determina dimensiunea frac-
tală, se ı̂nregistrează dacă pătratul conţine sau nu parte din pixelii de culoare albă
determinaţi prin detecţia de margini.
Algoritmul necesită un plan de scanare care să descrie cum datele vor fi adu-
nate, mai exact, cum se va mişa pătratul peste spaţiul ce conţine modelul. Metoda
folosită este cea tradiţională prin care se scanează folosind o grilă standard ce nu
are suprapuneri. Se simulează ı̂n mod repetat aşezarea de pătrate in cadrul grilei
ce acoperă imaginea, astfel ı̂ncât niciun pâtrat să nu se suprapunâ. Operaţiunea
se termină atunci când se termină de acoperit ı̂ntreaga imagine. La pasul următor
se porneşte cu următoarea masură din cadrul seriei de mărimi fixată la ı̂nceput.
Datele obţine sunt apoi corelate, creându-se 2 vectori: primul reprezentând
mărimea pătratelor, iar al doilea rezultatul numărătorii pentru mărimea cores-
punzătoare. Pentru a determina dimensiunea Hausdorff, datele sunt logaritmizate
şi apoi corelate pentru a determina panta curbei ce descrie relaţia dintre cei 2
vectori(conform [18]).
Descris ı̂n mod formal: dimensiunea fractaă DF depinde de 2 trăsături: numărătoarea

24
pentru fiecare calibrare şi mărimea pentru fiecare element. A̧m notat cu N detaliul
şi ǫ scalarea. Pentru a determina cum detalierea se schimbă in funcţie de scalare
trebuie determinată linia regresiei logaritmice pentru N şi ǫ. Adică DF este panta
funţiei lnN
lnǫ
.

În continuare prezint implementarea din cadrul aplicaţiei:

1 // f u n c t i a de p r o c e s a r e a i m a g i n i i b i n a r e s e l e c t a t e s i d e t e r m i n a r e a
m a t r i c i i de 1 s i 0 pe c a r e s e va l u c r a i n c o n t i n u a r e p e n t r u timp
optim de r u l a r e
2 void p r o c e s s C o u n t M a t r i x ( ) {
3
4 int i n d i c e ;
5 data = s e l e c t B l o c k ( 0 , 0 , width , h e i g h t ) ;
6
7 f or ( int i = 0 ; i < h e i g h t ; i ++){
8 f or ( int j = 0 ; j < width ; j ++){
9 i n d i c e = i ∗ width + j ;
10 i f ( data [ i n d i c e ] == −1){
11 countMatrix [ i ] [ j ] = 1 ;
12 }
13 else {
14 countMatrix [ i ] [ j ] = 0 ;
15 }
16
17 }
18 }
19 }
20 // f u n c t i a de d e t e r m i n a r e a a c c e p t a r i i p a t r a t u l u i a n a l i z a t
21 public int f l a g ( int s t a r t x , int s t a r t y , int width1 , int
height1 ){
22 f or ( int i = s t a r t y ; i < s t a r t y + h e i g h t 1 ; i++ ) {
23 f or ( int j = s t a r t x ; j < s t a r t x + width1 ; j ++){
24 i f ( countMatrix [ i ] [ j ] == 1 ) return 1 ;
25 }
26 }
27 return 0 ;
28 }
29 // f u n c t i a de l o g a r i t m a r e
30 double [ ] toLog ( int [ ] x ) {
31 int i ;
32 int n= x . l e n g t h ;
33 double [ ] l o g x = new double [ n ] ;
34 f or ( i =0; i <n ; i ++){

25
35 l o g x [ i ] = Math . l o g ( x [ i ] ) ;
36 }
37 return l o g x ;
38 }
39 // f u n c t i a de p r o c e s a r e a d a t e l o r
40 public void p r o c e s s ( ) {
41 processCountMatrix ( ) ;
42 showCountMatrix ( ) ;
43
44 int s i z e , count ;
45 int nx , ny ;
46 int s t a r t x , s t a r t y ;
47 int [ ] dataToFlag ;
48 sizeOfBoxes = stringToInt ( s i z e s ) ;
49 double [ ] l o g S i z e = new double [ s i z e O f B o x e s . l e n g t h ] ;
50 double [ ] logCount = new double [ s i z e O f B o x e s . l e n g t h
];
51 numberOfBoxes = new int [ s i z e O f B o x e s . l e n g t h ] ;
52
53 f or ( int k = 0 ; k < s i z e O f B o x e s . l e n g t h ; k++){
54 s i z e = sizeOfBoxes [ k ] ;
55 count = 0 ;
56 nx = ( int ) Math . f l o o r ( width / s i z e ) ;
57 ny = ( int ) Math . f l o o r ( h e i g h t / s i z e ) ;
58 f or ( int i = 0 ; i < nx ; i ++){
59 f or ( int j = 0 ; j < ny ; j ++){
60 startx = i ∗ size ;
61 starty = j ∗ size ;
62 count = count + f l a g ( s t a r t x , s t a r t y , s i z e ,
size ) ;
63 }
64 }
65 numberOfBoxes [ k ] = count ;
66 }
67
68 l o g S i z e = toLog ( s i z e O f B o x e s ) ;
69 logCount = toLog ( numberOfBoxes ) ;
70
71 S t r a i g h t L i n e s ample Line = new S t r a i g h t L i n e ( ) ;
72 s ampl eLin e . f i t ( l o g S i z e , logCount ) ;
73 s ampl eLin e . show ( ) ;
74 }

26
Figura 3.1: Imaginea initiala

(a) Imaginea grayscale (b) Imaginea cu margini

Figura 3.2: Procesarea imaginii

27
Figura 3.3: Reprezentarea schematică a tehnicii utilizate pentru detecţia calităţii
fractale. O ı̂ntindere de pătrare generate algoritmic e folosită pentru a acoperi
suprafaţa tabloului. Apoi mărimea pătratelor scade treptat. De la stânga la
dreapta, mărimea pătratelor scade, iar la fiecare pas se numără câte pătrate sunt
ocupate.

28
Capitolul 4

Motivarea alegerii mediilor de


programare utilizate

4.1 Introducere in limbajul de programare Java


Java este un limbaj de programare computerizat, orientat pe obiecte, bazat pe
clase, concurent şi de scop general, ce este proiectat să aibă cât mai puţine
dependenţe de implementare. Este intenţionat să ofere programatorilor posibi-
litatea să ”scrie odată, ruleze de oriunde”, ceea ce ı̂nseamnă că un cod ce rulează
pe o platformă nu trebuie recompilat pentru a rula şi pe alta. Aplicaţiile java sunt
general compilate ı̂n bitcod să poată rula pe orice maşină virtuală Java, indiferent
de arhitectura calculatorului. Începând cu anul 2012, Java este unul dintre cele
mai populare limbaje ı̂n folosinţa, mai ales pentru aplicaţiile bazate pe structura
client-server, cu un raport de 10 milioane de utilizatori(conform [15]).

Java a fost iniţial creat de James Gosling pentru Sun Microsystems, şi a fost
mai târziu integrat ı̂n cadrul Corporatiei Oracle. A fost lansat ı̂n 1995 ca o com-
ponentă de bază a platformei Java. În decursul dezvoltării proiectului, inginerii
proiectului Sun au putut integra multe din valori legate de calităţi ca siguranţa,
cost, standard şi simplitate - priorităţi de top ı̂n orice piaţă de consum. Majori-
tatea consumatorilor cer produse la preţuri mici, fără defecte şi relativ simplu de
folosit.

Limbajul derivă ı̂n mare parte din sintaxa C şi C++, dar are mai puţine
facilităţi de nivel mic decât ele. A ı̂nceput ca un proiect mic, de ı̂ncredere şi in-
dependent de arhitectură. Odată cu apariţia World Wide Web ı̂n cadrul Internet,
echipa a continuat dezvoltarea limbajului ı̂ntr-unul neutru din punct de vedere

29
arhitectural, ce ar fi ideal pentru programarea pe Internet, pentru că un program
ar putea rula pe mai multe tipuri de calculatoare, atâta timp cât ele erau conec-
tate la Internet. Până ı̂n toamna anului 1994, Patrick Naughton şi colegul său
de la Sun, Jonathan Payne au terminat de scris WebRunner, un browser scris in
limbajul Java.

Doi factori au contribuit major la succesul limbajul Java: strategia de marke-


ting şi sincronizarea. Sun a realizat importanţa generării interesului şi acceptării
de produse şi a oferit gratis codul sursa pentru concepte cheie Java prin Inter-
net. Istoric, sistemul p-code UCSD a fost cel mai bun interpretor de cod binar
ce a reuşit să ı̂ndeplinească condiţiile de portabilitate independent de platforma
de lucru. Java a venit la momentul potrivit, atunci când se inregistra o creştere
explozivă a cererii pe Internet de aplicaţii independente de platformă.

Astăzi, Java nu mai este doar un limbaj de programare. E o platformă ı̂n


sine. Prin clădirea platformei peste alte platforme sau harware, aplicaţiile scrise
ı̂n limbajul Java pot fi rulate oriunde e prezenta platforma Java.

4.1.1 Platforma Java


Platforma Java este o platformă software diferită de alte platforme ca Microsoft
Windows, Macintosh, UNIX şi NetWare, creată pentru a furniza si rula apleturi şi
aplicaţii interactive, dinamice şi securizate ı̂n cadrul unui sistem de computere in
reţea. Platforma Java std̆easupra celorlalte sisteme de operare. Aplicaţiile scrise
in limbajul Java sunt compilate ı̂n cod neutru din punct de vedere arhitectural
pentru Masina Virtuală Java, spre deosebire de codul normal de maşină. Un
interpretor Java execută apoi codul translatat. Primul avantaj al acestei abordari
este faptul ca permite ca o aplicaţie Java să poată rula pe orice sistem, atâta timp
cât sistemul implementează Maşina Virtuala Java(conform [15]).
Platforma Java consista din 2 parti :

1. Maşina Virtuală Java - este o maşină abstracta creata pentru a fi implemen-


tată in procesoarele existente. Ascunde sistemul de operare care stă la baza
aplet-urilor şi aplicaţiilor Java. Maşina virtuală poate fi implementată in
software sau ı̂n hardware.

2. Java API (Interfata de programare a aplicaţiei) constă din funcţiile si va-


riabilele pe care programatorii le pot folosi ı̂n aplicaţiile lor. Furnizează o
30
interfaţă standard pentru aplet-uri si aplicaţii, indiferent de sistemul de ope-
rare ce stă la bază. API-ul Java este o colecţie mare de componente software
utile, create pentru diferite sarcini. Aceste componente sunt grupate ı̂n
librării ce conţin clase cu utilităţi asemănătoare, cunoscute sub numele de
pachete.

4.1.2 Limbajul Java


Limbajul şi mediul de programare Java sunt create pentru a rezolva un număr de
probleme din practica programatică modernă. Are mai multe trăsături interesante
ce ı̂l fac un limbaj ideal pentru dezvoltare de software. În continuare vor fi des-
crise trăsăturile Java comparate cu cele C şi C++, introduse clasele predefinite şi
discutate unele dintre limitările limbajului Java şi cum sunt acestea adresate.

În ”White Paper(1999)”, corporaţia Sun descrie Java ca un limbaj simplu,


orientat pe obiecte, distribuit, robust, sigur, neutru arhitectural, portabil, inter-
pretat, de mare performanţa, multi-thread şi dinamic.

• Java este simplu. Prin ”simplu” se ı̂nţelege că este mic şi familiar (pentru
un programator C sau C++). Sun a creat Java cât mai apropiat de modelul
C++ pentru a face sistemul mai uşor de ı̂nţeles, dar a ı̂nlăturat multe parţi
puţin folosite, greu ı̂ntelese sau confuze. Printre acestea se numără supras-
crierea de operatori şi moştenirea multiplă. De exemplu, Java nu acceptă
comanda ”go to”; ı̂n locul acesteia sunt folosite instrucţiunile ”break”, ”con-
tinue” şi tratarea excepţiilor.

• Cea mai importantă simplificare pe care o oferă Java este nefolosirea po-
interilor (unul dintre cele mai dificile aspecte din limbajul de programare
C/C++, predispus la erori) şi introduce preluare automată a reziduurilor,
astfel ı̂ncât programatorul nu trebuie să ı̂şi facă griji ı̂n legătură cu pointeri
lăsaţi alocaţi, referinţe invalide, scurgeri de memorie sau managementul me-
moriei.

• Pentru a păstra limbajul la un nivel mic, unul din scopurile sale a fost
contrucţia de software care poate rula independent pe maşini mici. Mărimea
interpretatorului de bază şi a claselor este de aproximativ 40k de biţi; librăriile
31
standard şi cele destinate lucrului cu threaduri necesită 175k adiţionali.

• Java este orientat pe obiect. Asta ı̂nseamnă că programatorul se poate fo-
cusa pe datele din aplicaţia sa şi interfaţa către ele. Spre deosebire de C++,
Java este mai strict ı̂n ce priveşte natura orientării sale către obiect. În Java,
totul trebuie realizat prin invocarea unei metode dintr-un obiect Java. Toată
aplicaţia trebuie văzută ca un obiect de o anumită clasă. Deasemenea, codul
de C şi C++ nu poate fi folosit direct, nici măcar pentru apeluri sistem. În
C++, poţi ajunge la proceduri existente de C++, inclusiv apeluri sistem, de-
clarând procedura C ı̂n afară spaţiului de declarare normal al C++, folosind
sintaxa C. În java, multe dintre funcţiile de utilitate sistem sunt asigurate
prin metode din clasa System din pachetul java.lang.

• Java este distribuit. Java este programat să suporte aplicaţii pe reţea. Java
suportă diferite nivele de conectivitate prin reţea prin clasele oferite de pa-
chetul java.net. De exemplu, clasa URL asigură o interfaţa foarte simplă
pentru reţea - poţi deschide şi accesa un obiect referit de URL pe un site
separat cu acceaşi uşurinţa cu care programatorii sunt obişnuiţi atunci când
deschid şi accesează un obiect local. Dacă se vrea mai mult control peste
datele ce sunt downloadate decât cel oferit de metodele simple URL, se poate
folosi obiectul URLConnection ce este returnat de un UTRL prin metoda
URL.openConnection(). Deasemenea, iţi poţi crea propria reţea cu clasele
Socket şi ServerSocket. Aceste clase iţi permit să te conectezi la un anumit
port pe un anumit host de Internet, unde poţi să scrii şi să citeşti date; sau
poţi implementa un server ce acceptă conexiuni de la clienţi.

• Java este robust. Java este creat pentru a scrie software de ı̂ncredere şi pu-
ternic. Java pune un mare accent pe verificarea din timp a posibilelor erori,
verificarea dinamică ı̂n timpul rulării şi eliminarea situaţiilor predispuse la
erori. Eliminarea pointerilor elimină posibilitatea suprascrierii memoriei şi
coruperii datelor. Colectarea automată a reziduurilor previne scurgeri de
memorie. Tratarea excepţiilor şi tipurile tari de obiecte sunt deasemenea
trăsături din Java ce fac programele puternice. Deşi Java nu poate asigura
calitatea software-ului, ı̂nleneşte procesul.

• Java este sigur. Java este un limbaj intenţionat să fie folosit ı̂n medii

32
relaţionate. În acest scop, Java are implementate mai multe mecanisme de
asigurare a securităţii pentru a proteja cod maliţios ce poate ı̂ncerca să intre
ı̂n fişiere de sistem. De exemplu, Java nu are pointeri. Asta face imposibilă
folosirea ı̂n aplicaţii a falsificării pointerilor sau artimetică pe memorie, ce
ar putea da acces la o maşină din nivelurile inferioare ale arhitecturii. Alt
exemplu este că Java are o clasa denumită ClassLoader ce defineşte cum cla-
sele Java sunt ı̂ncărcate ı̂n reţea. Una dintre funcţiile importante ale acestei
clase este asigurarea că reziduurile sunt păstrare ı̂ntr-un spaţiu de lucru se-
parat, prevenind appleturi maliţioase din a ı̂nlocui clase Java cu propriile
sale clase. O altă funcţie importantă a clasei de ı̂ncărcare este că orice cod
ce nu este de ı̂ncredere este trecut printr-o verificare Java byte-code pentru a
verifica violarea restricţiilor de spaţiu de lucru, cod invalid pentru Java Vir-
tual Machine, stack overflow sau underflow, folosirea incorectă a regiştrilor
şi conversie ilegala de tipuri de date.

• Java este neutru arhitectural. Programale Java sunt compilate ı̂ntr-un for-
mat de cod binar netru arhitectural. Principalul avantaj al acestei abordări
este faptul că permite unei aplicaţii Java să ruleze pe un sistem ce are imple-
mentată Java Virtual Machine. Această trăsătură este folositoare nu doar
pentru reţele, dar şi pentru distribuţia software ı̂ntr-un singur sistem. Pentru
a obţine acelaşi nivel de compatibilitate cu baza lor de date, Oracle a avut
o specificaţie de 40 de pagini pentru versiunea lor de C - o variantă ce a fost
scris intr-un limbaj diferit. Eu au conformat sursa lor de 80 de platforme
Unix, plus calculatoarele personale, minicomputerele şi mainframe-urile. În
prezent, pe piaţa calculatoarelor personale, dezvoltatorii de aplicaţii trebuie
să producă variante ale aplicaţiilor lor compatibile cu IBM PC şi Apple Ma-
cintosh. Se poate spune că devine din ce ı̂n ce mai greu de produs software
ce rulează pe toate platformele.

• Java este portabil. Portabilitatea vine din faptul că este neutru din punct de
vedere arhitectural. Dar se ajunge mai departe de atât, specificând ı̂n mod
explicit mărimea fiecărui tip de date primitiv pentru a elimina dependenţa
de implementare. De exemplu, ”int” ı̂nseamnă complementul unui integer
pe 32 de biti cu semn, iar ”float” ı̂nseamnă un număr 32-bitIEEE 754. Sis-
temul Java ı̂n sine este destul de portabil. Compilatorul de Java este scris
ı̂n Java, iar sistemul din timpul rulării este scris ı̂n ANSI C cu o limită clară
de portabilitate.

33
• Java este interpretat. Compilatorul Java generează coduri byte. Interpre-
tatorul JAva execută codurile byte translatate direct pe sistemul de imple-
mentează Java Virtual Machine. Partea de creare de legături este doar o
parte din procesul de ı̂ncărcare a claselor ı̂n mediu.

• Java este performant. Comparat cu limbajele encriptive de nivel ı̂nalt şi


complet interpretate, Java este foarte performant. Dacă sunt folosite compi-
latoarele just-in-time, corporaţia Sun pretinde că performanţele codului byte
convertit la cod maşina este aproape la fel de bun ca C sau C++ nativ.

• Java este multi-thread. Nu este greu de ı̂nţeles de ce multi-threadingul a


devenit vital pentru un limbaj ca Java. O aplicaţie trebuie să facă ceva
ı̂n timp ce aşteaptă pentru intrări din partea clientului. Într-o aplicaţie de
reţea bazată pe GUI aşa cum sunt browser-e web, există de obicei mai multe
acţiuni ce au loc ı̂n acelaşi timp. Java furnizează sprijin pentru thread-uri
multiple la execuţie, ce pot trata diferite sarcini cu o clasă Thread din pa-
chetul java.lang. Clasa de thread suportă metode necesare pentru a porni un
thread, a rula un thread, a opri un thread, şi a verifica statusul unui thread.
Acestea fac programarea ı̂n Java folosind thread-uri mult mai usoară decât
programarea convenţioanală cu un singur fir de execuţie ı̂n stilul C sau C++.

• Java este dinamic. Limbajul Java a fost creat pentru a putea fi adaptat la
un mediu ı̂n schimbare. Este un limbaj mai dinamic decât C sau C++. Java
ı̂ncarcă clasele pe măsură ce sunt folosite, chiar şi ı̂n cadrul unei reţele. Asta
face ca upgrade-ul software-ului să fie mult mai simplu şi eficient. Clasele ı̂n
Java au deasemenea şi reprezentare ı̂n timpul rulării. În C sau C++, ai un
pointer la un obiect, dar nu ştii ce fel de obiect este şi nu există o modalitate
de a afla. În Java, când unui program ı̂i este necesar un obiect, acesta poate
afla clasa căreia aparţine verificând informaţia din timpul rulării.

4.1.3 Rezumat
De la debutul său, Java a luat lumea prin surprindere. Astăzi, Java nu mai
reprezintă doar un limbaj de programare, ci şi o platformă ı̂n sine. Platforma

34
Java prezintă beneficii atât pentru utilizatorii săi cât şi pentru programatori şi
personalul de suport. Este disponibil ı̂ntr-o varietate largă de sisteme de operare
şi hardware. Cererea pentru performanţă creste cu Java, JavaOS si JavaChip
Family din cadrul JavaSoft, ce oferă mai mare claritate ı̂n acest domeniua. Este
posibil ca Platforma Java să devină un mediu ideal de dezvoltare software.

35
4.2 Librarii folosite
4.2.1 Introducere
Pachetele Java sunt entităţi logice care permit organizarea claselor. Ele asigură
structurarea aplicaţiilor şi sprijină modularizarea unei aplicaţii. Ajută la evitarea
conflictului de nume ı̂ntre clase şi la reunirea claselor si interfeţelor ce denotă părţi
ale unui concept comun in cadrul unei aplicaţii.

Pachetul sistem java.lang este importat implicit ı̂n orice aplicaţie. Acest lucru
are ca explicaţie faptul ca acest pachet conţine clase fundamentale, utilizate prac-
tic ı̂n orice aplicaţie (conform Frăsinaru, 2008).

4.2.2 java.util
Pachetul java.util contine o serie de clase şi interfeţe de bază din Java. Deşi numele
sugerează că acestea sunt strict clase de utilitate, funcţionalitatea lor depăşeşte
acest domeniu. Importarea acestei libră rii face posibil lucrul cu structuri de date
de bază, eventimente şi colectii.

4.2.3 java.imageio
Sistemul de intrare/ieşire oferit de Java este bazat pe stream-uri. Un stream este
un obiect abstract care fie produce informaţii, fie le consumă. Stream-urile sunt
conectate la dispozitive fizice de intrare/ieşire. Deşi aceste dispozitive pot diferi,
comportamentul stream-urilor ramâne acelaşi. De exemplu, aceleaşi operaţii pot
fi folosite pentru a scrie un mesaj pe ecran sau ı̂ntr-un fişier. Ierarhiile de clase
care implementeaza ı̂n Java stream-urile sunt definite ı̂n pachetul java.io.
Pentru interpretarea imaginilor s-a folosit clasa imageio ce oferă metode simple
pentru codarea şi decodarea obiectelor ImageReaders şi ImageWriters. In cadrul
proiectului, a fost necesar lucrul cu fişiere de imagini, facilitat de această librărie.
Crearea unui stream de citire dintr-un fişier a presupus crearea unui obiect de tipul
File, ca ı̂n urmatorul exemplu:

1 // f u n c t i e ce a p e l e a z a r u t i n a de t r a n s f o r m a r e a i m a g i n i i o r i g i n a l e
i n g r a y s c a l e s i s a l v e a z a imaginea c r e a t a
2 void t r a n s f o r m T o G r a y s c a l e ( ) {
3 G r a y s c a l e g r = new G r a y s c a l e ( ) ;

36
4 g r . s e t S o u r c e I m a g e ( image ) ;
5 gr . p r o c e s s ( ) ;
6 g r a y s c a l e = gr . getGrayscaleImage ( ) ;
7 try {
8 ImageIO . w r i t e ( g r a y s c a l e , ”PNG” ,new F i l e ( ” P o l l o c k 6 . png” ) ) ;
9 }
10 catch ( E x c e p t i o n e ) {
11 System . out . p r i n t l n ( ” e r o a r e l a s c r i e r e a i m a g i n i i ” ) ;
12 }
13 }

4.2.4 java.awt
Interfaţa grafică cu utilizatorul (GUI) este o particularizare a interfeţei cu utiliza-
torul (UI), prin care se ı̂ntelege conceptul generic de interacţiune dintre program
şi utilizator. Limbajul Java pune la dispoziţie numeroase clase pentru implemen-
tarea diverselor funcţionalităţi UI ce permit realizarea interfeţei cu utilizatorul.
Biblioteca de funcţii folosita ı̂n cadrul lucrării de faţa este java.awt (Abstract
Windowing Toolkit). Crearea unei aplicaţii grafice presupune

1. design - crearea unei suprafeţe de afişare pe care vor fi afişate obiectele grafice
care servesc la comunicarea cu utilizatorul, crearea şi aşezarea componente-
lor pe suprafaţa de afişare la poziţiile corespunzătoare;

2. funcţionalitate - definirea unor acţiuni care trebuie să sa se execute ı̂n mo-
mentul când utilizatorul interacţionează cu obiectele grafice ale aplicaţiei
şi ”ascultarea” evenimentelor generate de obiecte ı̂n momentl interacţiunii
cu utilizatorul si executarea acţiunilor corespunzătoare, aşa cum au fost ele
definite.

Pachetul java.awt ofera componentele AWT necesare dezvoltarii interfeţei gra-


fice. Obiectele grafice sunt derivate din clasa Component, iar meniurile descind din
clasa MenuComponent. Prin componentă se intelge orice obiect ce poate avea o
reprezentare grafică şi poate interacţiona cu utilizatorul, de exemplu ferestrele, bu-
toanele, listele, etc. Toate componentele AWT sunt definite de clase proprii, clasa
Component fiind superclasa abstractă a tuturor acestor clase (conform Frăsinaru,
2008).
Crearea obiectelor grafice nu realizează automat şi afişarea lor pe ecran. Mai
ı̂ntâi ele trebuie aşezate pe o suprafaţa de afişare, care poate fi o fereastră sau un
aplet, şi vor deveni vizibile ı̂n momentul ı̂n care suprafaţa pe care sunt plasate va
37
fi vizibilă. O astfel de suprafaţă pe care sunt plasate componente se mai numeşte
container şi reprezintă o instanţă unei clase derivate din Container.
Interfaţa grafică serveşte interacţiunii cu utilizatorul. Programul trebuie să
facă o prelucrare in momentul ı̂n care utilizatorul a efectuat o acţiune, şi prin
urmare, componentele trebuie să genereze evenimente ı̂n funcţie de acţiunea pe
care au suferit-o. Evenimentele sunt instanţe ale claselor derivate din AWTEvent.
Un eveniment este produs de o acţiune a utilizatorului asupra unui obiect gra-
fic, deci evenimentele nu trebuie generate de programator. În schimb, ı̂n cadrul
programului trebuie specificat codul care se execută la apariţia unui eveniment.
Tratarea evenimentelor se realizează prin intermediul unor clase de tip listener,
clase care sunt definite in pachetul java.awt.event.

1
2 // f u n c t i a de a t a s a r e a e v e n i m e n t u l u i c o r e s p u n z a t o r unui but on
3 jB u tt o n 2 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r ( ) {
4 public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent e v t ) {
5 jButton2ActionPerformed ( evt ) ;
6 }
7 }) ;
8
9 // c o d u l s e ce e x e c u t a l a a p a r i t i a e v e n i m e n t u l u i
10 private void j B u t t o n 2 A c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent
evt ) {
11 try {
12 im . t r a n s f o r m T o G r a y s c a l e ( ) ;
13 B u f f e r e d I m a g e gray = im . g e t G r a y s c a l e I m a g e ( ) ;
14 B u f f e r e d I m a g e s c a l e d I m a g e = s c a l e I m a g e ( 4 0 0 , 4 0 0 , gray ) ;
15 ImageIcon i i = new ImageIcon ( s c a l e d I m a g e ) ;
16 drawingPanel . s e t I c o n ( i i ) ;
17 }
18 catch ( E x c e p t i o n e ) {
19 System . out . p r i n t l n ( ” Eroare l a t r a n s f o r m a r e a i n g r a y s c a l e ” ) ;
20 }
21 }

4.2.5 java.swing
Modelul swing extinde modelul AWT adăugându-i noi componente care fie ı̂nlocuiesc
unele vechi, fie sunt cu totul noi. O convenţie general acceptată este prefixarea unei
clase AWT cu litera ”J” pentru a denumi o clasă corespondentă din Swing. Ast-
fel, ı̂n locul clasei java.awt.Button putem folosi javax.swing.JButton. Aplicaţia

38
GUI are nevoie in continuare de pachetul java.awt deoarece acolo sunt definite
unele clase utilitare cum ar fi Color, Font, Dimension, etc ce nu au fost rescrise in
Swing. De asemenea, pachetul java.awt.event râmâne ı̂n continuare esenţial pen-
tru tratarea evenimentelor generate de componente AWT, cât si de cele din Swing.
Implementarea componenetelor Swing necesare ı̂n dezvoltarea interfeţei aplicaţiei
sunt descrise ı̂n cadrul anexelor.

39
Capitolul 5

Descrierea aplicaţiei

Scopul aplicaţiei este de a calcula dimensiunea fractală a unei imagini pornind


de la modelarea algoritmică prezentată anterior. Aplicaţia este realizată folosind
mediul de programare Eclipse.
Figura 5.1 reprezintă ecranul de selecţie a imaginii. Setul de butoane din
partea dreaptă descrie posibilele acţiuni. Prin ”Attach” se poate alege un nou
fişier, realizându-se urcarea acestuia pe suprafaţa de afişare a imaginii. La baza
imaginii se află opţiunile de ”Zoom in” şi ”Zoom out”, ce realizează magnificarea,
respectiv micşoarea imaginii uploadate.

Figura 5.2 arată ecranul afişat dupa acţionarea butonului de ”Grayscale”. ce


apelează rutina de transformare a imaginii, şi urcare a rezultatului pe suprafaţa
de afişare.
Figura 5.3 descrie aplicaţia după apelarea rutinei de detecţie a marginilor ,
declanşată de butonul ”Edges”, ce realizează interschimbarea imaginii precendente
cu cea binară obţinută ı̂n urma rutinei de procesare prin algoritmul Canny.

În ultimul pas, descris ı̂n figura 5.4, se reprezintă grafic rezultatele obţinute ı̂n
urma algoritmului de box-count, iar datele sunt corelate, determinându-se panta
funcţie ce leagă punctele. Computarea dimensiunii este afişata ı̂n colţul dreapta-
jos.

Pentru descrierea funţiilor din aplicaţie este oferit un meniu minimal de ajutor,
ce oferă detalii despre folosire.

40
Figura 5.1: Aplicatie - selectarea imaginii

Figura 5.2: Aplicatie - transformarea grayscale

41
Figura 5.3: Aplicatie - detecţia marginilor

Figura 5.4: Aplicatie - meniu help

42
Figura 5.5: Aplicatie - corelarea datelor si determinarea pantei

43
Capitolul 6

Interpretarea rezultatelor

6.1 Rezultate
Aplicaţia descrisă ı̂n paginile anterioare a fost folosită ı̂n analizarea unui set de
picturi, selectate prin ı̂ncadrarea ı̂n acelaşi curent artistic, şi anume expresionismul
abstract. Se poate considera că percepţia vizuală a complexităţii unei imagini
este mai clară ı̂n acest caz, deoarece legătura directă cu obiecte reale este taiată.
Percepţia umană a frumuseţii ı̂n acest caz se bazează pe factori ı̂nca necunoscuţi
in totalitate. Ipoteza lui Berlyne susţine ca frumuseţea poate fi măsurată, iar
preferinţa pentru un obiect creşte in funcţie de complexitatea vizuală pâna la
un punct, ca apoi să descrească. Măsură complexităţii luată ı̂n cazul de faţa, şi
anume dimensiunea fractală ı̂ncearcă să demostreze această ipoteză,pun ând ı̂n
aceeaşi zonă opere recunoscute mondial.
Selecţia a fost efectuată prin alegerea curentului artistic şi a reprezentanţilor
recunoscuţi mondial al acestuia. În ciuda elementelor fundamental diferite, artiş tii
fondului expresionist abstract par să aibă ı̂n comun aceeasşi dorinţa de a transmite
prin artă ceea ce nu se putea prin metode tradiţionale. Opera lor continuă să
stimuleze spectatorului, facându-l să-şi pună ı̂ntrebări legate de viziunea asupra
lumii.
În continuarea prezint rezultatele obţinute ı̂n urma analizei fractale. Operele
pe care s-a realizat calculul dimensiunii sunt ataşate la finalul capitolului.

6.2 Analiză şi interpretare


Rezultatele prezentate arată o preferinţa pentru dimensiunea fractală de 1.8, su-
gerând că modelele fractale contribuie la percepiţia complexităţii vizuale,şi a frumuseţii.

44
Autor Opera Dimensiunea fractala
Augusto Giacometti Fantasia coloristica 1.8148
Matin de mai 1.8060
Arshile Gorki Liver is the cock’s bomb 1.7209
Untitled 1.7973
Hans Hoffman Fantasy 1.8004
Afterglow 2 1.8025
Willem de Kooning Untitled 1.7607
Gotham news 1.8103
Lee Krasner Untitled 1 1.8185
Untitled 2 1.7685
Norman Lewiss Twilight sounds 1.8036
Barnett Newman Genesis 1.6060
Jackson Pollock Blue poles 1.8592
Autumn rhythm 1.8260
Math Rothko Untitled 1 1.7845
Untitled 2 1.7900
Clyfford Still Untitled 1 1.7152

Tabela 6.1: Rezultatele obtinute

Studiul aprecierii estetice umane este ı̂n continuare un domeniu ı̂n formare, iar cu-
antificarea preferinţelor vizuale faţa de un conţinut fractal este un punct de plecare.
În termeni de explorare intrinsecă, pare potrivit ca examinarea suprarealiţilor si
expresioniţilor să se facă dintr-o perspectivă ce ı̂ncearcă să unifice considerente ce
trec de nivelul conşitentului sau familiarului.
Nu există nici un argument care să susţină că ı̂n momentul creării pictorii au
fost conştienţi de incorporarea structurilor fractale ı̂n cadrul operelor. Cu toate
acestea, pare un fapt general valabil, picturile putând fi apreciate ca o recreare a
realităţii, ce ı̂n ciuda abstractizării ı̂ncearca să păstreze armonia.
Studii extinse efectuate asupra operelor lui Pollock, ı̂n odmeniul dimensiunii
fractale au rezultat ı̂n stabilirea autenticităţii pe baza acestui criteriu. Am ı̂ncercat
să aflu ı̂n studiul de faţa dacă această caracteristică determină un ı̂ntreg curent
artistic. Rezultatele relevă ı̂n principiu acest lucru, preferinţa ce pare mai departe
de logică a pictorilor expresionişti pentru complexitatea cunatificată de mărimea
aproximativă de 1.8. Studiul nu pretinde că această caracteristică este singura
concludentă ı̂n domeniul concretizării matematice a picturilor, dar o consideră ca
fiind una relevantă şi prezentă la nivel extins.
Rezultatele obţinute pentru picturile lui Pollock sunt aliniate la celelalte stu-
dii(conform Taylor, 2002) şi opere ale sale. În privinţa celorlalţi pictori nu există
ı̂ncă studii particulare care să le testeze complexitatea vizuală. Cu toate aces-
tea, se observă că pentru fiecare pictor individual se pătrează o constantă, astfel

45
pentru Hoffman rezultatele sunt aproape identice pentru opere ce nu par să re-
leve aceleaşi trs̆ături ı̂n mod conştient. Acelaşi lucru se poate spune şi despre
Rothko, ce ramâne ı̂n aria 1.78-1.79 ı̂n cadrul operelor sale, sau Giacometti cu
1.80-1.81. Masura ı̂n care complexitatea lucrărilor este pre-stailită de pictori sau
un act natural nu se poate spune. Dar, cum metodele expresioniştilor se separă de
cele tradiţionale, se poate spune că dimensiunea fractală relevă cel mai probabil o
trăsătură inconştientă, atât pentru creator, cât şi pentru spectator.
Puse ı̂n cadrul operelor universale, cele selectate ı̂n cadrul proiectului surprind
prin ceea ce pare o dezorganizare şi aglomerare nespecifice. S-ar putea spune că
se ı̂ncearcă a se recrea haosul, excepţie făcând, de exemplu pictura lui Barnett
Newman-Genesis, ce are o dimensiune de 1.6, şi lasă impresia unei ordini diferite.
Rezultă că picturile abstracte respectă teoria haosului prin structura lor, comple-
xitatea lor tinzând spre limita a ceea ce percepţia umană găseşte frumos. Rămâne
ı̂n continuare de studiat măsura ı̂n care această trs̆ătură poate fi explorată şi din
alte puncte de vedere.

46
(a) Augusto Giacometti - (b) Augusto Giacometti -
Fantasia coloristica Matin de mai

(a) Arshile Gorki-Liver is the


(b) Arshile Gorki - Untitled
cock’s bomb

(b) Hans Hoffman - After-


(a) Hans Hoffman - Fantasy glow

(a) Willem de Kooning - Un- (b) Willem de Kooning - Go-


titled 1 tham news

47
(a) Lee Krasner - Untitled 1 (b) Lee Krasner - Untitled 2

(a) Jackson Pollock - Au-


(b) Jackson Pollock - Blue
tumn rhythm
poles

(a) Math Rothko - Untitled


1 (b) Math Rothko - Untitled
2

(a) Clyfford Still - Untitled 1 (b) Clyfford Still- Untitled 2

Figura 6.8

48
(a) Norman Lewis - Twilight (b) Barnett Newman - Gene-
sounds sis

49
Capitolul 7

Concluzii

Analiza din cadrul proiectului de faţa a dezvăluit că metoda sistematică de creare
a modelelor abstracte ı̂n domeniul artei respectă modalitatea de scalare fractală
cu precizie şi consistenţă. Rezultatele obţinute pun ı̂n contextul percepţiei reguli
matematice, cuantificând factorul de complexitate vizuală, apreciată ı̂n cadrul cu-
rentului expresionist, ı̂n jurul valorii de 1.8.
Informatizând procesul de analiză a unui tablou, se separă informaţia şi calcu-
lează izolat parametrii. În consecinţă, deşi o analiză computerizată nu va putea
spune dacă o operă va fi plăcută sau nu, poate spune care sunt modele ce pre-
cizie. În cazul de faţă, aceasta este realizată prin dimensiunea fractală, ce oferă
detalii legate de densitatea şi autosimilaritatea modelelor create. Analiza arată o
consistenţa ı̂n domeniul picturii abstracte.
În concluzie, sper că studiul de faţă va stimula discuţia dintre cercetători, psi-
hologi şi critici de artă ı̂n legătură cu semnificaţia artistică a naturii fractale şi
concretizarea acesteia ı̂n ceea ce ne ı̂nconjoară şi ceea ce considerăm frumos.

50
Capitolul 8

Anexe

8.1 Realizarea graficelor


1 // c l a s a pe c a r e s e r e p r e z i n t a g r a f i c u l
2 public c l a s s G r a f i c extends JPanel {
3 private s t a t i c f i n a l int MAX SCORE = 2 0 ;
4 private s t a t i c f i n a l int PREF W = 8 0 0 ;
5 private s t a t i c f i n a l int PREF H = 6 5 0 ;
6 private s t a t i c f i n a l int BORDER GAP = 3 0 ;
7 private s t a t i c f i n a l C o l o r GRAPH COLOR = C o l o r . g r e e n ;
8 private s t a t i c f i n a l C o l o r GRAPH POINT COLOR = new C o l o r ( 1 5 0 ,
50 , 50 , 180) ;
9 private s t a t i c f i n a l S t r o k e GRAPH STROKE = new B a s i c S t r o k e ( 3 f ) ;
10 private s t a t i c f i n a l int GRAPH POINT WIDTH = 1 2 ;
11 private s t a t i c f i n a l int Y HATCH CNT = 1 0 ;
12
13 private L i s t <I n t e g e r > s c o r e s = new A r r a y L i s t <I n t e g e r >() ;
14 private L i s t <I n t e g e r > c a l i b r e s = new A r r a y L i s t <I n t e g e r >() ;
15
16 private F u n c t i e f u n c t i e ;
17
18 public G r a f i c ( L i s t <Double> s c o r e s , L i s t <Double> c a l i b r e s ,
Functie function ) {
19 int x , y ;
20 // t r e b u i e sa a i b a a c e e a s i l u n gi m e
21 f or ( int i = 0 ; i < s c o r e s . s i z e ( ) ; i ++) {
22 x = ( int ) Math . f l o o r ( c a l i b r e s . g e t ( i ) ∗ 1 0 ) ;
23 y = ( int ) Math . f l o o r ( s c o r e s . g e t ( i ) ∗ 1 0 ) ;
24 t h i s . s c o r e s . add ( y ) ;
25 t h i s . c a l i b r e s . add ( x ) ;
26 System . out . p r i n t l n ( x + ” ” + y ) ;
27 }

51
28 this . f u n c t i e = function ;
29 }
30
31
32 protected void paintComponent ( G ra ph ic s g ) {
33 super . paintComponent ( g ) ;
34 Graphics2D g2 = ( Graphics2D ) g ;
35 g2 . s e t R e n d e r i n g H i n t ( R e n d e r i n g H i n t s . KEY ANTIALIASING ,
R e n d e r i n g H i n t s . VALUE ANTIALIAS ON) ;
36
37 double x S c a l e = ( ( double ) getWidth ( ) − 2 ∗ BORDER GAP) / 5 ;
38 double y S c a l e = ( ( double ) g e t H e i g h t ( ) − 2 ∗ BORDER GAP) / 1 0 ;
39
40 System . out . p r i n t l n ( ” x s c a l e ”+ x S c a l e + ” y s c a l e ”+ y S c a l e ) ;
41 // adaugarea p u n c t e l o r i n l i s t a de p u n c t e a l e g r a f u l u i
42 L i s t <Point> g r a p h P o i n t s = new A r r a y L i s t <Point >() ;
43 f or ( int i = 0 ; i < s c o r e s . s i z e ( ) ; i ++) {
44 int x1 = ( int ) ( c a l i b r e s . g e t ( i ) ∗ x S c a l e /10 + BORDER GAP)
;
45 int y1 = ( int ) ( ( g e t H e i g h t ( ) −( s c o r e s . g e t ( i ) ∗ y S c a l e / 10
+ BORDER GAP) ) ) ;
46 g r a p h P o i n t s . add (new Po i nt ( x1 , y1 ) ) ;
47 }
48
49 g2 . drawLine (BORDER GAP, g e t H e i g h t ( ) − BORDER GAP, BORDER GAP,
BORDER GAP) ;
50 g2 . drawLine (BORDER GAP, g e t H e i g h t ( ) − BORDER GAP, getWidth ( )
− BORDER GAP, g e t H e i g h t ( ) − BORDER GAP) ;
51
52 f or ( int i = 0 ; i < 1 0 ; i ++) {
53 int x0 = BORDER GAP;
54 int x1 = GRAPH POINT WIDTH + BORDER GAP;
55 int y0 = g e t H e i g h t ( ) − ( ( ( i + 1 ) ∗ ( g e t H e i g h t ( ) −
BORDER GAP ∗ 2 ) ) / 10 + BORDER GAP) ;
56 int y1 = y0 ;
57 g2 . drawLine ( x0 , y0 , x1 , y1 ) ;
58 g2 . d r a w S t r i n g ( ( i +1) ∗10 + ” ” , x1 −35 , y1 +10) ;
59 }
60
61 f or ( int i = 0 ; i < 5 ; i ++) {
62 int x0 = ( i + 1 ) ∗ ( getWidth ( ) − BORDER GAP ∗ 2 ) / 5 +
BORDER GAP;
63 int x1 = x0 ;
64 int y0 = g e t H e i g h t ( ) − BORDER GAP;
65 int y1 = y0 − GRAPH POINT WIDTH;
66 g2 . drawLine ( x0 , y0 , x1 , y1 ) ;

52
67 g2 . d r a w S t r i n g ( ( i +1) ∗10 + ” ” , x1 −5, y1+25 ) ;
68 }
69
70 S t r o k e o l d S t r o k e = g2 . g e t S t r o k e ( ) ;
71
72 g2 . s e t S t r o k e ( o l d S t r o k e ) ;
73 g2 . s e t C o l o r (GRAPH POINT COLOR) ;
74 System . out . p r i n t l n ( g e t H e i g h t ( ) + ” ” + getWidth ( ) ) ;
75 f or ( int i = 0 ; i < g r a p h P o i n t s . s i z e ( ) ; i ++) {
76 int x = g r a p h P o i n t s . g e t ( i ) . x − GRAPH POINT WIDTH / 2 ;
77 int y = g r a p h P o i n t s . g e t ( i ) . y − GRAPH POINT WIDTH / 2 ; ;
78 int ovalW = GRAPH POINT WIDTH;
79 int ovalH = GRAPH POINT WIDTH;
80 g2 . f i l l O v a l ( x , y , ovalW , ovalH ) ;
81 System . out . p r i n t l n ( x+ ” ”+y ) ;
82 }
83
84 double punct1x = 0 . 5 ;
85 double punct2x = 4 . 5 ;
86
87 double punct1y = punct1x ∗ f u n c t i e . s l o p e + f u n c t i e . i n t e r c e p t ;
88 double punct2y = punct2x ∗ f u n c t i e . s l o p e + f u n c t i e . i n t e r c e p t ;
89
90 int x1 = ( int ) ( punct1x ∗ x S c a l e + BORDER GAP) ;
91 int y1 = ( int ) ( ( g e t H e i g h t ( ) −(punct1y ∗ y S c a l e + BORDER GAP) )
);
92
93 int x2 = ( int ) ( punct2x ∗ x S c a l e + BORDER GAP) ;
94 int y2 = ( int ) ( ( g e t H e i g h t ( ) −(punct2y ∗ y S c a l e + BORDER GAP) )
);
95
96 g2 . drawLine ( x1 , y1 , x2 , y2 ) ;
97 }
98
99 // s e t a r e a d i m e n s i u n i i
100 public Dimension g e t P r e f e r r e d S i z e ( ) {
101 return new Dimension (PREF W, PREF H) ;
102 }
103 // c r e a r e a s i a f i s a r e a i n t e r f e t e i
104 private s t a t i c void createAndShowGui ( ) {
105
106 L i s t <Double> s c o r e s = Arrays . a s L i s t
(7.794411205726601 ,7.392647520721623 ,
107 7.0431599159883405 ,6.447305862541213 ,5.958424693029782 ,
108 5.241747015059643 ,4.74493212836325 ,3.4657359027997265 ,
109 2.1972245773362196) ;

53
110 L i s t <Double> c a l i b r e s = Arrays . a s L i s t
(0.6931471805599453 ,1.0986122886681098 ,
111 1.3862943611198906 ,1.791759469228055 , 2.0794415416798357 ,
112 2.4849066497880004 ,2.772588722239781 ,3.4657359027997265 ,
113 4.1588830833596715) ;
114 F u n c t i e f c t = new F u n c t i e ( −1.65151 68964468077 ,
9.244731313751782) ;
115
116 G r a f i c mainPanel = new G r a f i c ( s c o r e s , c a l i b r e s , f c t ) ;
117
118 JFrame frame = new JFrame ( ”DrawGraph” ) ;
119 frame . s e t D e f a u l t C l o s e O p e r a t i o n ( JFrame . EXIT ON CLOSE) ;
120 frame . getContentPane ( ) . add ( mainPanel ) ;
121 frame . pack ( ) ;
122 frame . s e t L o c a t i o n B y P l a t f o r m ( true ) ;
123 frame . s e t V i s i b l e ( true ) ;
124 }

8.2 Realizarea interfeţei


1 // f u n c t i a de c r e a r e a f e r e s t r e i s i m e n i u l u i
2 private s t a t i c void createGUI ( ) {
3
4 GUI imageUpload = new GUI ( ) ;
5 imageUpload . s e t V i s i b l e ( true ) ;
6 imageUpload . s e t T i t l e ( ” Imagine ” ) ;
7 imageUpload . s e t S i z e ( 8 0 0 , 6 0 0 ) ;
8 JMenuBar menuBar = new JMenuBar ( ) ;
9 imageUpload . setJMenuBar ( menuBar ) ;
10
11 JMenu f i l e = new JMenu ( ” Help ” ) ;
12 menuBar . add ( f i l e ) ;
13
14 JMenuItem about = new JMenuItem ( ”About” ) ;
15 JMenuItem h e l p = new JMenuItem ( ” Help ” ) ;
16 JMenuItem e x i t = new JMenuItem ( ” E x i t ” ) ;
17
18 f i l e . add ( about ) ;
19 f i l e . add ( h e l p ) ;
20 f i l e . add ( e x i t ) ;
21
22 e x i t . a d d A c t i o n L i s t e n e r ( imageUpload . new e x i t A c t i o n ( ) ) ;
23 about . a d d A c t i o n L i s t e n e r ( imageUpload . new aboutAction ( ) ) ;
24 h e l p . a d d A c t i o n L i s t e n e r ( imageUpload . new aboutAction ( ) ) ;

54
25
26 }
27
28 // f u n c t i a de c r e a r e a s u p r a f e t e i de a f i s a r e , impreuna cu e l e m e n t e l e
aferente
29 public c l a s s GUI extends j a v a x . swing . JFrame {
30
31 G r a f i c g r a f i c = new G r a f i c ( s c o r e s , c a l i b r e s , f c t ) ;
32
33 Imagine im = new Imagine ( ) ;
34 private JButton jButton1 , jButton2 , jButton3 , jButton4 , zoomIn ,
zoomOut ;
35 private JLabel j L a b e l 1 ;
36 private J T e x t F i e l d j T e x t F i e l d 1 ;
37
38 private JLabel drawingPanel ;
39
40 GroupLayout l a y o u t = new GroupLayout ( t h i s . getContentPane ( ) ) ;
41
42 public GUI ( ) {
43 initComponents ( ) ;
44 }
45 private void initComponents ( ) {
46
47 t h i s . getContentPane ( ) . s e t L a y o u t ( l a y o u t ) ;
48
49 jB u tt o n 1 = new JButton ( ) ;
50 jB u tt o n 2 = new JButton ( ) ;
51 jB u tt o n 3 = new JButton ( ) ;
52 jB u tt o n 4 = new JButton ( ) ;
53
54 zoomIn = new JButton ( ) ;
55 zoomOut = new JButton ( ) ;
56
57 drawingPanel = new JLabel ( ) ;
58 drawingPanel . s e t S i z e ( 5 0 0 , 300 ) ;
59
60 try {
61 B u f f e r e d I m a g e uploadedImage = ImageIO . r e a d (new F i l e ( ” U n t i t l e d . j p g
”) ) ;
62 B u f f e r e d I m a g e s c a l e d I m a g e = s c a l e I m a g e ( 4 0 0 , 4 0 0 , uploadedImage ) ;
63 im . s e t S o u r c e I m a g e ( uploadedImage ) ;
64 ImageIcon i i = new ImageIcon ( s c a l e d I m a g e ) ;
65 drawingPanel . s e t I c o n ( i i ) ;
66 }
67 catch ( E x c e p t i o n e ) {

55
68 System . out . p r i n t l n ( ” Eroare ” ) ;
69 }
70 j T e x t F i e l d 1 = new J T e x t F i e l d ( ) ;
71 j L a b e l 1 = new JLabel ( ) ;
72
73 s e t D e f a u l t C l o s e O p e r a t i o n ( j a v a x . swing . WindowConstants .
EXIT ON CLOSE) ;
74 s e t P r e f e r r e d S i z e (new j a v a . awt . Dimension ( 6 0 0 , 4 8 0 ) ) ;
75
76 jB u tt o n 1 . s e t T e x t ( ” Attach ”) ;
77 jB u tt o n 1 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r
() {
78 public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent
evt ) {
79 jButton1ActionPerformed ( evt ) ;
80 }
81 }) ;
82
83 jB u tt o n 2 . s e t T e x t ( ” G r a y s c a l e ”) ;
84 jB u tt o n 2 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r
() {
85 public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent
evt ) {
86 jButton2ActionPerformed ( evt ) ;
87 }
88 }) ;
89
90 jB u tt o n 3 . s e t T e x t ( ” Edges ”) ;
91 jB u tt o n 3 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r
() {
92 public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent
evt ) {
93 jButton3ActionPerformed ( evt ) ;
94 }
95 }) ;
96
97 jB u tt o n 4 . s e t T e x t ( ”Box−c o u n t i n g ” ) ;
98 jB u tt o n 4 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t . A c t i o n L i s t e n e r
() {
99 public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent
evt ) {
100 jButton4ActionPerformed ( evt ) ;
101 }
102 }) ;
103

56
104 j T e x t F i e l d 1 . a d d A c t i o n L i s t e n e r (new j a v a . awt . e v e n t .
ActionListener () {
105 public void a c t i o n P e r f o r m e d ( j a v a . awt . e v e n t . ActionEvent
evt ) {
106 jTextField1ActionPerformed ( evt ) ;
107 }
108 }) ;
109
110 j L a b e l 1 . s e t T e x t ( ” Dimensiune f r a c t a l a ” ) ;
111
112 zoomIn . s e t T e x t ( ”Zoom In ” ) ;
113 zoomOut . s e t T e x t ( ”Zoom Out” ) ;
114
115 layout . setHorizontalGroup (
116 layout . createSequentialGroup ()
117 . addGroup ( l a y o u t . c r e a t e P a r a l l e l G r o u p ( GroupLayout .
Alignment .LEADING)
118 . addComponent ( drawingPanel )
119 . addGroup ( l a y o u t . c r e a t e S e q u e n t i a l G r o u p ( )
120 . addComponent ( zoomIn )
121 . addComponent ( zoomOut )
122 )
123 )
124 . addGroup ( l a y o u t . c r e a t e P a r a l l e l G r o u p ( GroupLayout .
Alignment .LEADING)
125 . addComponent ( j B ut t o n1 )
126 . addComponent ( j B ut t o n2 )
127 . addComponent ( j B u tt o n3 )
128 . addComponent ( j B u tt o n4 )
129 . addComponent ( j L a b e l 1 )
130 )
131 );
132 layout . setVerticalGroup (
133 layout . createParallelGroup ()
134 . addGroup ( l a y o u t . c r e a t e S e q u e n t i a l G r o u p ( )
135 . addComponent ( drawingPanel )
136 . addGroup ( l a y o u t . c r e a t e P a r a l l e l G r o u p ( )
137 . addComponent ( zoomIn )
138 . addComponent ( zoomOut )
139 . addComponent ( j L a b e l 1 ) )
140 )
141 . addGroup ( l a y o u t . c r e a t e S e q u e n t i a l G r o u p ( )
142 . addComponent ( j B ut t o n1 )
143 . addComponent ( j B ut t o n2 )
144 . addComponent ( j B u tt o n3 )
145 . addComponent ( j B u tt o n4 )

57
146 . addComponent ( j L a b e l 1 ) )
147
148 );
149
150 }

58
Bibliografie

[1] Abraham, F. D. (1995). A Chaos theory in psychology. Westport: Greenwoo-


d/Praeger.

[2] Aitken, P. P. (1974). Judgments of pleasingness and interestingness as func-


tions of visual complexity. Journal of Experimental Psychology, 103, 240244

[3] Aks, D., Sprott, J. (1996). Quantifying aesthetic preference for chaotic pat-
terns. Empirical Studies of the Arts, 14, 116.

[4] Barnsley, M. (1993). Fractals everywhere (2nd ed.). Boston, MA: Academic
Press.

[5] Berlyne, D. E. (1971). Aesthetics and psychobiology. New York: Appleton-


Century-Crofts.

[6] Cain,G.L. (1993). Introduction to general Topology.

[7] Canny, John (1986). A computational approach to edge detection. Pattern


Analysis and Machine Intelligence, IEEE Transactions .

[8] Engelking,R. (1978). Dimension theory.

[9] Frăsinaru, Cristian (2008) Curs practic de Java.

[10] Mandelbrot,B.B Peitgen, H., Jurgens H., Saupe D. (1992). Chaos and Frac-
tals, Springer.

[11] Mandelbrot, B. B. (1977). The fractal geometry of nature. New York: Free-
man.

[12] Marcus, S. (1982) Semiotica matematică a artelor vizuale, ed Ştiinţifică şi


Enciclopedică

[13] Pollock, Jackson (1947). My Painting. Possibilities 1, 79.

[14] Taylor, R. P. (2002). Order in Pollocks chaos. Scientific America, 116121.


59
[15] http://docs.oracle.com/javase/6/docs/api/overview-summary.html

[16] http://ei.cs.vt.edu/ wwwbtb/book/chap21/javaplatform.html

[17] http://www.tomgibara.com/computer-vision/canny-edge-detector

[18] http://rsbweb.nih.gov/ij/plugins/fraclac/FLHelp/BoxCounting.htm

60

You might also like