Debruitarea Secventelor Video Achizitionate cu Camere Terahertz

Debruitarea secventelor video

achizitionate cu camere terahertz

Prezentarea camerei video

Există un mare interes pentru tehnologiile terahertz cum ar fi aplicațiile în curs de dezvoltare pentru ecranizarea (screening) de securitate in aeroporturi, pentru senzor de gaz folosit la echipamentele de stingere a incendiilor, imagistica medicală, aplicații farmaceutice, astronomie, comunicare, biologic și analiza materialelor. În acest apatiu al aplicațiilor, integrarea la o scară foarte largă in procesele tehnologice cu silicon devine o alternativa ieftina fata de tranzistorul cu o mobilitate electronica mare, dispozitive electronice cu vacuum, bolometre, micro si nanobolometre. În plus, capacitățile de înaltă frecvență ale proceselor tehnologice pe baza de silicon se imbunatatesc în mod constant prin scalare, care permite un nivel ridicat de integrare și consum scazut de energie la frecvențe superioare.

Un cip al camerei video de 1 k – pixeli pentru inregistrare video activa la temperatura camerei a fost complet integrat intr-o tehnologie CMOS de 65-nm. Cipul foloseste o resetare inedita și o arhitectura de citire cu un consum mediu de energie de numai
2,5 W / pixel.

Matricea pixelilor,care are dimensiunea 32 x 32,este formata din 1024 antene inel diferențiale on-chip cuplate la detectoare directe NMOS operate dincolo de frecvența lor de taiere bazata pe principiul de auto-amestecare distribuite rezistiv.

Acesta include selectarea pe rând și coloană și integrarea circuitelor capabile sa inregistreze un video terahertz până la 500 fps.

Cipul camerei a fost ansamblat împreună cu lentile de silicon de 41.7-dBi (măsurat la 856 GHz) într-un modul al camerei de dimensiuni 5 x 5 x 3 cm.

Acesta este conceput pentru iluminare continuă,fara a fi necesara o tehnica de blocare.

In modul video,camera opereaează până la 500 fps.

La 856 GHz atinge o responsivitate de aproximativ 115 kV / W (inclusiv un castig VGA de 5 dB) și o putere totala a zgomotului echivalent de aproximativ 12 nW integrata pe o lățime de bandă video de 500-kHz.

La o frecvență de taiere de 5-kHz (modul non-video),un singur pixel poate oferi o
responsivitate maxima Rv de 140 kV / W ,inclusiv un câștig VGA de 5-dB.

Controlerul de citire al camerei poate fi oprit, pentru a selecta un pixel permanent și de a aplica tehnici de blocare.In modul non-video,o responsivitate maxima Rv de 140 kV/W,inclusiv un castig VGA de 5 dB, si o putere de zgomot echivalenta minima au fost atinse la 856 GHz pentru o frecventa de taiere de 5 kHz. Antenele de bandă largă oferă o directivitate de 41,7-dBi la 856 GHz iar pixelii ating o lățime de bandă de 3 dB de cel puțin 790-960 GHz.Camera are un camp vizual cuprins in intervalul -23,+23 grade.

Design-ul camerei video

Senzorii de imagine vizuala CMOS detecta fotoni prin mecanismul cunoscut sub numele de efect fotoelectric interior. Deoarece siliciu cristalin este un semiconductor indirect, acest proces implică mai mult de un foton și / sau fononi în procesul de absorbție de fotoni. Numai în cazul în care energia fotonica hω este suficient de mare, se excita un electron în interiorul zonei de epuizare a foto-diodei, creând astfel un electron. Eficiența senzorilor de imagine vizuala este adesea descrisa de eficiența cuantica QE(λ), care depinde de lungimea de undă și descrie numărul de electroni generati și colectati pentru fiecare foton incident. Pentru CMOS, eficiența cuantica QE este de aproximativ 60% la 700 nm.

Din păcate, la frecvențe terahertz (0.3-3 THz sau 0,1-1 mm), energia fiecarui foton este cu aproximativ trei ordine mai mică decât în spectrul vizual (400-789 THz sau 380-750 nm), de exemplu hω = 4 MeV la 1 THz. Ca atare, efectul fotoelectric interior nu se aplică și de aceea sunt necesari mai mulți fotoni pentru a crea un singur electron, care reduce substanțial eficiența cuantică. . Prin analogie cu detectoare vizuale, randamentul cuantic pentru un detector cu raspuns patratic este legat de responsivitatea curenta a detectorului Ri, după cum urmează:

Un detector terahertz care realizează aceeași responsivitate curenta Ri ca un detector cu foto-dioda va realiza un randament cuantic de aproximativ 0,06% la 1 THz. Având în vedere acest lucru, procesul rezistiv de amestecare distribuit cu o responsivitate curenta Ri tipica de 2,5 mA / W oferă o eficienta cuantica QE de aproximativ 0,001%. Acest lucru arată în mod clar că este nevoie de un circuit de citire cu zgomot redus pentru camera terahertz.In continuare vom descrie design-ulcircuitului camerei intr-o tehnologie CMOS de 65 nm.

Arhitectura circuitului

Senzorii de imagine conventionali CMOS pentru spectrul vizual utilizează de obicei un detector cu foto-diode și necesită un tranzistor de reset separat. Spre deosebire de aceasta, schema circuitului de citire folosește tranzistorul detector NMOS pentru a reseta incarcarile acumulate ale condensatorului de integrare a reducand numărul de elemente de circuit in-pixel necesare si numărul de elemente zgomotoase nedorite conectate la nodul de detectare. In Fig. 4 este prezentata diagrama bloc a chipului camerei. Fiecare pixel activ constă dintr-un detector de bandă largă, un circuit de reset, un condensator de integrare și un pixel orb pentru compensare, urmate de un amplificator diferențial. Fiecare rând al matricei este reglat până la un moment dat și coloane sunt selectate consecutiv de un decodor rând / coloană, care este controlat de un dispozitiv programabil logic extern situat în interiorul modulului camerei. Semnalele multiplexate ale matricei poate fi citite diferențiat înaintea unui amplificator tampon on-chip. Cipul camerei video este ansamblat într-un modul compact cu un convertor analog-digital de extern, alimentat printr-o magistrală serială universală (USB). Fluxul video digital poate fi afișat pe un calculator prin intermediul unui software de captură video dedicat.

Fig. 4. Schema bloc a cipului camerei.

Detectorul Front-end(frontal ??? nu stiu exact traducerea) si circuitul de reset

Detectorul front-ent(frontal) este compus dintr-o antenă inel on-chip prezentat în Fig. 5, alimentand un detector diferențial NMOS care permite detectarea de banda larga.

Fig.5 Schema mixerului Terahertz cu antana inel si circuitul de reset.

Tranzistorul detector poate fi văzut ca o sursă de curent în paralel cu conductanța canalului M1 și un condensator de integrare C int. Integrarea /resetarea constantei de timp poate fi controlata de nivelul de tensiune al semnalului de resetare aplicat la poarta M1. Camera video a fost proiectata pentru 25 fps. Deși, acest lucru lasă suficient timp pentru integrare (40 ms per cadru), condensatorul de integrare necesar ar fi prea mare pentru a fi integrat pe cip. Zona pixelilor disponibila se potrivește doar un condensator de integrare CInt = 8 pF, cu o constanta de timp de integrare de aproximativ 0,1 s. Acest lucru poate fi atenuat prin mediere în domeniul digital pana cand camera video poate opera cadre la rate mai mari. Proiectarea fizică a antenei on-chip este prezentat în Fig. 6.

Fig.6 Geometria unui singur pixel in matrice.

Simetria furnizata de aspectul pixelilor îmbunătățește o simetrie de rotație a modelor radiații. Toate rutele de frecvență joasa necesare în centrul unui pixel sunt realizate de-a lungul intensitatii campului zero al antenei. Circuitul activ alpixelilor este găzduit în intervalul cadrului care înconjoară fiecare antenă în matrice. Siliconul cu rezistivitate scazuta ar trebui să contorizeze o pierdere suplimentară de 10% în comparație cu un substrat cu o rezistivitate mai mare. Acest lucru se datorează naturii sale de a pierde curent continuu, care nu scaleaza cu frecvență și datorită distanțelor relativ scurte ale undelor care călătoresc de-a lungul inelului și prin substrat.Eficienta radieatiei simulate a antenei este de 70-77%,de la 0.8-1 THz pe un substrat semi-infinit. Configurația antenei are o cuplare-cruce redusa de – 25 dB între toți pixelii din matrice, chiar și în absența stratului anti-reflexie.

Circuitul de citire

În ceea ce privește proiectarea circuitului de citire, principala provocare este de a atinge un nivel scăzut de consum de energie. Ar fi de preferat, prin urmare, senzori de pixeli pasivi, dar semnalul de la circuitul detectorului este prea mic și, în modul de citire a tensiunii, trebuie să fie reziliat de către o etapă de transconductanta a impedantei, făcându-l susceptibil la trecerea de zgomot în lanțul de citire. Un circuit activ al pixelilor, prin urmare, oferă o mai bună imunitate la zgomot și o amplificare în pixeli. Pentru a reduce consumul mediu de energie per pixel, numai amplificatoarele în pixeli ale unui singur rând sunt activate simultan. Fig. 7 prezintă schema părții active circuitului unor pixeli.Semnalul de selectare al randului este impartit intre un rand de pixeli,in timp ce semnalul de selectare al coloanei este impartit intre o coloana de pixeli.

Fig.7 Circuitul pixelilor cu detector

Tranzistorul detector M1 este urmat de o pereche de tranzistori de citire M3/M4 care acționează ca o pereche diferențiala cu un circuit de compensare atașat (pixel referință orb).Circuitul pixelilor de referinta orbi nu este conectat la nicio antena si,prin urmare,este folosit pentru a produce un potential de referinta.Polarizarea portii perechii de tranzistori M3/M4 este furnizata de Vant. Această tensiune este aplicată fie prin pixelul activ fie prin pixelul orb de referință. In cazul M3, această tensiune de polarizare este aplicată în continuare prin nodul comun al antenei.

Implementarea matricii si schema circuitului

Schema bloc a unității de selecție digitală este prezentata in Fig.8.Selectarea pe rând și coloană se realizează prin utilizarea adreselor pe 5-biți pentru selectarea randului si coloanei. Două auxiliar permite comutarea semnalelor de decodoare pe timpul perioadei de încărcare a condensatoarelor de integrare. . Un singur rând este polarizat la un anumit timp și perechile diferențiale din fiecare coloană impart o sarcină activa comuna (M6-M7), oferind un câștig in buclă deschisă de 50 dB per pixel.

Fig.8 Circuitul de selectie al pixelilor pentru o matrice,cu selectarea randului si coloanei

Un multiplexor controlat digital selectează un singur pixel pentru a fi tamponat în continuare de către un amplificator de unitate-câștig. Această schemă de citire permite funcționarea în paralel a 1024 de pixeli, în timp ce circuitele de citire activeaza doar un singur rând (32 de elemente). Matrice generală și circuitul de citire au fost simulate în domeniu-timp, cu ajutorul unui generator de model comportamental test. Această simulare a fost folosit pentru a emula excitația pixelilor în matrice și de a verifica timing-ul global, constanta de timp de integrare și injectarea responsabila a switch-urilor analogice.Micrografia matricii este prezentata in Fig.9.

Fig.9 Micrografia matricii

Schema cipului include stiva de metal complet (structuri metalice multi-strat gros) cu umplere inactiva care să fie conforme cu o tehnologie CMOS calificata industial.

Ansamblarea cipului si design-ul modulului camerei video

Camera terahertz este ansamblata într-o cutie de metal de dimensiuni 5 x 5 x 3 cm3 pentru a demonstra solutii de ansamblare lowcost pentru aplicații portabile. Aceasta este conectata la placa de achiziție de date prin intermediul unui singur cablu RJ45 de 8 fire.

Aceasta constă dintr-o lentilă de silicon atașata la partea din spate a cipului, un controler pentru citire implementat într-un dispozitiv de control logiccomplex programabil acționat de un generator de ceas (CLK), un amplificator de castig variabil de zgomot redus (VGA) și un suplinitor de putere așa cum este prezentată în Fig. 10.

Fig.10 Diagrama bloc a modulului camerei video

Toate componentele sunt montate pe patru placi cu circuite imprimate ansamblate. Consumul total de energie al modulul camerei este de 280 mW și câștigul VGA a fost stabilit la 5 dB, cu o lățime de bandă video de 500 kHz. Cipul a fost aliniat la centrul lentilelor și lipite împreună în timpul procesului de asamblare al cipului. Raportul dintre lățimea cipului si raza lentilei este 0,34, pentru a evita pierderile excesive de reflexie la contactul aer-silicon.

Iesirea analogica a camerei terahertz a fost prelevata 2 MSPS de catre un curent continuu alternativ extern și a fost trimisa la un calculator prin intermediul unui link USB pentru a fi afișata pe un ecran.

Software-ul dezvoltat afișează un grafic tridimensional în timp real al fluxului de date. Aceasta permite procesarea imaginilor de bază a transmisiei video începând cu un cadru de calibrare închis pentru reducerea nivelului de zgomot.

Aplicatii THz

Camerele THz sunt folosite in mai multe domenii:

-Screening-ul de securitate non invaziva in aeroport

-Agricultura: monitorizarea calitatii apei

-Controlul calitatii industriale

-Aplicații biomedicale și dentare

-Calitatea imprimarii hartiei

Altera

Nios II Altera Cyclone III 3C25

Prezentare generala:

Setul Altera Cyclone III este un chit de dezvoltare foarte complet, cu o gama larga de de aplicații integrate care implică procesarea video și panou de control tactil .

FPGA-urile Cyclone de la Altera au fost produse începând cu decembrie 2002 și sunt una din cele mai importante familii de astfel de circuite produse de această companie.

au la bază tehnologia SDRAM

conțin până la 24624 elemente logice

maxim 288Kb de memorie RAM.

Aceste FPGA-uri au drept țintă următoarele segmente ale pieței de produse electronice:

sisteme TV și DVD

rutere DSL

rețele wireless

controlul proceselor

telematică

imprimantele pentru calculatoare personale

Caracteristici:

Dispozitiv:

■ Nume de sistem: cycloneIII_3c25_niosII_video

■ Familie: Cyclone III

■ Dispozitiv: 3C25F324

■ Elemente totale logice folosite: 22875/24624 (93%)

■ Total pini folositi: 167/216 (77%)

■ Memorie total utilizata: 163270/608256 (27%)

Procesor:

■ Nios II / f core

■ Valori nominale: 113 DMIPS la 100 MHz, 1,400-1,800 LES, opțiune MMU / MPU

invalid

■ 4-kByte cache de instrucțiuni, cache de date 2-KByte

Interfețe de memorie:

■ Interfață Flash comună de memorie flash

■ 16 MBytes

■ Memorie DDR SDRAM de inalta performanta

■ Frecvență nominală: 133 MHz, 16 biți, 32 MBytes

■ Interfață serială periferica pentru card SD / MMC

■ Suportă card de memorie SD până la 1 Gbit

■ Memorie SRAM sincronă

■ 1 MByte

Interfețe de comunicare:

■ Ethernet MAC 10/100/1000 Base T

■ Primire si transmitere integrata FIFO 512 × 32 biți

■ 32 de biți de transmisie și de primire pentru acces la retea prin canale SG-DMA

■ JTAG UART cu citire și scriere FIFO integrate

■ UART pentru RS-232 de comunicare serială

■ Rată de transfer de 115200, nici o paritate, 8 biți de date, 1 bit de stop

■ Implementate folosind uz general PIOs

■ Prevazut cu interfață controler LCD

Subsistemul Video:

■ Controler LCD integrat IP

■ Configurat la 800 × 480 rezolutie

■ Implementate folosind uz general PIOs

■ Controler integrat touch panel IP

■ Generație RGB Sync IP

■ 128-byte ceas dual FIFO

Periferice de system:

■ Timere / countere

■ Timer-ul de sistem

■ Timer de înaltă rezoluție

■ 4 butoane PIOs (numai intrare)

■ 2 LED PIOs (numai ieșire)

Figura 1 prezintă blocurile funcționale ale microprocesorului Nios II 3C25 cu sistem de control LCD

Fig.1

Prezentare kit:

In figura 2, ce prezinta partea din față, avem un capac transparent care acopera ecranul LCD și ecranul tactil ce confera instalatiei un design placut.

Fig.2

In figura 3, in partea de sus a setului, se pot vedea sloturile DB15F pentru iesirea VGA dar si DB9F pentru legatura RS232 necesare pentru achizitia video, iar pentru partea audio sunt prezente sloturile pentru conectorii “Jack”.

Fig.3

Figura 4 prezinta in partea de sus slotul pentru card SD/MMC, conectorul RJ45 folosit pentru internet, dar si PS2 ce este utilizat pentru conectarea tastaturii/mouse-ului, iar in partea de jos a setului se pot observa priza USB, comutatorul de pornire/oprire a instalatiei si conectorul de alimentare.

Fig.4

Instalarea programelor pentru folosirea instalatiei Altera Cyclone III 3C25

Softurile folosite pentru rularea aplicatiei sunt Quartus II si NIOS II ce le vom utiliza pentru crearea unui sistem complet de microprocesor FPGA.

Pentru ducere la bun sfarsit a aplicatiei se vor parcurge pasii dupa cum urmeaza:

■ Se va definii o arhitectura cu un software ncorpor

■ Se va integra aceasta arhitectura in interiorul unui FPGA

■ Se va programa procesorul incorporat in limbajul C

■ Se va folosii software-ul pentru a creea un design hardware

■ Se va programa o aplicatie grafica

Concepte generale ale limbajului MATLAB

Limbajul MATLAB este un limbaj de inalta performanta pentru proiectarea asistata pe calculator.MATLAB este in acelasi timp un limbaj de programare si un system de dezvoltare care integreaza calculul,vizualizarea si programarea intr-un mediu usor de utilizat,probleme si solutiile acestora fin exprimate intr-un limbaj matematic accesibil.

MATLAB este utilizat in domenii precum matematica si calculul numeric,dezvoltarea algoritmilor,modelare si simulare,analiza si vizualizarea datelor,grafica inginereasca,dezvoltare de aplicatii,inclusive GUI.

Sistemul MATLAB consta in cinci parti principale:limbajul MATLAB,mediul de lucru MATLAB,Handle Graphics,biblioteca de functii matematice a MATLAB-ului si interfata de aplicatii program a MATLAB-ului(API).

Mediul de lucru MATLAB reprezinta un set de facilitate ce permit manevrarea variabilelor in spatiul de lucru,importul si exportul de data,dezvoltarea,manipularea,editarea si depanarea fisierelor MATLAB,care au extensia .m, si a aplicatiilor MATLAB. Reprezinta sistemul grafic al MATLAB-ului si cuprinde comenzi de nivel inalt pentru vizualizarea datelor bi si tri-dimensionale,procesarea imaginilor,animatie.Acesta permite si utilizarea unor comenzi de nivel scazut pentru crearea unor interfete grafice GUI.

Biblioteca de functii matematice a MATLAB-ului reprezinta o colectie complexa de algoritmi de calcul pornind de la functii elementare,de exemplu sinus,cosinus etc.,pana la functii sofisticate,de exeplu inversarea unei matrice,voloarea proprie etc.

Interfata de aplicatii program a MATLAB-ului(API) este o biblioteca ce permite scrierea de programe in C sau Fortran care interactioneaza cu MATLAB-ul.Aceasta include facilitate pentru apelarea rutinelor din MATLAB,apelarea MATLAB-ului ca masina de calcul,scrierea si citirea fisierelor de tip .mat.

MATLAB-ul lucreaza cu expresii matematice care implica la scara larga lucrul cu matrici.Expresiile matematice sunt alcatuite cu ajutorul urmatoarelor tipuri:variabile,numere,operatori,functii.

Variabilele

MATLAB-ul nu necesita declararea variabilelor deoarece atunci cand intalneste un nou nume de variabila,acesta genereaza automat variabila respective si aloca sapatiul necesar de memorie.La declararea variabilelor,MATLAB-ul face distinctie intre literele mici si cele mari.

De exemplu, a = 30 creeaza o matrice 1 x 1 cu numele a si stocheaza valoarea acesteia,30,intr-o singura locatie corespunzatoare singurului element al matricei.

Numere

MATLAB-ul utilizeaza notatia zecimala,cu punct zecimal optional si cu semn + sau -.Se utilizeaza si notatia stiintifica cu litera e pentru a specifica o putere a lui 10.Reprezentarea numerelor imaginare este realizata cu litera i sau j ca suffix.

Exemple de numere in MATLAB:

4 -52 0.0207

8.5900216 6.90713e-18 2.00159e13

2i -3.41193j 7e3i

Operatori

Expresiile utilizeaza operatori aritmetici uzuali:

+ Adunare

– Scadere

* Inmultire

/ Impartire

^ Ridicarea la o putere

( ) Operatorul de specificare a ordinii de evaluare

Functii

MATLAB-ul furnizeaza un mare numar de functii matematice elementare standard,de exemplu abs,sqrt,exp,sin etc.O parte din functii sunt de tip built-in,adica sunt o parte a nucleului MATLAB.Acestea au o mare eficienta,dar detaliile constructive nu sunt accesibile utilizatorului.Alte functii sunt implementate ca fisiere MATLAB si pot fi modificate.

Cateva functii furnizeaza valori unor constante universale:

pi are valoarea 3.14159

I sau J reprezinta valoarea imaginara si are valoarea -1

Realmin reprezinta cel mai mic numar real in virgula mobila si are valoarea 2-1022

Realmax reprezinta cel mai mare numar real in virgula mobila si are valoarea 21022

Inf reprezinta infinitul

nu este un numar

Concepte generale ale limbajului C

Limbajul C este un limbaj structurat pe funcții. O funcție poate fi considerată un subprogram, ea este declarată atribuindu-se un nume, iar apoi este apelată cu ajutorul numelui și cu parametrii specificați. La apelul funcției se execută instrucțiunile din interiorul acesteia.

Orice program scris în C trebuie să aibă o funcție “main”, funcție la care se face referire și prin “programul principal”. În momentul rulării programului scris, instrucțiunile din această funcție vor începe automat să se execute, la terminarea lor care implică și ieșirea din funcția main, programul se termină.

Exemplu de program doar cu funcția main și fără nici o instrucțiune:

Acesta poate fi considerat un program, însă el nu face nimic.

Din interiorul acestui program pot fi apelate alte funcții, apriori definite, spre exemplu:

După cum se observă, caracterele { și } sunt folosite pentru începerea unui bloc de instrucțiuni și pentru închiderea blocului.

Instrucțiunile pot fi atribuiri, operații matematice (adunare, scădere, înmulțire, împărțire, ridicare la putere, etc). O instrucțiune trebuie să aibă cel puțin un operator. Acești operatori sunt variabile sau constante. Orice variabilă trebuie să aibă un tip de date. Tipurile de date din C sunt prezentate în tabelul 3.1.

Tabelul 3.1 Tipuri de date în C

Declararea variabilelor se face punând înaintea numelui ales tipul de date. La declararea variabilelor se poate specifica și valoarea inițială a acestora.

Cu aceste variabile se pot face aproape orice fel de operații. Pentru a face o operație cu 2 sau mai mulți operatori, tipul acestora nu trebuie să fie același, dar valoarea ce va fi introdusă în variabila care păstrează rezultatul va fi convertită la tipul de date al acestei variabile.

Mai multe valori de același tip de date pot fi reunite într-un vector, care poate fi considerat ca o mulțime de numere de acelasi tip. Exemplu de declarare și inițializare a unor vectori.

Exemplu de declarare a unui șir de caractere:

Pe lângă variabile și funcții, o altă componentă foarte importantă a limbajului C sunt structurile decizionale și cele repetitive.

Structura decizională if

Se evaluează logic valoarea expresiei de după if. Dacă rezultatul evaluării logice este adevărat se va executa instructțiunea din primul bloc de instrucțiuni, în caz contrar se va executa cealălaltă. Niciodată nu se vor executa ambele în același timp.

Structura repetitivă “for”. Sintaxa este puțin mai complexă decât la if. Structura for conține o inițializare de variabilă, o condiție de continuare, și o incrementare.

Acest bloc de cod va avea ca rezultat calculul lui 20 factorial, care va fi pus în variabila n. Acest bloc se va repeta de 19 ori.

Operația ++ este o operație de incrementare, și are ca efect incrementarea lui i cu 1.

Structura repetitivă “while” este similară cu for doar că în sintaxa ei are doar condiția de ieșire din buclă.

Acest bloc de cod are același efect cu cel de mai sus, cu singura diferență că a fost folosită structura repetitivă while în loc de for.

Structura “do” . Este similară cu for și cu while cu singura deosebire că și atunci când condiția de continuare nu este satisfăcută de la început, instrucțiunile din blocul de instrucțiuni al structurii repetitive do vor fi executate cel puțin o dată.

Imagini

Imaginile sunt semnale,functii definite pe domeniul spatial.

O imagine este o structura bidimensionala de date.Un element al unei imagini se numeste pixel.

Datele unei imagini pot fi numere naturale,reale sau complexe,reprezentate pe un numar finit de biti.Dupa tipul datelor,imaginile pot fi impartite in mai multe categorii:

Imagini scalare,in care fiecare componenta este un scalar.Imaginile monocrome si imaginile cu mai multe nivele de gri sunt exemple de imagini scalare.

Imagini vectoriale,in care fiecare componenta este un vector de numere.Imaginile color reprezinta un caz particular care prezinta cel mai mult interes.Vectorul are trei elemente ce corespund celor trei constituente de baza al oricarei culori.

Valoarea unui element al unei imagini este o masura a intensitatii luminoase in punctual considerat.Dupa natural or,imaginile pot fi clasificate in imagini abstracte,imagini non-vizibile si imagini vizibile.

Imaginile abstracte sunt functii matematice,continue sau discrete,de doua variabile.

Imaginile non-vizibile,care nu pot fi percepute in mod direct de catre ochiul uman,sunt achizitii ale unor campuri bidimensionale de parametri fizici.

Imaginile vizibile,ce pot fi percepute in mod direct de catre ochiul uman,sunt imagini optice generate ca distributii de intensitate luminoasa sau imagini propriu-zise.

Dupa semnificatia care se da valorii numerice a pixelilor,se disting imagini indexate si imagini de intensitate.

Imaginea de intensitate este o imagine in care valoarea fiecarui pixel este o masura directa a intensitatii luminoase.Pixelii unei imagini de intensitate pot avea orice fel de valori,reale sau naturale.

Imaginea indexata este o imagine in care valoarea fiecarui pixel este un indice prin care se regaseste informatia de culoare asociata pixelului respectiv.Pixelii unei imagini indexate pot avea valori naturale.

Histograma unei imagini

Histograma unei imagini reprezinta frecventa relativa de aparitie a nivelelor de gri din imagine.Pentru o imagine f,de dimensiune M x N pixeli,histograma se defineste astfel:

unde functia δ este definita in urmatorul mod:

Altfel spus,histograma unei imagini este o functie care indica pixelii care au un anume nivel de gri.Un pixel este reprezentat pe 1 byte.De obicei,numarul nivelelor de gri este 255.

La o analiza a histogramei diverselor tipuri de imagini,se constata ca,de obicei,o imagine are mai multe niveluri de gri si prezinta doua maxime locale.Folosind aceasta caracteristica se poate face o segmentare cu prag a imaginii initiale,alegand pragul ca fiind minimul local dintre cele doua puncte de maxim.Astfel,pixelii cu nivel de gri mai mic decat pragul ales pot fi considerati ca fiind fundalul.Acestor pixeli li se atribuie valoarea corespunzatoare negrului.Pixelii pentru care nivelul de gri este mai mare decat pragul ales sunt pixelii obiectului.

Binarizarea

Binarizarea sau praguirea (thresholding) imaginilor este un caz special al intinderii maxime a contrastului. Rezultatul operatiei de binarizare este o imagine care contine doar doua nivele de gri: alb si negru. Pentru imagini in tonuri de gri, operatia de binarizare se scrie matematic astfel:

unde L reprezinta numarul de nivele pe care se face cuantizarea tonurilor de gri. Cazul cel mai frecvent este L = 256, pentru o cuantizare pe 8 biti, x luand valori in intervalul [0,255], iar T este o valoare de prag, reprezentand o valoare intreaga din intervalul [0,L).

Pentru imaginile color, binarizarea se poate face in urmatorul mod:

unde v este un vector tridimensional ce reprezinta culoarea pixelului (de exemplu v=(R,G,B) ), iar Y(v) reprezinta luminanta (Y=0.3R+0.6G+0.1B).

In urma acestei transformari contrastul este maximizat la nivelul intregii imagini.

– Realizare Practică –

Prezentare

Experimentul presupune dezvoltarea unor aplicatii pentru prelucrarea imaginilor,in limbajele de programare Matlab si C++,pentru camera video TeraHertz,STMicroelectronics.Din cauza faptului ca nu dispunem de acest dispozitiv,ne vom folosi de un fisier video pus la dispozitie de catre STMicroelectronics.Dupa realizarea aplicatiilor vom folosi kit-ul de dezvoltare Altera Cyclone III 3C25,care va comunica direct cu camera video.

Modul de lucru

Pentru inceput vom crea un program in Matlab care extrage,intr-un fisier text,matricea fiecarui frame al fisierului video ThzMovieRichard.wmv .

Este necesara citirea fisierului video ThzMovieRichard.wmv ce urmeaza a fi prelucrat.

filename=' D:\aaa\franta\facultate ISEP\ISEP\m\THzCam\ THzMovieRichard.wmv';

mov = VideoReader(filename);

Vom citi numarul frame-urilor din fisierul video.

numFrames = mov.NumberOfFrames;

Pentru obtinerea matricei fiecarei imagini se va folosi o bucla “for” prin care parcurgem fisierul video.

Citim frame-ul curent.

currFrame = read(mov, t);

Tranformam imaginea color intr-o imagine cu nuanta de gri si modificam dimensiunile acesteia la 240 x 240.Convertim elementele matricei imaginii la unsigned integer pe 8 biti.

grayFrame = currFrame(1:end,100:339);

figure(1), imagesc(grayFrame), colormap(gray);

img=uint8(grayFrame);

[h w]=size(img);

In figurile …. sunt prezentate imaginile originale si imaginile prelucrate.(numarul 585 si nr 515)

Creem un fisier text in care se vor scrie matricile imaginilor.

fid = fopen('data.txt','wt')

Vom folosi o noua bucla “for” care va scrie elementele de pe linii si coloane, ale fiecarei matrici.

for i= 1:h

for j=1 :w

fprintf( fid,'%d ',img(i,j));

end

fprintf(fid,'\n');

end

Dupa parcurgerea acestei bucle “for’ se vor salva datele scrise in fisierul text.

fclose(fid)

Codul folosit pentru extragerea matricilor din fisierul video este:

clc;

close all;

clear all;

% assigning the name of sample video file to a variable

filename ='D:\aaa\franta\facultate ISEP\ISEP\m\THzCam\THzMovieRichard.wmv'

%reading a video file

mov = VideoReader(filename);

%getting no of frames

numFrames = mov.NumberOfFrames;

fid = fopen('data.txt','wt')

%for loop to traverse & process from frame '1' to 'last' frames

for t = 1 : numFrames

currFrame = read(mov, t); %reading individual frames

%transform the color image in a gray image and convert it to

%dimensions 240×240

grayFrame = currFrame(1:end,100:339);

figure(1), imagesc(grayFrame), colormap(gray);

img=uint8(grayFrame);

[h w]=size(img);

for i= 1:h

for j=1 :w

fprintf( fid,'%d ',img(i,j));

end

fprintf(fid,'\n');

end

fprintf(fid,'\n');

end

fclose(fid)

Pentru a dezvolta in continuare aplicatia,este necesara creerea unui program C++ care citeste fisierul obtinut anterior si il scrie intr-un alt fisier text.Acest lucru este necesar pentru a trece de la mediul Matlab la NIOS.

Vom citi fisierul creat in Matlab.

ifstream in("data.txt ");

Vom crea un nou fisier de tip text pregatit pentru a scrie continutul fisierului anterior.

ofstream out("data2.txt");

Declaram o variabila de tip string,cu ajutorul careia vom parcurge,prin instructiunea repetitiva “while”,fisierul text “data.txt”.

string s;

while(getline(in, s))

out << s << "\n";

Codul C++ folosit este urmatorul:

#include "stdafx.h"

#include <string>

#include <fstream>

using namespace std;

unsigned char main() {

ifstream in("data.txt"); // Open for reading

ofstream out("data2.txt"); // Open for writing

string s;

while(getline(in, s)) // Discards newline char

out << s << "\n"; // … must add it back

}

Pentru a implementa programul anterior pe placa FPGA ne folosim de soft-urile Quartus II si NIOS II IDE.

II Scrierea și compilarea unui program folosind Quartus II:

Pornirea aplicației Quartus

După instalare, iconița Quartus II ar trebui să apara pe desktop. Pentru pornirea software-ului va se da un dublu clic pe iconiță și se va aștepta până când apare fereastra cu numele Quartus II.

Prima fereastra care va fi afișată după deschiderea mediului de programare Quartus II este fereastra Getting Started With Quartus II Software.

Fig.5

Crearea unui nou program

Pentru crearea unui nou proiect se selectează opțiunea Create a New Project din fereastra Getting Started With Quartus II Software. În fereastra care se deschide se selectează directorul de lucru pentru proiect, se introduce un nume pentru proiectul curent, apoi se introduce un nume pentru entitatea principală a proiectului. Se dă clic pe butonul Next pentru a continua.

În următoarea fereastra se pot include în proiect fișiere de design existente și / sau să se specifice librării noi. Pentru a continua se dă clic pe butonul Next.

În cea de-a treia fereastră a wizardului se selectează dispozitivul hardware utilizat. La Device family se selectează Cyclone III, la Target device se selectează Specific device selected in „Available devices” list, iar in zona Show in „Available device” list se selectează pentru Package – Any, pentru Pin count – 324, iar pentru Speed grade se va selecta Any. Din zona Available devices se va selecta circuitul EP3C25F324C6, acesta fiind circuitul de pe plăcile de dezvoltare Cyclone III Starter Kit.

Pentru a finaliza crearea noului program se va apasa butonul Finish.

Implementarea schemei

După crearea noului proiect se intră în fereastra de lucru a mediului de dezvoltare Quartus II.

Pentru a putea implementa o schemă nouă, va trebui creat un fișier nou, de tipul Block Diagram / Schematic File. Pentru aceasta, din meniul File al mediului de dezvoltare se alege opțiunea New. Din fereastra nou deschisă se alege opțiunea Block Diagram / Schematic File din cadrul opțiunii Design Files. Dând clic pe butonul OK se va deschide foaia de lucru pentru introducerea schemei.

Se va salva fișierul cu schema bloc prin selecția opțiunii Save as… din meniul File al mediului de dezvoltare Quartus II.

In continuare definim sistemul cu microprocesor cu ajutorul SOPC builder, din meniul Tools de unde se va alege obtiunea SOPC Builder.

Fig.6

Va aparea fereastra Create New System in care vom salva numele noului sistem, iar la sectiunea Target HDL se va selecta obtiunea Verilog. Dupa apasarea butonului OK vom avea noul sistem unde o sa inseram componentele ce il vor definii.

Prima componenta introdusa se va afla in submeniul Altera SOPC Builder unde se selecteaza Nios II Processor si se va alege cel mai mic dintre ele asa cum se vede in figura urmatoare, iar dupa selectare se va actiona butonul Finish. Urmatorul pas este introducerea memoriilor interne din submeniul Memories and memory Controller, dam click pe On-Chip, iar apoi pe On chip memory unde se va alege un total de memorie alocata de 32 Kbytes.

Urmatoarea componenta este introducerea unui periferic de comunicare care sa faca legatura intre PC si hardware prin portul de depanare JTAG, mergand pe submeniul Interface protocul, iar apoi pe serial si in cele din urma pe JTAG UART. Se utilizeaza parametrii standard si se actioneaza Finish.

Cea dea treia componenta este utilizata pentru a conecta LED-urile si se bazeaza pe introducerea unui controler de intrari/iesiri paralele (PIO). Se selecteaza Peripherals, apoi Microcontroller Peripherals si in cele din urma PIO. In fereastra nou aparuta la sectiunea Width vom selecta 4 biti, iar la Direction se selecteaza Output ports only, iar la final se actioneaza butonul Finish. Aceasta ultima componenta (PIO) se redenumeste LED_PIO.

Dupa finalizarea introducerii celor trei componente sistemul va arata ca cel din urmatoarea figura:

Fig.7

Pentru a aloca automat adresa de baza a componentelor o sa mergem la meniul System, Auto-Assign Base Addresses si vom actiona butonul Generate.

Fig.8

Atunci cand generalizarea sistemului a fost finalizata cu succes fereastra actuala o vom inchide si ne intoarcem la programul Quartus II. Vom da dublu-click pe partea hasurata a imaginii unde introducem 2 pini de intrare pe care ii redenumim CLK si RESET si unul singur de iesire ce va suferii si el o modificare a numelui in LED[3..0]. Dupa finalizarea redenumirii se va merge la meniul Processing si se va selecta Start Compilation.

Fig.9

Fig.10

Crearea si rularea unui program C

Pentru a face posibila continuarea aplicatiei noastre este nevoie de instalarea si ruralea software-ului ALTERA NIOS II IDE.

Fig.11

Mediul de dezvoltare integrat NIOS II IDE este un software grafic de dezvoltare pentru familia de procesoare intregrate NIOS II. Acest software ofera o platforma de dezvoltare consistenta care functioneaza pentru toate sistemele procesoarelor NIOS II. Se pot realiza tote procesele de dezvoltare inclusiv de editare, de construire, si depanare. IDE permite crearea de aplicatii complexe bazate pe un sistem de operare in timp real (RTOS).

Pentru a incepe lucrul in software-ul NIOS II IDE este necesar sa se parcurga urmatorii pasi, in ordinea data. Se merge pe butonul START la folderul Altera, iar apoi se va da dublu-click pe fisierul NIOS II IDE.

Crearea unui nou proiect

Odata pornit softwareul, pentru a rula o noua aplicatie, se va merge la meniul File si se va da click pe New C/C++ Application.

In noua fereastra aparuta ,la sectiunea Name se va scrie numele noii aplicatii, la sectiunea SOPC Builder System se va alege folderul in care a fost incarcat sistemul lucrat in programul Quartus II, iar la Select Project Template se va alege proiectul cu numele dat mai sus. Dupa terminarea tuturor pasilor se va da click pe butonul Finish.

Construirea proiectului

Prin construirea unui proiect NIOS II IDE se compileaza si se creaza legaturi intre toate codurile sursa asociate proiectului si bibliotecilor sale.

Pentru a incarca programul in memorie este nevoie sa creem o biblioteca si mai exact va trebui sa dam click dreapta pe folderul cu numele „nume aplicatie”_syslib[sys], din cele trei nou aparute in fereastra nostra, unde se va merge la Properties. Aici se va selecta optiunea Small C library si se va da OK. Odata finalizati pasii se va selecta Built Project.

Rularea aplicatiei

Dupa obtinerea unei ferestre ca cea din figura …… vom da dublu-click pe NIOS II Hardware pentru alegerea sistemului nostru, apoi se va apasa pe butonul Run.

Odata finalizada rularea, rezultatul obtinut se va sterge si se vom scrie codul nostru in limbajul C++ dupa care vom actiona butonul Run.

In continuare vom crea un program in Matlab cu ajutorul caruia vom salva imaginile fisierului video ThzMovieRichard.wmv.Aceste imagini vor fi prelucrate prin diferite metode.

Vom crea un folder in care vor fi salvate imaginile.

opFolder = fullfile(cd, 'imagini’);

if ~exist(opFolder, 'dir')

mkdir(opFolder);

end

Intr-o bucla “for” vom parcurge fiecare frame,transformat in imagine cu nuanta de gri,de dimensiuni 240 x 240,al fisierului video.Vom salva aceste frame-uri in formatul “.bmp”.

opBaseFileName = sprintf('%3.3d.bmp', t);

opFullFileName = fullfile(opFolder, opBaseFileName);

imwrite(grayFrame, opFullFileName, 'bmp');

Codul Matlab folosit este:

clc;

close all;

clear all;

% assigning the name of sample video file to a variable

filename ='D:\aaa\franta\facultate ISEP\ISEP\m\THzCam\THzMovieRichard.wmv';

%reading a video file

mov = VideoReader(filename);

% Defining Output folder as 'imagini'

opFolder = fullfile(cd, 'imagini');

%if not existing

if ~exist(opFolder, 'dir')

%make directory & execute as indicated in opfolder variable

mkdir(opFolder);

end

%getting no of frames

numFrames = mov.NumberOfFrames;

numFramesWritten = 0;

%for loop to traverse & process from frame '1' to 'last' frames

for t = 1 :numFrames

currFrame = read(mov, t); %reading individual frames

grayFrame = currFrame(1:end,100:339);

opBaseFileName = sprintf('%3.3d.bmp', t);

opFullFileName = fullfile(opFolder, opBaseFileName);

imwrite(grayFrame, opFullFileName, 'bmp'); %saving as 'bmp' file

%indicating the current progress of the file/frame written

numFramesWritten = numFramesWritten + 1;

figure(1), imagesc(grayFrame), colormap(gray);

img=uint8(grayFrame);

[h w]=size(img);

end

Imaginile obtinute cu ajutorul codului anterior vor fi binarizate prin mai multe metode.

O prima metoda este bazata pe media temporala.

Initializam media temporala cu 0.

tempMean = 0;

Cu ajutorul instructiunii “for” vom parcurge toate imaginile din folder.

Vom calcula media imaginilor care este egala cu numarul de imagini impartit la dimensiunile imaginilor.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

imgMean = sum(sum(currImage))/(240*240);

tempMean = tempMean+imgMean;

figure(1), imagesc(currImage), colormap(gray);

end

Media temporala se va calcula astfel:

tempMean = 1.05*tempMean/997;

Intr-o bucla “for” vom binariza imaginile apoi le vom afisa.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

binImage = (currImage>tempMean);

figure(1), imagesc(binImage), colormap(gray);

end

Codul folosit pentru metoda bazata pe media temporala este:

function metoda1()

clc;

close all;

clear all;

%%%%%%%%% metoda bazata pe media temporala %%%%%%%%%%%%%

numImages = 997;

tempMean = 0;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

imgMean = sum(sum(currImage))/(240*240);

tempMean = tempMean+imgMean;

figure(1), imagesc(currImage), colormap(gray);

end

tempMean = 1.05*tempMean/997;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

binImage = (currImage>tempMean);

figure(1), imagesc(binImage), colormap(gray);

end

Rezultatele binarizarii sunt prezentate in figurile….

A doua metoda este bazata pe histograma temporala.

Intr-o bucla “for” parcurgem toate imaginile din folder apoi vom calcula histograma si media imaginilor.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

currImage = histeq(currImage,2);

imgMean = sum(sum(currImage))/(240*240);

tempMean = tempMean+imgMean;

figure(1), imagesc(currImage), colormap(gray);

end

Media temporala bazata pe histograma imaginilor se va calcula astfel:

tempMean = 1.07*tempMean/997;

Intr-o bucla “for” vom binariza imaginile si le vom afisa.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

binImage = (currImage>tempMean);

figure(1), imagesc(binImage), colormap(gray);

end

Pentru metoda bazata pe histograma temporala vom folosi urmatorul cod:

function metoda2()

clc;

close all;

clear all;

%%%%%%%%%%%%%%% metoda bazata pe histograma temporala %%%%%%%%%%%%%

numImages = 997;

tempMean = 0;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

currImage = histeq(currImage,2);

imgMean = sum(sum(currImage))/(240*240);

tempMean = tempMean+imgMean;

figure(1), imagesc(currImage), colormap(gray);

end

tempMean = 1.07*tempMean/997;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

binImage = (currImage>tempMean);

figure(1), imagesc(binImage), colormap(gray);

end

In figurile … si … sunt prezentate imaginile binarizate.

A treia metoda este bazata pe timpul maxim de praguire.

Initializam timpul maxim si timpul minim.

tempMax = 0;

tempMin = 1000;

Intr-o bucla “for” parcurgem toate imaginile din folder si calculam minumul si maximul.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

minImg = min(min(currImage));

maxImg = max(max(currImage));

if (minImg<tempMin)

tempMin = minImg;

end

if (maxImg>tempMax)

tempMax = maxImg;

end

end

Intr-o alta bucla “for” vom binariza imaginile si le vom afisa.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

binImage =(currImage>tempMax/2.25);

blockImage = imresize(currImage, [32 32]);

binBlock = (blockImage>tempMin);

binScaledImage = imresize(binBlock, [240 240]);

figure(1), imagesc(binImage), colormap(gray);

end

Pentru aceasta metoda,codul este:

function metoda3()

clc;

close all;

clear all;

%%%%%%%%% metoda bazata pe timpul maxim de praguire %%%%%%%%%%%%

numImages = 997;

tempMax = 0;

tempMin = 1000;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

minImg = min(min(currImage));

maxImg = max(max(currImage));

if (minImg<tempMin)

tempMin = minImg;

end

if (maxImg>tempMax)

tempMax = maxImg;

end

end

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

binImage =(currImage>tempMax/2.25);

blockImage = imresize(currImage, [32 32]);

binBlock = (blockImage>tempMin);

binScaledImage = imresize(binBlock, [240 240]);

figure(1), imagesc(binImage), colormap(gray);

end

In figurile …. si … sunt prezentate rezultatele binarizarii.

A patra metoda este bazata pe timpul maxim de praguire printr-un filtru median.

Initializam timpul maxim si timpul minim.

tempMax = 0;

tempMin = 1000;

Intr-o bucla “for” parcurgem toate imaginile din folder si calculam minumul si maximul.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

currImage = currImage(1:208,1:224);

minImg = min(min(currImage));

maxImg = max(max(currImage));

if (minImg<tempMin)

tempMin = minImg;

end

if (maxImg>tempMax)

tempMax = maxImg;

end

end

Intr-o alta bucla “for” vom binariza imaginile si le vom afisa.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

currImage = currImage(1:208,1:224);

binImage =(currImage>tempMax/2.25);

binImageFilt = medfilt2(binImage);

binImageFilt = medfilt2(binImageFilt);

binImageFilt = binImageFilt(1:9:end,1:10:end)

binScaledImage = imresize(binImageFilt, [240 240]);

figure(1), imagesc(binImageFilt), colormap(gray);

end

Codul utilizat pentru cea de-a patra metoda este:

function metoda4()

clc;

close all;

clear all;

%%%%%%%%%%%%%%% temp max thresholding %%%%%%%%%%%%%%%%%%%

numImages = 997;

tempMax = 0;

tempMin = 1000;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

currImage = currImage(1:208,1:224);

minImg = min(min(currImage));

maxImg = max(max(currImage));

if (minImg<tempMin)

tempMin = minImg;

end

if (maxImg>tempMax)

tempMax = maxImg;

end

end

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

currImage = currImage(1:208,1:224);

binImage =(currImage>tempMax/2.25);

binImageFilt = medfilt2(binImage);

binImageFilt = medfilt2(binImageFilt);

binImageFilt = binImageFilt(1:9:end,1:10:end)

binScaledImage = imresize(binImageFilt, [240 240]);

figure(1), imagesc(binImageFilt), colormap(gray);

end

Rezultatele binarizarii sunt prezentate in figurile … si … .

A cincea metoda este…

Initializam media temporala cu 0.

tempMean = 0;

Intr-o bucla “for” parcurgem imaginile din folder apoi calculam histograma si blockmean imaginilor.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

blockImage = imresize(currImage, [32 32]);

blockHist = histeq(blockImage,2);

blockMean = sum(sum(blockImage))/(32*32);

tempMean = tempMean+blockMean;

%figure(1), imagesc(currImage), colormap(gray);

end

Media temporala se calculeaza:

tempMean = 1.07*tempMean/997;

Intr-o alta bucla “for” binarizam imaginile apoi le afisem.

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

blockImage = imresize(currImage, [32 32]);

binBlock = (blockImage>tempMean);

binScaledImage = imresize(binBlock, [240 240]);

figure(1), imagesc(binScaledImage), colormap(gray);

end

Codul folosit pentru aceasta metoda este urmatorul:

function metoda5()

clc;

close all;

clear all;

numImages = 997;

tempMean = 0;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

blockImage = imresize(currImage, [32 32]);

blockHist = histeq(blockImage,2);

blockMean = sum(sum(blockImage))/(32*32);

tempMean = tempMean+blockMean;

figure(1), imagesc(currImage), colormap(gray);

end

tempMean = 1.07*tempMean/997;

for i = 1 : numImages

filename = sprintf('%03d.bmp',i);

currImage = imread(filename);

blockImage = imresize(currImage, [32 32]);

binBlock = (blockImage>tempMean);

binScaledImage = imresize(binBlock, [240 240]);

figure(1), imagesc(binScaledImage), colormap(gray);

end

Rezultatele binarizarii sunt prezentate in figurile … si … .

– Bibliografie –

P.Siegel, “Terahertz technology”,IEEE Trans. Microwave Theory Tech, vol. 50, no.3, Mar.2002.

U. Pfeiffer, “ESSCIRC plenary: Terahertz imaging with CMOS/

BiCMOS process technologies,” in 2010 Eur. Solid-State Circuits

Conf. (ESSCIRC), , Sep. 2010.

E. Öjefors, N. Baktash, Y. Zhao, R. Al Hadi, H. Sherry, and U. Pfeiffer,“Terahertz imaging detectors in a 65-nm cmos soi technology,” in 2010Eur. Solid-State Circuits Conf. (ESSCIRC), Seville, Spain, Sep. 2010

H. Sherry, J. Grzyb, Y. Zhao, R. A. Hadi, A. Cathelin, A. Kaiser, and U. Pfeiffer, “A 1 k-pixel CMOS camera chip for 25 fps real-time terahertz imaging applications,” in 2012 IEEE Int. Solid-State Circuits Conf. (ISSCC) Dig. Tech. Papers, Feb. 2012

H. Sherry, R. Al Hadi, J. Grzyb, E. Öjefors, A. Cathelin, A. Kaiser, and U. R. Pfeiffer, “Lens-integrated THz imaging arrays in 65 nm CMOS technologies,” in IEEE Radio Freq. Integr. Circuits (RFIC) Symp.Dig., Jun. 2011

L. Samoska, “An overview of solid-state integrated circuit amplifiers in the submillimeter-wave and THz regime,” IEEE Trans. Terahertz Sci. Technol., vol. 1, no. 1, pp. 9–24, Sep. 2011.

Cartea tehnica a instalatiei Altera Cyclone III 3C25

TOTUL DESPRE C SI C++ , Kris Jamsa & Lars Kland

http://www.mathworks.com

http://www.altera.com

N. SANTITISSADEEKORN AND E.M.BOLLT, “IMAGE EDGE RESPECTING DENOISING WITH EDGE DENOISING BY A DESIGNER NONISOTROPIC STRUCTURE TENSOR METHOD”, COMPUTATIONAL METHODS IN APPLIED MATHEMATICS, Vol.9(2009)

Prof. univ. dr. ing. Florica Moldoveanu, Tehnici de imnunatatire si restaurare a imaginilor

– Bibliografie –

P.Siegel, “Terahertz technology”,IEEE Trans. Microwave Theory Tech, vol. 50, no.3, Mar.2002.

U. Pfeiffer, “ESSCIRC plenary: Terahertz imaging with CMOS/

BiCMOS process technologies,” in 2010 Eur. Solid-State Circuits

Conf. (ESSCIRC), , Sep. 2010.

E. Öjefors, N. Baktash, Y. Zhao, R. Al Hadi, H. Sherry, and U. Pfeiffer,“Terahertz imaging detectors in a 65-nm cmos soi technology,” in 2010Eur. Solid-State Circuits Conf. (ESSCIRC), Seville, Spain, Sep. 2010

H. Sherry, J. Grzyb, Y. Zhao, R. A. Hadi, A. Cathelin, A. Kaiser, and U. Pfeiffer, “A 1 k-pixel CMOS camera chip for 25 fps real-time terahertz imaging applications,” in 2012 IEEE Int. Solid-State Circuits Conf. (ISSCC) Dig. Tech. Papers, Feb. 2012

H. Sherry, R. Al Hadi, J. Grzyb, E. Öjefors, A. Cathelin, A. Kaiser, and U. R. Pfeiffer, “Lens-integrated THz imaging arrays in 65 nm CMOS technologies,” in IEEE Radio Freq. Integr. Circuits (RFIC) Symp.Dig., Jun. 2011

L. Samoska, “An overview of solid-state integrated circuit amplifiers in the submillimeter-wave and THz regime,” IEEE Trans. Terahertz Sci. Technol., vol. 1, no. 1, pp. 9–24, Sep. 2011.

Cartea tehnica a instalatiei Altera Cyclone III 3C25

TOTUL DESPRE C SI C++ , Kris Jamsa & Lars Kland

http://www.mathworks.com

http://www.altera.com

N. SANTITISSADEEKORN AND E.M.BOLLT, “IMAGE EDGE RESPECTING DENOISING WITH EDGE DENOISING BY A DESIGNER NONISOTROPIC STRUCTURE TENSOR METHOD”, COMPUTATIONAL METHODS IN APPLIED MATHEMATICS, Vol.9(2009)

Prof. univ. dr. ing. Florica Moldoveanu, Tehnici de imnunatatire si restaurare a imaginilor

Similar Posts