Table of Contents

Tema 1 - Prelucrarea imaginilor

Obiective

Tema are ca scop exersarea lucrului cu noțiunile de Verilog folosite pentru proiectarea circuitelor secvențiale.

Descriere și cerințe

Implementați în Verilog un circuit secvențial sincron care prelucrează imagini RGB (cu trei canale de culoare, fiecare pe 8 biți). Imaginile au dimensiunea de 64×64 de elemente, în care fiecare element are 24 de biți (8 biți 'R', 8 biți 'G' și 8 biți 'B').

Descriere

Indiferent de formatul în care sunt stocate, imaginile digitale sunt compuse din pixeli (vezi Fig. 1 și 2). Fiecare pixel din imaginea astfel formată este un număr care reprezintă culoarea pe acea unitate. În cazul imaginilor alb-negru un pixel este stocat pe 8 biți, deci poate lua valori între 0 (reprezentând culoarea negru) și 255 (reprezentând alb), toate valorile intermediare reprezentând tonuri de gri.

Figura 1. sursa: http://hosting.soonet.ca/eliris/remotesensing/LectureImages/pixel.gif

Figura 2. sursa: https://www.spacetelescope.org/static/projects/img/imgproc_fig2.jpg

Pentru această temă, noi vom folosi imagini RGB în care un pixel este stocat pe 3 canale (Red - Green - Blue), fiecare canal reprezentând saturația culorii respective, stocată pe 8 biți. Imaginea finală este obținută prin compunerea valorilor din cele trei canale. Puteți citi mai multe despre spațiul de culoare RGB aici.

Cerințe

  1. Efectuați transformarea imaginii prin oglindire. Oglindirea va fi realizată pe verticală, relativ la rândurile imaginii.
  2. Realizați echivalentul imaginii în grayscale. Imaginea rezultantă va fi stocată pe 8 biți în canalul 'G'. Valoarea din canalul 'G' va fi calculată drept media dintre maximul si minimul valorilor din cele trei canale. După această operație, canalele 'R' și 'B' vor fi setate pe valoarea '0'. Filtrul grayscale va fi realizat pe imaginea oglindită.
  3. Transformați imaginea grayscale obținută la punctul anterior prin aplicarea unui filtru de sharpness, folosind matricea de convoluție:
  4. Cele 3 cerințe de mai sus trebuie să se comporte ca un proces continuu pe aceeași imagine. Astfel, task-ul 2 va începe automat după task-ul 1, iar task-ul 3 va începe automat după task-ul 2. Pentru a putea fi luate în considerare de tester, semnalele *_done trebuie păstrate pe 1 cel puțin un ciclu de ceas.

Cum se folosește matricea de convoluție

Fiecare pixel din imaginea nouă reprezintă rezultatul aplicării matricei de convoluție pe pixelii corespunzători din imaginea care se dorește a fi modificată. Astfel, pentru a calcula valoarea pixelului de pe poziția [i, j], vom lua în considerare matricea 3×3 din jurul acestei poziții și vom înmulți element cu element matricea obținută cu cea de convoluție (în același mod în care ați efectua înmulțirea element cu element în Matlab). Pixelul de pe poziția [i, j] din imaginea nouă va fi dat de suma acestor 9 valori.

Pentru mai multe detalii, citiți informațiile de aici.

Implementare

Automatele cu stări finite care vor modela comportamentul general trebuie implementate în modulul process, având interfața:

module process(
 input clk, // clock
 input [23:0] in_pix, // valoarea pixelului de pe pozitia [in_row, in_col] din imaginea de intrare (R 23:16; G 15:8; B 7:0)
 output [5:0] row, col, // selecteaza un rand si o coloana din imagine
 output out_we, // activeaza scrierea pentru imaginea de iesire (write enable)
 output [23:0] out_pix, // valoarea pixelului care va fi scrisa in imaginea de iesire pe pozitia [out_row, out_col] (R 23:16; G 15:8; B 7:0)
 output mirror_done, // semnaleaza terminarea actiunii de oglindire (activ pe 1)
 output gray_done, // semnaleaza terminarea actiunii de transformare in grayscale (activ pe 1)
 output filter_done // semnaleaza terminarea actiunii de aplicare a filtrului de sharpness (activ pe 1)
 );

Funcționalitatea modulului process este următoarea:

module image(
 input clk, // clock
 input[5:0] row, // selectează un rând din imagine
 input[5:0] col, // selectează o coloană din imagine
 input we, // write enable (activează scrierea în imagine la rândul și coloana date)
 input[23:0] in, // valoarea pixelului care va fi scris pe poziția dată
 output[23:0] out // valoarea pixelului care va fi citit de pe poziția dată
 );

Observații

Notare

Punctajul inițial al checker-ului nu reprezintă punctajul final al temei. Acesta va fi acordat de către asistent, în urma analizei individuale a fiecărei implementări.

Dacă tema primește 0 puncte pe platforma vmchecker, se pot acorda maxim 2 pct pentru ideea de implementare, la latitudinea asistentului. Ideea și motivele pentru care nu funcționează trebuie documentate temeinic în README și/sau comentarii. Temele care au erori de compilare vor fi notate cu 0 puncte.

Precizări

Resurse