Professional Documents
Culture Documents
Licenta
Licenta
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
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ă
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.
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.
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).
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.
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.
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 .
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.
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
10
Curba lui Koch reprezintă forma ce se formează atunci când numărul iteraţiilor
paşilor descrişi tinde la infinit.
11
seturi topologice pentru care dimensiunile topologice pot părea naive.
Tabela 2.1
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
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.
Definiţie formală
Dimensiunea Hausdorff este definită doar pentru spaţii metrice, folosind concepte
la lungime şi volum, ce necesită o metrică.
Observatie 1. a < b ⇔ Hd (A, a) ≥ Hd (A, b), de aceea Md (A) = lime→0 (A, e).
13
Definitie 4. Dimensiunea Hausdorff a lui A este
Definiţia este naturală, dimensiunea lui A fiind cea mai mare dimensiune pentru
care volumul lui A este finit.
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:
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 iau valorile fundamentale de roşu, verde şi albastru ale fiecărui pixel;
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:
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.
• 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;
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
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:
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.
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 }
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:
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ǫ
.
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
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
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.
• 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 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.
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
Î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
41
Figura 5.3: Aplicatie - detecţia marginilor
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.
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
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
47
(a) Lee Krasner - Untitled 1 (b) Lee Krasner - 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
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 }
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
[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.
[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.
[17] http://www.tomgibara.com/computer-vision/canny-edge-detector
[18] http://rsbweb.nih.gov/ij/plugins/fraclac/FLHelp/BoxCounting.htm
60