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:

  • să utilizeze funcțiile din limbajul C de citire și scriere a datelor
  • să utilizeze funcțiile matematice din C
  • să utilizeze structuri condiţionale si repetitive din C
  • să ințeleagă reprezentările RGB si HSV ale imaginilor
  • să utilizeze programul Make pentru a compila automat programele scrise

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:

  • N, M lățimea, respectiv inălțimea imaginii
  • x - factorul de modificare a caracteristicii
  • c - o literă prin care se face selectia operației aplicate
  • N * M linii pe care se află câte un triplet (R, G, B) de valori întregi intre 0 si 255

Selectarea caracteristicii care va fi modificată se realizează astfel (pentru fiecare pixel):

  • dacă litera este 'h', se va aduna la H valoarea x
  • dacă litera este 's' se va înmulți S cu valoarea x
  • dacă litera este 'v' se va înmulți V cu valoarea x

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

  • Implementarea se va face in limbajul C
  • Tema va fi compilată şi testată DOAR într-un mediu LINUX.
  • Fișierul de implementare a temei se va numi tema1.c
  • 0 < N, M < 10000
  • toate tripletele (R, G, B) sunt formate din numere întregi din intervalul [0, 255].
  • x este un număr real cu cel mult 5 zecimale.
  • În implementarea temei NU este permisă folosirea tablourilor.
  • Afişarea tripletelor (H', S', V') se va face folosind o precizie de 5 zecimale
  • Deși programul vostru va trebui să citească direct de la tastatura și să afișeze pe ecran (folosind, de exemplu, scanf și printf), puteți sa citiți datele și să le scrieți în fișiere, folosind redirectările din consolă, fără sa modificați programul. Pentru mediul Windows, dacă fișierul de intrare este in.txt, și cel de ieșire este out.txt, iar programul vostru se numește tema1.exe, veți tipări la consolă:
tema1.exe < in.txt > out.txt
  • Pentru Linux, comanda este similară:
./tema1 < in1 > out1
  • Fișierele temei trebuie OBLIGATORIU împachetate într-o arhiva de tip '.zip', cu numele 'Grupa_NumePrenume_Tema1.zip'. Această arhivă va conține:
    • Codul sursă al programului vostru.
    • Un fişier 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.
    • Un fişier README care să conţină explicații privitoare la modul de rezolvare;
    • Arhiva temei NU va conține fișiere binare;
  • Arhiva va fi trimisă atât pe vmchecker cât și pe moodle.
  • O temă care nu compilează nu va fi punctată.

Testare

  • Arhiva de testare folosită pe vmchecker va fi următoarea: checker
  • În arhiva checker.zip aveți un script pentru testarea temei (./check.sh)
  • checkerul și directoarele cu inputuri și outputuri vor fi dezarhivate în același director în care se află implementată tema, precum și fișierul Makefile
  • Pentru a vedea imaginea modificată puteți rula ./viewimage.sh N unde N este numărul testului. De exemplu pentru a vedea modificările asupra imaginii 3 se rulează:
 ./viewimage.sh 3 
  • Pentru rula script-ul viewimage.sh, urmăriţi indicaţiile din fişierul README_viewimage din arhivă

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.

programare/teme_2017/tema1_2017_ca.txt · Last modified: 2017/10/16 00:04 by isabella.minca
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