Tema 2 - Sketch Effect

  • Responsabili: Vlad Novetschi, Robert Caragicu, Cristian Lambru
  • Lansare: 14 decembrie 2024
  • Termen de predare: 14 ianuarie 2025, ora 23:55
  • Notă: Orice informație ce nu a fost acoperită în acest document este la latitudinea voastră!

Descriere generală

În cadrul acestei teme, urmărim procesarea unei imagini pentru a obține o variantă stilizată a acesteia sub formă de schiță.

O imagine sub formă de schiță are următoarele caracteristici:

  • Este alb-negru fără nuanțe de gri
  • Păstrează contururile imaginii. Contururile sunt realizate folosind filtrul Sobel + binarizare
  • Linii de hașură arată locurile unde imaginea este mai închisă la culoare. Liniile de hașură sunt cu atât mai dese într-o zonă cu atât culorile imaginii sunt mai întunecate în acea zonă.

În imaginea mai jos, puteți vizualiza mai multe rezultate obținute în urma aplicării abordării pe care trebuie să o implementați în cadrul acestei teme.

În cadrul temei, trebuie să implementați o anumită metodă propusă, ce este descrisă în secțiunile următoare. O privire de ansamblu asupra pașilor de realizare ai schiței prin această metodă poate fi vizualizată în imaginea de mai jos. Acești pași sunt prezentați în detaliu în secțiunile urmatoare.

Algoritmii de mai jos au ca parametrii diferite valori de prag, direcții de hașurare, densitatea hașurării etc. Aceste valori sunt la libertatea voastră de a îi seta cu condiția ca programul vostru să aibă rezultate vizuale pe diferite imagini în care să se vadă clar contururi ale imaginii și linii de hașură.

Filtru Sobel + binarizare

Pentru a construi contururile schiței, vom aplica filtrul Sobel pe imaginea originală și vom binariza (Laboratorul 09). Pentru a binariză, vom stabili că un pixel este negru dacă în urma filtrului Sobel valoarea este mai mare decât un prag. Dacă valoarea este mai mică decât un prag, atunci pixelul va fi alb. Valoarea de prag este la alegerea voastră.

Filtru de netezire separabil

Înainte de a aplica hașurarea, este necesară netezirea imaginii folosind un filtru medie similar cu cel din Laboratorul 08 numai că filtrul folosit va fi de dimensiuni 25×25.

Aplicarea filtrului folosind algoritmul ad-hoc presupune pentru fiecare pixel efectuarea a 625 eșantionări în textură.

Un algoritm mai optim este separarea filtrului în două filtre de dimensiuni 25×1 respectiv 1×25 folosind ideea de aici. Netezirea se va realiza în doi pași.

Începem cu imaginea originală:

Primul pas este efectuarea unei neteziri pe orizontală. Fiecare pixel va fi egal cu media aritmetică a pixelului și a celor 24 de vecini pe aceeași linie cu pixelul.

Rezultatul este acesta:

Al doilea pas este efectuarea pe acest rezultat a unei neteziri pe verticală. Fiecare pixel va fi egal cu media aritmetică a pixelului și a celor 24 de vecini pe aceeași coloană cu pixelul.

Rezultatul este acesta:

Această metodă reduce numărul total de eșantionări a texturii pentru fiecare pixel de la 625 la 50.

Filtru de hașurare

Model de hașurare

Pentru filtrul de hașurare, primul pas este creearea unui model de hașurare, format din linii subțiri, paralele.

Din ecuația liniei avem:

$$ a \cdot x + b \cdot y + c = 0 $$

unde $\{x, y\} \in [0, 1]$ reprezintă coordonata unui pixel în spațiul texturii.

Pentru a obține linii paralele, este suficient să schimbăm parametrul $c$ .

$$ a\cdot x + b\cdot y + c_1 = 0 \\ a\cdot x + b\cdot y + c_2 = 0 $$

Pentru a obține o fâșie (o linie de o anumită grosime), putem rearanja ecuația în:

$$ a\cdot x + b\cdot y \in[-c_1,-c_2] $$

Pentru a obține fâșii paralele ce se repetă la infinit, putem aplica în stânga ecuației o funcție periodică precum sinus sau cosinus:

$$ sin(a\cdot x + b\cdot y) \in[-c_1,-c_2] $$

Pentru că funcția sinus produce valori între -1 și 1, putem simplifica ecuația prin utilizarea unei singure inegalități:

$$ sin(a\cdot x + b\cdot y) > c $$

unde modificarea parametrului $c$ va duce la schimbarea grosimii liniilor, iar modificarea parametrilor $a$ și $b$ va duce la schimbarea frecvenței și a direcției acestora.

Mai multe rezultate pentru aplicarea modelului de hașurare descris mai sus cu diferite valori ale lui $a$ , $b$ și $c$ pot fi vizualizate în imaginea de mai jos.

Aplicare model de hașurare

Pentru a realiza procesul de hașurare doar pentru anumite zone din imagine și astfel să urmărim detaliile prezente în ea, trebuie să utilizăm modelul de hașurare doar pentru pixelii care respectă anumite criterii. Cel mai simplu criteriu este să transformăm culoarea pixelului din modelul RGB în nuanță de gri, precum în Laboratorul 08, să considerăm faptul că această nuanță de gri este intensitatea culorii din pixel și să utilizăm modelul de hașurare doar în situația în care pixelul are intensitatea mai mică decât un prag.

În rezultatul final, trebuie utilizate 3 filtre de hașurare, toate cu direcții și praguri de intensitate diferite. Alegerea acestor valori rămâne la latitudinea voastră.

Pentru o diversificare a rezultatelor, trebuie să introduceți în cel puțin unul din cele 3 filtre de hașurare utilizarea unor linii albe pe fundal negru și în cel puțin un alt filtru de hașurare linii negre pe fundal alb. Fundalul negru se consideră doar pentru pixelii care respectă pragul de intensitate.

Prezentare rezultat

Pentru a se prezenta mai ușor rezultatul obținut, aplicația realizată de către voi trebuie să permită vizualizarea individuală arezultatelor pentru toți pașii intermediari ai metodei. Se vor folosi tastele de la tastatură după cum urmează:

  • Tasta 0 - Vizualizare imagine originală;
  • Tasta 1 - Vizualizare rezultat filtru Sobel + binarizare;
  • Tasta 2 - Vizualizare rezultat filtru de netezire orizontal;
  • Tasta 3 - Vizualizare rezultat filtru de netezire final - orizontal și vertical. În continuare se consideră că acesta este și rezultatul filtrului de netezire;
  • Tasta 4 - Vizualizare rezultat filtru de netezire + aplicare filtru de hașurare 1;
  • Tasta 5 - Vizualizare rezultat filtru de netezire + aplicare filtru de hașurare 2;
  • Tasta 6 - Vizualizare rezultat filtru de netezire + aplicare filtru de hașurare 3;
  • Tasta 7 - Vizualizare rezultat filtru de netezire + aplicare toate cele 3 filtre de hașurare;
  • Tasta 8 - Vizualizare rezultat final al metodei.

Implicit, aplicația se va deschide cu vizualizarea rezultatului final.

În rezolvarea temei sunt următoarele restricții:

  • Tema trebuie implementată în limbajul de programare C/C++, în situația în care se realizează o rezolvare ce se execută pe unitatea centrală de procesare, CPU, sau într-un limbaj specializat pentru implementarea pe procesorul grafic, precum GLSL.
  • NU este permisă utilizarea niciunei biblioteci pentru realizarea metodelor de procesare și analiză de imagini în rezolvarea temei. Se pot utiliza biblioteci pentru alte aspecte ale rezolvării, precum încărcarea și salvarea fișierelor de tip imagine.
  • NU este permisă utilizarea unui alt limbaj de programare în afara celor menționate.

Notare (200)

  • +25p - Filtru Sobel + binarizare
  • +50p - Filtru de netezire separabil cu mască de convoluție de dimensiune cel puțin 25×25
    • Această cerinta se punctează doar în situația în care filtrul de netezire este implement în 2 pași.
  • +75p - Filtru de hașurare
  • +25p - Aplicare 3 filtre de hașurare cu parametri diferiți
  • +25p - Vizualizarea individuală a rezultatelor pentru pașii intermediari ai metodei
    • +5p - Vizualizare rezultat filtru Sobel + binarizare;
    • +5p - Vizualizare rezultat filtru de netezire;
    • +10p - Vizualizare rezultate filtru de netezire + aplicare filtru de hașurare cu parametri diferiți;
    • +5p - Vizualizare rezultat filtru de netezire + filtru de hașurare.

Bonusuri posibile

  • Implementarea pe unitatea de procesare grafica a pașilor prezentați în cerință
  • Implementarea paralelă pe unitatea centrală de procesare a pașilor prezentați în cerință
  • Implementarea filtrului de netezire Gaussian în 2 pași

Indicații suplimentare

Este indicat să folosiți framework-ul și Visual Studio.

Pentru implementarea temei, în folderul src/lab_m2 puteți crea un nou folder, de exemplu Tema2, cu fișierele Tema2.cpp și Tema2.h (pentru implementare POO, este indicat să aveți și alte fișiere). Pentru a vedea fișierele nou create în Visual Studio în Solution Explorer, apăsati click dreapta pe filtrul lab_m2 și selectați Add→New Filter. Dupa ce creați un nou filtru, de exemplu Tema1, dați click dreapta și selectați Add→Existing Item. Astfel adăugați toate fișierele din folderul nou creat. În fișierul lab_list.h trebuie adaugată și calea către header-ul temei. De exemplu: #include “lab_m2/Tema2/Tema2.h”

Arhivarea proiectului

  • În mod normal arhiva trebuie să conțină toate resursele necesare compilării și rulării
  • înainte de a face arhiva asigurați-vă că ați curățat proiectul Visual Studio:
    • click dreapta pe proiect în Solution ExplorerClean Solution
    • și ștergeți folderul /build/.vs (dacă nu îl vedeți, este posibil să fie ascuns)
  • SAU ștergeți complet folderul /build
  • în cazul în care arhiva tot depășește limita de 50MB (nu ar trebui), puteți să ștergeți și folderul /deps sau /assets întrucat se pot adăuga la testare. Nu este recomandat să faceți acest lucru întrucat îngreunează mult testarea în cazul în care versiunea curentă a bibliotecilor/resurselor diferă de versiunea utilizată la momentul scrierii temei.

pgapi/teme/2024/02.txt · Last modified: 2024/12/20 10:25 by andrei.lambru
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0