This shows you the differences between two versions of the page.
programare:teme_2017:tema1_2017_ca [2017/09/29 02:17] darius.neatu created |
programare:teme_2017:tema1_2017_ca [2017/10/16 00:04] (current) isabella.minca [Precizări legate de implementarea temei] |
||
---|---|---|---|
Line 1: | Line 1: | ||
- | Tema 1 - TODO | + | ====== Tema de casă 1 - Photo editor ====== |
+ | |||
+ | **Responsabili**: [[isabella.minca@gmail.com|Isabella Mincă]] [[denisa.sandu23@gmail.com|Denisa Sandu]] [[radu.stochitoiu@gmail.com|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 | ||
+ | |||
+ | <note warning> | ||
+ | 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. | ||
+ | </note> | ||
+ | ====== 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: | ||
+ | |||
+ | {{ :programare:teme_2017:tema1:hsvcone.gif }} | ||
+ | |||
+ | |||
+ | |||
+ | ====== 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]) : | ||
+ | |||
+ | {{ :programare:teme_2017:tema1:hue_circle.png?308x280 }} | ||
+ | |||
+ | |||
+ | Valorile trebuie sa ramană în intervalele specificate. De exemplu, dacă S = 0.8 și se dorește dublarea saturației: | ||
+ | |||
+ | <code> S' = min(2.0 * S, 1) = 1 </code> | ||
+ | |||
+ | 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]: | ||
+ | |||
+ | <code> | ||
+ | R' = R / 255 | ||
+ | G' = G / 255 | ||
+ | B' = B / 255 | ||
+ | |||
+ | Cmax = max(R', G', B') | ||
+ | Cmin = min(R', G', B') | ||
+ | |||
+ | Δ = Cmax - Cmin | ||
+ | </code> | ||
+ | |||
+ | Calculul valorii H (hue) : | ||
+ | |||
+ | |||
+ | {{:programare:teme_2017:tema1:hformula.gif?}} | ||
+ | |||
+ | Daca H este negativ, la valoarea lui H se adună 360, apoi H este normat: | ||
+ | |||
+ | <code>H = H / 360</code> | ||
+ | |||
+ | Calculul valorii S (saturation) : | ||
+ | |||
+ | {{:programare:teme_2017:tema1:sformula.gif?}} | ||
+ | |||
+ | Calculul valorii V (value) : | ||
+ | |||
+ | <code>V = Cmax</code> | ||
+ | |||
+ | 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 === | ||
+ | |||
+ | <code> | ||
+ | 2 1 s 2.0 | ||
+ | 179 100 137 | ||
+ | 139 143 159 | ||
+ | </code> | ||
+ | |||
+ | === Output === | ||
+ | |||
+ | <code> | ||
+ | 0.92194 0.88268 0.70196 | ||
+ | 0.63333 0.25157 0.62353 | ||
+ | </code> | ||
+ | |||
+ | ====== 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ă: | ||
+ | <code>tema1.exe < in.txt > out.txt</code> | ||
+ | * Pentru Linux, comanda este similară: | ||
+ | <code>./tema1 < in1 > out1</code> | ||
+ | |||
+ | * 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 [[https://elf.cs.pub.ro/vmchecker/|vmchecker]] cât și pe [[http://cs.curs.pub.ro|moodle]]. | ||
+ | * O temă care nu compilează nu va fi punctată. | ||
+ | |||
+ | ====== Testare ====== | ||
+ | * Arhiva de testare folosită pe vmchecker va fi următoarea: [[http://ocw.cs.pub.ro/courses/_media/programare/teme_2017/tema1/checker.zip|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ă: | ||
+ | <code> ./viewimage.sh 3 </code> | ||
+ | * Pentru rula script-ul viewimage.sh, urmăriţi indicaţiile din fişierul README_viewimage din arhivă | ||
+ | |||
+ | <note warning> | ||
+ | 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. | ||
+ | </note> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ |