Sunteți pe pagina 1din 16

Laboratorul 11-12

Analiza imaginilor

1. Scopul lucrarii
Lucrarea prezinta modul în care pot fi extrase trasături specifice obiectelor din imagini.

2. Consideratii teoretice
Conturul unui obiect (imcontour)
Crează un grafic cu conturul obiectelor din imaginea dată.
Exemplu:
I = imread('circuit.tif');
imcontour(I,3)

unde valoarea 3 din funcţia imcontour(I,3)este numărul de nivele echidistante de contur


folosit. Imaginea circuit.tif şi graficul de contur care rezultă:

Rezumatul staticticilor pentru o imagine dată (mean2, std2, corr2)

means2 Calculează valoarea medie a elementelor din matrice.


std2 Calculează deviația standard a elementelor din matrice
corr2 Calculează un coeficient bidimensoinal de corelare dintre două matrice.

Măsurători pentru o regiune de imagine (regionprops)


Măsoară proprietăţile unei regiuni dintr-o imagine. Funcţia STATS =
regionprops(L,properties) măsoară un set de caracteristici pentru fiecare regiune
marcată din matricea de marcări L, iar valoarea variabilei properties poate fi 'all',
'basic' sau aleasă din următorul tabel:

L 11-12/1
Funcţia L = bwlabel(BW) converteşte o imagine binară într-o matrice de marcări.
Exemplu:

BW = imread('text.png');
imshow(BW)
L = bwlabel(BW);
stats = regionprops(L,'all');
stats(23)

Pentru care rezultatul apare în fereastra Command Window:

ans =
Area: 90
Centroid: [69.7556 89.8667]
BoundingBox: [64.5000 83.5000 11 13]
SubarrayIdx: {1x2 cell}
MajorAxisLength: 14.5814
MinorAxisLength: 11.8963
Eccentricity: 0.5783
Orientation: -89.2740
ConvexHull: [19x2 double]
ConvexImage: [13x11 logical]
ConvexArea: 121
Image: [13x11 logical]
FilledImage: [13x11 logical]
FilledArea: 98
EulerNumber: 0
Extrema: [8x2 double]
EquivDiameter: 10.7047
Solidity: 0.7438
Extent: 0.6294
PixelIdxList: [90x1 double]
PixelList: [90x2 double]

2.1. Analiza imaginilor


Tehnicile de analiză a imaginilor returnează informaţii despre structura imaginii.

Detecţia marginilor

L 11-12/2
Prin folisrea funcţiei edge pentru detectarea marginilor, locuri din imagine care delimitează
obiectele. Pentru găsirea marginilor, această funcţie caută regiunile din imagine în care
intensitatea variază brusc, utilizând cele două criterii:
 Locuri în care prima derivată a intensităţii este mai mare decât un anumit prag
 Locuri în care derivata de ordinul doi a intensitaţii trece prin zero
Funcţia edge are ca valoare de intrare intensitatea imaginii I, şi răspunsul pe care îl dă este
o imagine binar alb-negru, având valoarea 1 în locul unde funcţia a detectat o muchie în I, şi 0 în
toate celelalte puncte.
Există şase metode diferite folosite de funcţia edge: metoda Sobel, Prewitt, Roberts,
Laplacian of Gaussian (log), zerocrossing (trecerea prin zero) şi Canny.

Exemplu:
I = imread('cameraman.tif');
imshow(I)
BW1 = edge(I,'sobel');
BW2 = edge(I,'prewitt');
BW3 = edge(I,'roberts');
BW4 = edge(I,'log');
BW5 = edge(I,'zerocross');
BW6 = edge(I,'canny');
figure, imshow(BW1)
figure, imshow(BW2)
figure, imshow(BW3)
figure, imshow(BW4)
figure, imshow(BW5)
figure, imshow(BW6)

Imaginea iniţială analizată este cameraman.tif :

Marginile detectate prin metodele:

L 11-12/3
Sobel Prewitt Roberts

Log Zerocross Canny

Urmărirea limitei
Detectarea limitelor obiectelor dintr-o imagine binară se poate realiza cu ajutorul a două
funcţii:
 bwtraceboundary
 bwboundaries
Funcţia bwtraceboundary returnează coordonatele tuturor pixelilor aflate pe limita
unui obiect dintr-o imagine. Trebuie specificat locul uneui pixel pe un obiect ca punctul de început
pentru urmărirea limitei.
Funcţia bwtraceboundary returnează coordonatelor pixelilor limitrofe de la toate
obiectele din imagine.

Exemplu:
I = imread('rice.png');
imshow(I)

Se afişează rice.png :

L 11-12/4
BW = im2bw(I);
figure, imshow(BW)

Se afişează imaginea în format binar:

Se determină coordonatele de pixel de unde se doreşte începerea urmăririi limitei:

dim = size(BW)
col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))

Funcţia bwtraceboundary urmăreşte limita din punctul specificat anterior:

boundary = bwtraceboundary(BW,[row, col],'N');


figure, imshow(I)
hold on;
plot(boundary(:,2),boundary(:,1),'g','LineWidth',3);

L 11-12/5
Detecţia liniilor utilizând transformata Hough
Toolbox-ul de procesare a imaginilor are în dotare funcţii care folosesc tranformata Hough.
Funcţia hough implementează Transformata Standard Hough (SHT). Transformata Hough este
proiectată să detecteze linii utilizând reprezentarea parametrică a liniilor:

rho = x*cos(theta) + y*sin(theta)

Variabila rho reprezintă distanţa de la origine la liniei de-alungul unui vector perpendicular
pe linie.
Funcţia houghpeaks găseşte valorile de vârf în acest spaţiu, care reprezintă potenţialele
linii în imaginea de intrare.
Funcţia houghlines detectează punctele de capăt a segmentelor de linii corespunzătoare
vârfurilor din transormata Hough şi completează automat micile goluri.

Exemplu:
I = imread('circuit.tif');
imshow(I)

rotI = imrotate(I,33,'crop');
BW = edge(rotI,'canny');
figure, imshow(BW)

L 11-12/6
[H,theta,rho] = hough(BW);
figure, imshow(H,[],'XData',theta,'YData',rho,...
'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;

P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,'s','color','white');
lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
figure, imshow(rotI), hold on
max_len = 0;
for k = 1:length(lines)
xy = [lines(k).point1; lines(k).point2];
plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','green');

% Afişează începutul şi sfâşitul liniilor


plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

% determină capetele celui mai lung segment liniar


len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end

% reliefează segmentul liniar cel mai lung


plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');

L 11-12/7
2.2. Descompunerea quadtree
Descompunerea quadtree este o tehnică de analiză care implică divizarea imaginii în blocuri
omogene. Această tehnică dezvăluie informaţii despre structura imaginii. Această descompunere
este util de asemenea ca primul pas în algoritmul de compresie adaptiv.
Descompunerea quadtree se poate fi făcută folosind funcţia qtdecomp. Această funcţie
divizează o imagine pătrată în patru blocuri de dimensiuni egale, apoi se testează fiecare pentru a
vedea dacă îndeplineşte criteriile de omogenitate. Dacă nu îndeplineşte criteriile, blocurile sunt încă
o dată împărţite în patru regiuni, şi testate. Din acest proces iterativ pot rezulta imagini de diferite
mărimi.

Exemplu:
I = imread('circles.png');
S = qtdecomp(I,.27);
blocks = repmat(uint8(0),size(S));

for dim = [512 256 128 64 32 16 8 4 2 1];


numblocks = length(find(S==dim));
if (numblocks > 0)
values = repmat(uint8(1),[dim dim numblocks]);
values(2:dim,2:dim,:) = 0;
blocks = qtsetblk(blocks,S,dim,values);
end
end

blocks(end,1:end) = 1;
blocks(1:end,end) = 1;

imshow(I), figure, imshow(blocks,[])

În stânga este imagine circles.png, iar în dreapta graficul funcţiei quadtree:

L 11-12/8
2.3. Analiza texturilor
Analiza texturilor se referă la caracterizarea unei regiuni dintr-o imagine prin conţinutul de
textură. Analiza texturii încearcă cuantificarea intuitivă a calităţii descrise de termeni ca duritate,
netezime, mătăsos sau accidentat, în funcţie de variaţia spaţială a intensităţii pixelilor.
Analiza se poate face cu două funcţii:
 Funcţia de filtrare a texturii – aceste funcţii folosesc măsurători statistice standard
pentru caracterizarea texturii locale a imaginii.
Exemplu:
I = imread('flower.jpg');
imshow(I)
K = rangefilt(I);
figure, imshow(K)

În partea stânga avem imaginea flower.jpg, iar în dreapta analiza ei texturală folosindu-
se funcţia rangefilt(I):

 Matrice de co-apariţie în nivele de gri – aceste funcţii caracterizează textura unei imagini
prin calcularea frecvenţei de apariţie a unei perechi de pixeli cu o valoare şi într-o relaţie spaţială
specifică într-o imagine, apoi extragand măsuri statistice din matrice.

Exemplu:
circuitBoard = rot90(rgb2gray(imread('board.tif')));
imshow(circuitBoard)
offsets0 = [zeros(40,1) (1:40)'];
L 11-12/9
glcms = graycomatrix(circuitBoard,'Offset',offsets0)
stats = graycoprops(glcms,'Contrast Correlation');
figure, plot([stats.Correlation]);
title('Texture Correlation as a function of offset');
xlabel('Horizontal Offset')
ylabel('Correlation')

Imaginea circuitBoard:

2.4. Ajustarea intensităţii


Tehnicile de îmbunătăţire a imaginilor sunt folosite când „îmbunătăţirea” se poate defini în
mod obiectiv (ex. Creşterea ratei de semnal-zgomot), sau uneori subiectiv (ex. Prin modificarea
culorii sau intensităţii unele trăsături se observă mai uşor).
Ajustarea intensității este o tehnică care trece pe hartă intensităţile imagii într-un nou
domeniu de valori.
Tehnicile folosite:
 Ajustarea valorilor de intensitate la un domeniu specificat – se face prin folosirea funcţiei
imadjust(I), unde se specifică domeniul de intensitate în imaginea rezultantă.
 Egalizarea histogramei – proces de ajustare a intensităţii, ce poate fi făcută în mod automat
cu ajutorul funcţiei histeq(I).
 Egalizare histogramei cu limitarea contrastului – este o alternativă a funcţiei histeq şi
se face prin utilizarea funcţiei adapthisteq.

Exemplu:
I = imread(‚pout.tif’);
imshow(I)
figure, imhist(I1,64)
J = imadjust(I);
figure, imshow(J)
figure, imhist(J,64)
J1 = histeq(I);
figure, imshow(J1)

L 11-12/10
figure, imhist(J1,64)
J2 = adapthisteq(I);
figure, imshow(J2);
figure, imhist(J2,64)

Imagine Histogramă
Iniţial
t(I)imajusFuncţia

L 11-12/11
histeq(I)Funcţia
Funcţia adapthisteq(I)

O altă tehnică este cea de întindere de-corelaţională (reducerea auto-corelării) – proces care
îmbunătăţeşte separea culorilor dintr-o imagine cu corelaţie bandă-bandă semnificativă.

Exemplu:
Imaginea are şapte benzi, dar citim doar cele trei culori vizibile:
A = multibandread(‚littlecoriver.lan’, [512, 512, 7], ...
‚uint8=>uint8’, 128, ‚bil’, ‚ieee-le’, ...
{‚Band’,’Direct’,[3 2 1]});
Efectuăm întinderea prin decorelare:
B = decorrstretch(A);
imshow(A); figure; imshow(B)
Din graficele de răspândire a imaginii vedem benzile decorelate şi egalizate:
rA = A(:,:,1); gA = A(:,:,2); bA = A(:,:,3);
figure, plot3(rA(,gA(,bA(,’.’); grid(‚on’)
xlabel(‚Red (Band 3)’); ylabel(‚Green (Band 2)’); ...

L 11-12/12
zlabel(‚Blue (Band 1)’)
rB = B(:,:,1); gB = B(:,:,2); bB = B(:,:,3);
figure, plot3(rB(,gB(,bB(,’.’); grid(‚on’)
xlabel(‚Red (Band 3)’); ylabel(‚Green (Band 2)’); ...
zlabel(‚Blue (Band 1)’)
Aceeaşi transformare, dar întinderea se realizează prin contrast liniar, după aplicarea întinderii
de tip decorelare:
C = decorrstretch(A,’Tol’,0.01);
figure; imshow(C)

Imagine Grafic de răspândire


Imagine
inițială
Funcția
decorr
h stretc

L 11-12/13
Contrast
liniar

2.5. Eliminarea zgomotului


Imaginile digitale sunt predispuse la o mare varietate de zgomote. Există mai multe
modalităţi de introducerea zgomotelor într-o imagine, în funcţie de modul în care a fost creată
imagine.
În setul de instrumente avem multe modalităţi de eliminare sau reducere zgomoelor. Pentru
diferite tipuri de zgomote se utilizează diferite metode, cum ar fi:
 Filtrarea liniară – diferite filtre precum calcularea mediei sau filtre gausiene.
 Filtrare mediană – asemănător cu calcularea mediei, valoarea pixelului rezultant este
determinat de o medie a pixelilor învecinaţi, dar se calculează o mediană în loc de o
medie.

Exemplu:
I = imread('eight.tif');
imshow(I)

J = imnoise(I,'salt & pepper',0.02);


figure, imshow(J)

L 11-12/14
K = filter2(fspecial('average',3),J)/255;
figure, imshow(K)

L = medfilt2(J,[3 3]);
figure, imshow(L)

 Filtrare adaptivă – funcţia wiener2 aplică un filtru de tip Wiener (de tip liniar) unei
imagini în mod adaptiv (după variaţia locală a imaginii).

Exemplu:
RGB = imread('saturn.png');
I = rgb2gray(RGB);
J = imnoise(I,'gaussian',0,0.005);
K = wiener2(J,[5 5]);
imshow(J)
figure, imshow(K)

În stânga avem imaginea iniţială, iar în dreapta imaginea filtrată de zgomot:

L 11-12/15
3. Aplicatii

1. Implementati toate secventele de program prezentate mai sus si comparati rezultatele voastre
cu cele din lucrare.
2. Incarcati imaginea rice.png. Caracterizati eccentricitatea boabelor de orez. Numarati boabele
de orez din imagine (vezi laboratorul anterior).
3. Incărcaţi imaginea line.gif şi determinaţi liniile/muchiile din figură folosind transformata
Hough.

L 11-12/16

S-ar putea să vă placă și