Î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:
Î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.
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ă.
Î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.
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.
Această metodă reduce numărul total de eșantionări a texturii pentru fiecare pixel de la 625 la 50.
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.
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.
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ă:
Implicit, aplicația se va deschide cu vizualizarea rezultatului final.
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”