Table of Contents

Tema de casă 1 - Photo editor

Responsabili: Isabella Mincă Denisa Sandu Radu Stochițoiu

Termen de predare: 05.11.2017, ora 23:55

Obiective

În urma realizării acestei teme, studentul va fi capabil:

Menționăm că pentru testare (pe vmchecker) se folosește o mașină virtuală pe 32 de biți. Arhiva de test folosește un astfel de binar. În caz că sistemul vostru de operare de pe mașina fizică este pe 64 de biți, sugerăm să faceți testarea finală și pe o mașină (virtuală sau nu) de 32 de biți.

Introducere

Î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:

Enunţul temei

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

Cerinţa temei

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.

Exemplu

Input

2 1 s 2.0
179 100 137
139 143 159

Output

0.92194 0.88268 0.70196
0.63333 0.25157 0.62353

Precizări legate de implementarea temei

tema1.exe < in.txt > out.txt
./tema1 < in1 > out1

Testare

 ./viewimage.sh 3 

Copierea parţială sau totală a unei rezolvări din altă sursă va atrage după sine anularea punctajelor pentru toate temele de casă, atât pentru cel care a copiat, cât şi pentru sursa acestuia.