This is an old revision of the document!
Î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:
O privire de ansamblu asupra pașilor de realizare ai schiței poate fi vizualizată în imaginea de mai jos. Acești pași sunt prezentați în detaliu în secțiunile urmatoare.
De asemenea, î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 continuare vor fi prezentați algoritmii necesari realizării procesării.
Î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 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ă.
Pentru filtrul de hașurare, primul pas este creearea unui model de hașurare, format din linii subțiri, paralele.
Din linia ecuatiei avem:
$$ a \cdot x + b \cdot y + c = 0 $$
unde {x, y} [0, 1] reprezinta coordonatele unui pixel in spatiul de texturare.
Pentru a obtine linii paralele este suficient sa schimbam parametrul c.
$$ a\cdot x + b\cdot y + c_1 = 0 \\ a\cdot x + b\cdot y + c_2 = 0 $$
Pentru a obtine o fasie (o linie de o anumita grosime) putem rearanja ecuatia in
$$ a\cdot x + b\cdot y \in[-c_1,-c_2] $$
Pentru a obține fasii paralele ce se repeta la infinit, putem aplica in stanga ecuatiei o functie periodica precum sinus sau cosinus.
$$ sin(a\cdot x + b\cdot y) \in[-c_1,-c_2] $$
Pentru ca functia sin produce valori intre -1 si 1, putem simplifica ecuatia prin utilizarea unei singure inegalitati
$$ sin(a\cdot x + b\cdot y) > c $$
unde modificare parametrului c va duce la schimbarea grosimii liniilor, iar modificarea parametrilor a si b va duce la schimbarea frecventei si a directiei acestora.
Pentru a se prezenta mai ușor rezultatul obținut, aplicația realizata de către voi trebuie să permită vizualizarea individuală rezultatelor 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”