6. Afișarea imaginilor raster arbitrare.
O imagine arbitrară pe ecranul calculatorului este o gamă de pixeli, fiecare caracterizată prin culoarea proprie. Culoarea pixelului este determinată de trei componente: roșu, verde și albastru (roșu, verde, albastru - RGB). Pentru a seta componenta de culoare pixel, este suficient un octet de memorie (8 biți), unde puteți scrie întregi de la zero la 255 (un total de 256 de valori).
Deci, fiecare pixel de ecran trebuie să aibă trei numere întregi în intervalul de la 0 la 255. În sistemul MATLAB, tipul de date, notat cu uint8, corespunde acestor numere întregi. Pentru acest tip de date, doar un octet este alocat în memorie, în loc de 8 octeți pentru numerele obișnuite reale (fracționare) de tip dublu. În mod implicit, orice variabilă din sistemul MATLAB este atribuită unui tip dublu, indiferent de valorile numerice pe care le atribuiți variabilelor.
De exemplu, ca urmare a următoarei linii de cod
o variabilă este creată cu numele iVar1 și tipul dublu, care este setat la 128. Pentru a stoca această valoare, un octet de memorie este suficient, dar pentru variabila iVar1 de tip dublu, 8 octeți de memorie sunt alocate. Există o supra-consumare evidentă a memoriei computerului.
Pentru a evita această depășire, variabila trebuie explicit declarată ca un număr întreg folosind modificatorul uint8:
Astfel, variabila creată iVar2 este considerată o variabilă întreg (nu reală), iar sub ea este alocată un octet de memorie. Astfel de variabile din sistemul MATLAB sunt concepute special pentru a stoca valori întregi de la 0 la 255 (pentru a economisi memoria) și nu sunt destinate calculului! Cel puțin în versiunea MATLAB 5.2, este încă așa. Ca rezultat, pentru fragmentul următor
primim mesajul de eroare:
. Funcția "+" nu este definită pentru variabilele din clasa "uint8".
În sensul literal, operația "adiție" pentru variabilele de tip uint8 nu este definită.
Pentru a afla (dacă ați uitat) ce tip are această sau acea variabilă din spațiul de lucru al sistemului MATLAB, trebuie să introduceți și să executați comanda
în consecință, în fereastra de comandă MATLAB va apărea următorul mesaj:
care arată că iVar1 o dimensiune matrice 1x1 (adică, de fapt, scalar) tipul și dublu ocupă 8 octeți în memorie, și are iVar2 tip uint8 și ia în memorie doar 1 octet (de 8 ori mai puțin). Ambele variabile au aceleași valori.
Un anumit set de culori (în număr de bucăți m), numit paletă sau colormap, poate fi realizat sub forma unei matrice de m x 3 de tip dublu. De exemplu, harta matricei1
map1 (1,1) = 0,12; harta1 (1,2) = 0,123; harta1 (1,3) = 0,987;
map1 (4,1) = 0,255; harta1 (4,2) = 0,298; harta1 (4,3) = 0,128;
stabilește un set de cinci culori. Fiecare linie corespunde unei singure culori. Elementele liniei (de la stânga la dreapta) specifică componentele roșii, verzi și albastre ale culorii.
Apoi vom forma o matrice k x L de tip uint8, fiecare element al caruia va fi egal cu unul din numerele (minus unul) din randurile tabelului de culori map1. O astfel de matrice împreună cu matricea de culoare vor fi suficiente pentru a arăta pe ecranul computerului o gamă de pixeli, adică o imagine arbitrară.
De exemplu, matricea X1
X1 = uint8 ([1 4 1 3 2, 4 0 2 1 3])
Specifică o matrice uint8 cu dimensiunea de 2 x 5 pixeli. Această matrice ocupă 10 de octeți în memorie, și nu 80 de octeți, așa cum ar fi în cazul unei matrice duble. Primul pixel din primul rând are culoarea specificată de al doilea rând al matricei map1, al doilea pixel din același rând corespunde cu cel de-al cincilea rând al matricei map1 și așa mai departe.
Pentru a face sistemul MATLAB să afișeze într-adevăr o imagine arbitrară a pixelilor, trebuie să apelați funcția de imagine.
De exemplu, folosind funcții
un obiect grafic Obiect de imagine al sistemului MATLAB este creat, care corespunde imaginii reale din fereastra grafică MATLAB:
Deoarece nu controlam dimensiunea ferestrei grafice a sistemului MATLAB, apare pe ecran cu o dimensiune implicită rezonabilă. Mai mult decât atât, din moment ce imaginea noastră este compusă din două rânduri de câte cinci fiecare pixel, care este un foarte mic de imagini (dimensiunea fizică pixeli ecran este aproximativ egală cu 0,2 mm), implicit ea (crește) cântare MATLAB pentru a putea vedea această imagine. Dacă doriți să anulați această scalare, trebuie să specificați în mod explicit mărimile necesare:
figura ("Unități", "pixeli", "Poziție", [100 100 n m]);
Aici, dimensiunile m și n ale imaginii X1 sunt impuse ca dimensiune fizică a imaginii în fereastra grafică a sistemului MATLAB. Pentru imagini prea mici, nimic bun nu va veni din ea.
Dacă nu vom crea noi imagini în mod clar manipularea matrice, și vom încerca să se afișeze în fereastra grafică MATLAB imagini gata înregistrate în fișierele, atunci avem nevoie pentru a citi conținutul acestor funcții fișiere imread. În special, am înregistrat anterior imagini 3D în fișiere utilizând funcția imwrite. Acum pot fi citite
și se afișează în fereastra grafică. Rețineți că fișierul trebuie să fie în directorul actual al sistemului MATLAB, altfel trebuie specificat împreună cu calea completă la acesta.
Am considerat structura obiectului de date de imagine, format din două matrice, una dintre care definește linia de culoare de linie, și celelalte elemente ale punctelor sale de intrare la un tabel de culori (matrice), exact așa cum numită Image indexată (imagine indexate). Există un alt tip de obiect Image - așa-numita Truecolor Image (imagini cu o mulțime de culori - 16 milioane). Acest al doilea tip de obiecte imagine este aranjat diferit.
Pentru obiectele TruecolorImage, nu este necesară o tabelă de culori, deoarece matricele de date ale unor astfel de obiecte determină direct culorile.
Aceste matrici au dimensiunea m x n x 3 (acestea sunt matricea dimensiunii 3). Valorile m și n determină dimensiunea imaginii pe ecran (m x n pixeli), iar în a treia direcție se află componentele RGB ale culorii fiecărui pixel. De exemplu, setați următoarea matrice pentru imaginea TrueColor:
xTrue (1,1,1) = uint8 (127); xTrue (1,1,2) = uint8 (127); xTrue (1,1,3) = uint8 (127);
xTrue (1,2,1) = uint8 (19); xTrue (1,2,2) = uint8 (12); xTrue (1,2,3) = uint8 (255);
xTrue (1,3,1) = uint8 (245); xTrue (1,3,2) = uint8 (127); xTrue (1,3,3) = uint8 (1);
xTrue (2,1,1) = uint8 (6); xTrue (2,1,2) = uint8 (203); xTrue (2,1,3) = uint8 (128);
xTrue (2,2,1) = uint8 (100); xTrue (2,2,2) = uint8 (1); xTrue (2,2,3) = uint8 (80);
xTrue (2,3,1) = uint8 (60); xTrue (2,3,2) = uint8 (249); xTrue (2,3,3) = uint8 (5);
O matrice xTrue creează o imagine de 2 x 3 pixeli prin apelarea unei imagini a unei funcții (xTrue):
În cazul imaginilor TrueColor, aici matricea X va obține dimensiunea m x n x 3, iar matricea paletei de hartă va fi goală:
În viitor, funcția de imagine recunoaște automat tipurile de imagini în mod automat în funcție de dimensiunea matricei X și acționează în ambele cazuri după cum doriți, iar funcția colormap nu face nimic în cazul unei matrice goale a hărții, astfel încât ambele cazuri pot fi tratate în același mod.
Cu toate acestea, dacă știm în prealabil că fișierul conținea o imagine a tipului TrueColor, am fi efectuat un cod mai scurt pentru citirea acestuia
dar ar arăta imaginea apelând doar o singură imagine a funcției (X). Pentru a cunoaște în avans tipul imaginii din fișier, trebuie să apelați funcția
În special, pentru fișierul "myfile1.jpg", creat în secțiunea anterioară a acestui manual, imfinfo va furniza următoarele informații:
Prin urmare, este clar că tipul imaginii din fișier (ColorType) este truecolor. Acest lucru înseamnă că puteți face complet fără o matrice de culoare.