Skip to content

TrifanBogdan24/Quad-Tree

Repository files navigation

Quad Tree

Arborele cuaternar este o structură de date care organizează informații multidimensionale, fiind utilizată în cartografie, procesarea imaginilor, grafică pe calculator etc.

Structura este un arbore ce reprezintă o zonă din spațiul N-dimensional (în cadrul acestui proiect, cazul N = 2). Fiecare nod al arborelui păstrează informații pentru o zonă din spațiu, iar nodul are 2^N fii, care reprezintă fiecare o zonă de 2^N ori mai mică decât zona părintelui. Zonele fiilor sunt disjuncte, iar reuniunea lor formează zona părintelui.

Cu alte cuvinte, structura pe care o vom utiliza în cadrul acestei teme este un arbore în care fiecare nod neterminal are exact 4 descendenți.

Mai multe detalii se află în src/, alături de implementarea algoritmului.

Orice imagine pătrată, de dimensiune putere a lui 2, poate fi reprezentată printr-un arbore cuaternar. Nodurile de pe fiecare nivel al arborelui corespund unei împărțiri a unei zone pătrate din imagine în patru sferturi.

  • Rădăcina arborelui → întreaga imagine
  • Nivelul 1 → cele patru sferturi (ordinea: stânga sus, dreapta sus, dreapta jos, stânga jos)
  • Nivelul 2 → fiecare sfert este împărțit din nou în patru
  • Procesul continuă până când zonele sunt uniforme

Dacă o regiune pătrată este uniformă (formată din pixeli identici), nodul devine frunză și stochează culoarea. Dacă nu este uniformă, se subdivizează și nodul devine neterminal, având patru descendenți.

Exemplu de vizualizare:

Formula pentru culoarea medie

Pentru a determina când un bloc poate fi reprezentat ca nod frunză, se calculează culoarea medie a blocului. Pentru fiecare canal (RED, GREEN, BLUE) se face media aritmetică a valorilor din submatricea de pixeli corespunzătoare blocului.

$$red = \frac{1}{size \cdot size} \left( \sum_{i=x}^{x+size} \sum_{j=y}^{y+size} grid[i][j].red \right)$$ $$green = \frac{1}{size \cdot size} \left( \sum_{i=x}^{x+size} \sum_{j=y}^{y+size} grid[i][j].green \right)$$ $$blue = \frac{1}{size \cdot size} \left( \sum_{i=x}^{x+size} \sum_{j=y}^{y+size} grid[i][j].blue \right)$$

Formula pentru scorul similarității

După calcularea culorii medii, se determină scorul de similaritate al blocului, prin diferența pătratică medie între pixeli și culoarea medie.

$$mean = \frac{1}{3 \cdot size^2} \big( \sum_{i=x}^{x+size} \sum_{j=y}^{y+size} (red - grid[i][j].red)^2 + (green - grid[i][j].green)^2 + (blue - grid[i][j].blue)^2 \big)$$

red, green și blue reprezintă componentele culorii medii.

Fișierul PPM

Un fișier PPM conține:

  1. Antet text:
    • Linia 1: tipul fișierului (pentru testele folosite → P6)
    • Linia 2: două numere (width și height), separate prin spațiu
    • Linia 3: valoarea maximă a culorii (în testele folosite → 255)
  2. Imaginea propriu-zisă, în format binar

Imaginile utilizate sunt pătratice și au dimensiuni putere a lui 2.

Exemplu fișier PPM:

P6
512 512
255
<date binare>

Fișierul comprimat

Pentru arborele rezultat, se scriu valorile într-un fișier binar. Exemplu (în format text doar pentru lizibilitate):

0: 0
1: 0 {1 191 255 0} 0 0
2: {1 255 235 61} {1 251 49 153} {1 255 0 0} {1 0 0 255} {1 0 185 242}
{1 255 235 61} {1 255 235 61} {1 0 255 0} 0 {1 128 0 128}
{1 255 128 0} {1 251 49 153}
3: {1 251 49 153} {1 255 0 0} {1 191 255 0} {1 255 235 61}

La început se indică nivelul arborelui

Nodurile frunză sunt notate astfel:

{ tip_nod, red, green, blue }

⚠️ Fișierul comprimat real este în format binar, fără aceste delimitări textuale. Acest exemplu este doar pentru claritate.

🧑‍💻 Cum sa folosesti acest proiect

📥 Instaleaza dependintele

sudo apt install -y build-essential valgrind

🛠️ Compilare

cd src/
make build

⚙️ Rularea programului

# Template:
./quadtree -c1 <factor> <file>.ppm info.txt

# Exemplu:
./quadtree -c1 1000 test5.ppm test_c1.out
# Template:
./quadtree -c2 <factor> <file>.ppm <file_compressed>.out

# Exemplu:
./quadtree -c2 1000 test5.ppm test5_c2.out
# Template:
./quadtree -d <file_compressed>.out <file>.ppm

# Exemplu:
./quadtree -d test5_c2.out test.ppm

🧹 Curățare

cd src/
make clean

🗃️ Arhivare

cd src/
make archive

✅ Rulare teste

cd checker/
chmod +x check.sh
./check.sh

About

📷 PPM Image compression/decompression algorithm

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors