Documente Academic
Documente Profesional
Documente Cultură
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)
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)
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]
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)
L 11-12/3
Sobel Prewitt Roberts
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)
dim = size(BW)
col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))
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:
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');
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));
blocks(end,1:end) = 1;
blocks(1:end,end) = 1;
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:
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)
L 11-12/13
Contrast
liniar
Exemplu:
I = imread('eight.tif');
imshow(I)
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)
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