Responsabili: Isabella Mincă Denisa Sandu Radu Stochițoiu
Termen de predare: 05.11.2017, ora 23:55
În urma realizării acestei teme, studentul va fi capabil:
În general, o imagine este reprezentată pe calculator printr-o matrice de N coloane si M rânduri, unde fiecare element al matricei este numit pixel, iar N si M reprezintă lățimea respectiv înălțimea imaginii.
Imaginile pot fi reprezentate în spatiul RGB al culorilor, în care fiecare pixel este definit de un triplet (R, G, B), valorile reprezentând intensitatea roșului, a verdelui și a albastrului. R, G, B sunt întregi aparținând intervalului [0, 255].
Un alt model de reprezentare a culorilor este spațiul HSV, în care fiecare pixel este definit prin tripletul (H, S, V). H reprezintă nuanța (hue), S saturația (saturation) și V luminozitatea (value). H ia valori în intervalul [0, 360], iar S și V in intervalul [0, 100], însa vom norma valorile, pentru ca acestea să aparțină intervalului [0, 1] prin împărțire la 360 pentru H, respectiv 100 pentru S și V. Figura următoare ilustrează modul in care afectează fiecare componentă HSV caracteristicile imaginii:
Lui Dorel, student la Facultatea de Automatică și Calculatoare, îi place să încarce imagini pe rețele de socializare. Cum X vrea să iși impresioneze prietenii, are nevoie de un program cu ajutorul căruia să modifice imaginile pe care ar urma să le încarce și vă cere ajutorul.
Un mod simplu de modificare a caracteristicilor unei imagini este de a modifica valorile H, S și V ale fiecarui pixel în același fel.
De exemplu, pentru a modifica saturația imaginii, se înmulțește S cu o valoare supraunitară pentru a crește saturația și subunitară pentru a o scădea.
Similar, pentru a lumina sau întuneca imaginea este înmulțit V cu o valoare, iar pentru a obține o anumită culoare trebuie aleasă o valoare de pe arcul de cerc corespunzător culorii ca în figura următoare (considerând H în intervalul [0, 360]) :
Valorile trebuie sa ramană în intervalele specificate. De exemplu, dacă S = 0.8 și se dorește dublarea saturației:
S' = min(2.0 * S, 1) = 1
Dorel ar dori să modifice fie culoarea, fie saturația, fie luminozitatea unei imagini, însa el vă va oferi ca input imaginea în reprezentarea RGB.
Transformarea unui singur pixel din (R, G, B) in tripletul analog (H, S, V) (normat) :
Valorile R, G, B sunt împarțite la 255 pentru a modifica intervalul din [0, 255] în intervalul [0, 1]:
R' = R / 255 G' = G / 255 B' = B / 255 Cmax = max(R', G', B') Cmin = min(R', G', B') Δ = Cmax - Cmin
Calculul valorii H (hue) :
Daca H este negativ, la valoarea lui H se adună 360, apoi H este normat:
H = H / 360
Calculul valorii S (saturation) :
Calculul valorii V (value) :
V = Cmax
Pentru mod se va folosi funcția fmod din biblioteca math.h
Date de intrare:
Selectarea caracteristicii care va fi modificată se realizează astfel (pentru fiecare pixel):
Date de ieșire:
Se vor afișa pe ecran, pe câte o linie cele N * M triplete (H', S', V') obținute în urma transformării.
2 1 s 2.0 179 100 137 139 143 159
0.92194 0.88268 0.70196 0.63333 0.25157 0.62353
tema1.exe < in.txt > out.txt
./tema1 < in1 > out1
Makefile
care să conţină regulile build
şi clean
. Regula build
va compila programul într-un executabil cu numele tema1
. Regula clean
va şterge executabilul şi eventual toate binarele intermediare (fişiere obiect) generate de voi.README
care să conţină explicații privitoare la modul de rezolvare;./viewimage.sh 3