LUCRAREA NR - Politehnica University of Timișoara
LUCRAREA NR 8
ANALIZA IMAGINILOR
Mai jos sunt descrise câteva tehnici de analiză a imaginilor care oferă informaţii despre structura unei imagini.
DETECTAREA MARGINILOR
Intr-o imagine, o margine este o curbă care urmează un traseu al unei schimbări rapide a densităţii imaginii. Ele sunt de multe ori asociate cu limitele unui obiect dintr-o scenă.
Pentru identificarea marginilor se foloseşte funcţia edge. Această funcţie caută acele locuri din imagine unde intensitatea se modifică în mod rapid, folosind unul dintre criteriile de mai jos:
• Locurile unde prima derivată a intensităţii imaginii depăşeşte în magnitudine un anumit prag.
• Locurile unde cea de a doua derivată a intensităţii imaginii trece prin zero
edge oferă un număr de estimatori derivativi, fiecare dintre ei implementând una dintre definiţiile de mai sus. Pentru unii dintre aceşti estimatori, se poate specifica un anume tip de operaţii, care să fie sensibili la marginile orizontale, la cele verticale sau la ambele.
edge returnează o imagine binară care conţine 1 acolo unde se identifică margini şi zero in restul imaginii.
Cea mai puternică metodă de detectare a laturilor a edge este oferită de metoda Canny. Aceasta foloseşte două limite diferite, pentru a detecta marginile slabe si pe cele tari şi le include şi marginile slabe în imaginea de ieşire doar daca acestea sunt conectate la marginile tari. Această particularitate a metodei îi permite sa detecteze mai bine marginile slabe ale obiectului.
În exemplul următor, asupra aceleiaşi imagini se aplică în mod comparativ metodele Canny şi Sobel:
Citirea imaginii şi afişarea ei (Fig nr 1)
I = imread('coins.png');
imshow(I)
[pic]
Fig. nr. 1
Aplicarea metodelor Sobel şi Canny asupra imaginii şi afişarea rezultatelor (Fig nr 2).
BW1 = edge(I,'sobel');
BW2 = edge(I,'canny');
imshow(BW1)
figure, imshow(BW2)
[pic]
Fig. nr. 2
Pentru o demonstraţie interactivă a detectării marginilor, se poate rula edgedemo.
TRASAREA CONTURURILOR
Sunt incluse două funcţii care pot fi utilizate pentru determinarea contururilor unui obiect într-o imagine binară:
• bwtraceboundary
• bwboundaries
Funcţia bwtraceboundary returnează coordonatele pixelilor situaţi pe conturul unui obiect dintr-o imagine (linia şi coloana). Trebuie specificată locaţia pixelului de pe conturul obiectului, folosit ca punct de pornire.
Funcţia bwboundaries returnează coordonatele pixelilor (linie şi coloană) pentru contururile tuturor obiectelor dintr-o imagine.
Pentru ambele funcţii, pixelii non zero din imaginea binară aparţin unui obiect din imagine şi pixelii cu valoarea zero constituie fundalul.
Exemplul următor utilizează funcţia bwtraceboundary pentru a trasa conturul unui singur obiect din imagine, apoi funcţia bwboundaries pentru a trasa contururile tuturor obiectelor din imagine.:
Citirea imaginii şi afişarea ei (fig. nr. 3)
I = imread('coins.png');
imshow(I)
[pic]
Fig. nr. 3
Convertirea imaginii într-o imagine binară (fig. nr. 4) bwtraceboundary şi bwboundaries se pot aplica doar asupra imaginilor binare.
BW = im2bw(I);
imshow(BW)
[pic]
Fig. nr. 4
Se determină coordonatele pixelului de pe marginea obiectului al cărui contur dorim sa-l trasăm. bwboundary utilizează acest punct ca locaţie de start pentru trasarea conturului.
dim = size(BW)
col = round(dim(2)/2)-90;
row = min(find(BW(:,col)))
Se apelează funcţia bwtraceboundary pentru a trasa conturul din punctul specificat. Ca argumente obligatorii se specifică imaginea binară, coordonatele de punctului de start şi direcţia primului pas. În exemplul dat se specifică direcţia nord ('N').
boundary = bwtraceboundary(BW,[row, col],'N');
Se afişează imaginea originală grayscale şi se utilizează coordonatele returnate de către bwtraceboundary pentru a trasa conturul imaginii (fig. nr. 5).
imshow(I)
hold on;
plot(boundary(:,2),boundary(:,1),'g','LineWidth',3);
[pic]
Fig nr 5
Pentru a trasa contururile tuturor monedelor din imagine, se foloseşte funcţia bwboundaries. În mod predefinit, aceasta trasează contururile tuturor obiectelor din imagine, inclşusiv pe cele aflate în interiorul altora. În imaginea binară folosită pentru acest exemplu, unele monede conţin suprafeţe negre pe care bwboundaries le interpretează ca fiind obiecte separate. Pentru a ne sigura că bwboundaries trasează doar conturul monedelor, se foloseşte funcţia imfill pentru a umple suprafeşele din interiorul monedelor.
BW_filled = imfill(BW,'holes');
boundaries = bwboundaries(BW_filled);
Se trasează coordonatele tuturor monedelor din imaginea originală grayscale (fig nr 6), utilizând coordonatele returnate de bwboundaries.
for k=1:10
b = boundaries{k};
plot(b(:,2),b(:,1),'g','LineWidth',3);
end
[pic]
Fig. nr. 6
Exemplu:
%% Detecting a Cell Using Image Segmentation
%% Step 1: Read Image
I = imread('cell.tif');
figure, imshow(I), title('original image');
text(size(I,2),size(I,1)+15, ...
'Image courtesy of Alan Partin', ...
'FontSize',7,'HorizontalAlignment','right');
text(size(I,2),size(I,1)+25, ....
'Johns Hopkins University', ...
'FontSize',7,'HorizontalAlignment','right');
%% Step 2: Detect Entire Cell
[junk threshold] = edge(I, 'sobel');
fudgeFactor = .5;
BWs = edge(I,'sobel', threshold * fudgeFactor);
figure, imshow(BWs), title('binary gradient mask');
%% Step 3: Dilate the Image
se90 = strel('line', 3, 90);
se0 = strel('line', 3, 0);
BWsdil = imdilate(BWs, [se90 se0]);
figure, imshow(BWsdil), title('dilated gradient mask');
%% Step 4: Fill Interior Gaps
BWdfill = imfill(BWsdil, 'holes');
figure, imshow(BWdfill);
title('binary image with filled holes');
%% Step 5: Remove Connected Objects on Border
BWnobord = imclearborder(BWdfill, 4);
figure, imshow(BWnobord), title('cleared border image');
%% Step 6: Smoothen the Object
seD = strel('diamond',1);
BWfinal = imerode(BWnobord,seD);
BWfinal = imerode(BWfinal,seD);
figure, imshow(BWfinal), title('segmented image');
%% |bwperim| function.
BWoutline = bwperim(BWfinal);
Segout = I;
Segout(BWoutline) = 255;
figure, imshow(Segout), title('outlined original image');
Alegerea primului pas şi a direcţiei de trasare a contururilor
Pentru anumite obiecte e nevoie de atenţie atunci când se selectează pixelul de contur ce se alege ca punct de pornire şi direcţia aleasă ca parametru al primului pas (Nord, Sud, etc.).
De exemplu, dacă un obiect conţine o gaură şi este selectată o parte subţire ca punct de pornire, se poate trasa conturul exterior al obiectului sau conturul interior al găurii, în funcţie de direcţia aleasă pentru primul pas. Această situaţie este ilustrată in fig. nr. 7. Conectivitatea este setată la 8 (modul predefinit).
Pentru obiectele pline, direcţia selectată pentru primul pas nu are importanţă.
[pic]
Fig. nr. 7
DETECTAREA LINILOR FOLOSIND TRANSFORMAREA HOUGH
Image Processing Toolbox include funcţii care suportă transformarea Hough:
• hough
• houghpeaks
• houghlines
Funcţia hough implementează Transformarea Hough Standard (SHT). Aceasta este concepută pentru a detecta linii, folosind reprezentarea parametrică a unei linii:
rho = x*cos(theta) + y*sin(theta)
Variabila rho reprezintă distanţa de la origine până la linie, de-a lungul unui vector perpendicular pe linie.
theta reprezintă unghiul dintre axa x şi acest vector.
Funcţia hough generează un spaţiu parametric matriceal ale cărui linii şi coloane corespund valorilor rho , respectiv theta .
Funcţia houghpeaks găseşte valorile de vârf din acest spaţiu, care reprezintă liniile potenţiale din imaginea de ieşire.
Funcţia houghlines găseşte capetele segmentelor liniare ce corespund vârfurilor din transformarea Hough şi le umple în mod automat cu mici goluri.
Exemplul următor arată modul în care poate fi utilizată această funcţie pentru a detecta liniile dintr-o imagine:
Citirea imaginii in spaţiul de lucru al Matlab (Fig. nr. 8)
I = imread('circuit.tif');
Rotirea şi decuparea imaginii (Fig nr 9).
rotI = imrotate(I,33,'crop');
[pic]
Fig. nr. 9
Identificarea marginilor obiectului din imagine(Fig nr 10).
BW = edge(rotI,'canny');
[pic]
Fig. nr. 10
Calculul transformării Hough asupra imaginii, utilizând funcţia hough
[H,theta,rho] = hough(BW);
Afişarea transformării (fig. nr. 11)
imshow(H,[],'XData',theta,'YData',rho,...
'InitialMagnification','fit');
xlabel('\theta'), ylabel('\rho');
axis on, axis normal, hold on;
[pic]
Fig. nr. 11
Identificarea vârfurilor în matricea de transformare Hough H, folosind funcţia houghpeaks:
P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
Trasarea vârfurilor:
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,'s','color','white');
Identificarea liniilor din imagine
lines = houghlines(BW,theta,rho,P,'FillGap',5,'MinLength',7);
Crearea unui reprezentări care suprapune liniile peste imaginea originală (fig. nr. 12).
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');
% Plot beginnings and ends of lines
plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','yellow');
plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');
% Determine the endpoints of the longest line segment
len = norm(lines(k).point1 - lines(k).point2);
if ( len > max_len)
max_len = len;
xy_long = xy;
end
end
% highlight the longest line segment
plot(xy_long(:,1),xy_long(:,2),'LineWidth',2,'Color','cyan');
[pic]
Fig. nr. 12
ANALIZA TEXTURII UNEI IMAGINI
Analiza texturii se referă la caracterizarea unei regiuni dintr-o imagine în contextul texturii acesteia, încercând sa cuantifice calităţi intuitive ale unei imagini, (descrise in termeni cum ar fi aspru, neted, mătăsos sau neregulat) sub forma unor funcţii spaţiale ale variaţiei intensităţii pixelilor.
Analiza texturii este folosită intr-o varietate de aplicaţii, cum ar fi identificarea de la distanţă, inspectarea automata şi procesarea imaginilor medicale. Ea este deosebit de utilă în cazul obiectelor caracterizate mai mult prin textură decât prin intensitate, pentru care tehnicile tradiţionale de identificare a limitelor nu pot fi folosite în mod eficient. Matlab furnizează doua tipuri de funcţii de analiză a texturii:
• Funcţii de filtrare a texturii – folosesc măsurători statistice standard pentru a caracteriza textura locală a unei imagini.
• Matrice de co-ocurenţă a nivelurilor de gri – calculează cât de des apar perechi de pixeli cu valori specifice şi în relaţii spaţiale specificate apar într-o imagine şi apoi extrage valorile statistice din această matrice.
Utilizarea funcţiilor de filtrare a texturii
Matlab oferă trei funcţii de analizare a texturii care filtrează o imagine utilizând măsurări statistice cum ar fi distribuţia, deviaţia standard şi entropia. Aceste statistici pot caracteriza textura unei imagini, deoarece furnizează informaţii despre varianţa locală a valorilor pixelilor unei imagini.
Cele trei funcţii de filtrare statistică a texturii sunt:
rangefilt – Calculează distribuţia locală
stdfilt – Calculează deviaţia standard locală
entropyfilt – Calculează entropia locală a unei imagini grayscale
Toate aceste funcţii operează în mod similar: definesc o vecinătate în jurul pixelului de interes apoi efectuează calculele statistice pentru acea vecinătate.
Exemplul următor arată modul în care funcţia rangefilt operează asupra unei matrice simple:
A = [ 1 2 3 4 5; 6 7 8 9 10; 11 12 13 14 15; 16 17 18 19 20 ]
A =
1 2 3 4 5
6 7 8 9 10
11 12 13 14 15
16 17 18 19 20
B = rangefilt(A)
B =
6 7 7 7 6
11 12 12 12 11
11 12 12 12 11
6 7 7 7 6
Figura nr 13 arată modul în care valoarea elementului B(2,4) a fost calculată din A(2,4). În mod predefinit, funcţia rangefilt utilizează o vecinătate de 3-pe-3, dar pot fi specificate şi vecinătăţi de forme şi dimensiuni diferite.
[pic]
Fig. nr. 13
Funcţiile stdfilt şi entropyfilt operează în mod similar, definind o vecinătate în jurul pixelului de interes şi efectuând calcule statistice aspra vecinătăţii acestuia, pentru a determina valoarea pixelului din imaginea de ieşire.
Funcţia stdfilt calculează deviaţia standard a tuturor valorilor din vecinătate.
Funcţia entropyfilt calculează entropia vecinătăţii şi cu ajutorul ei atribuie valoarea pixelului de ieşire. În mod predefinit funcţia entropyfilt defineşte o vecinătate de 9 pe 9 în jurul pixelului de interes.
Funcţia entropy se foloseşte pentru a calcula entropia întregii imagini.
Exemple:
Exemplul de mai jos ilustrează modul în care funcţia de filtrare a texturilor poate detecta regiuni cu textură într-o imagine. În figură, fundalul este neted; există puţine variaţii ale nivelurilor de gri. În prim plan, contururile de pe suprafaţa monedelor prezintă o textură mai pronunţată, prin urmare vor avea valori mai mari ale distribuţiei. Filtrarea de distribuţie face contururile obiectelor mai vizibile.
Citirea şi afişarea imaginii (fig. nr. 14).
I = imread('eight.tif');
imshow(I)
[pic]
Fig. nr. 14
Filtrarea imaginii cu ajutorul funcţiei rangefilt şi afişarea rezultatelor (fig. nr. 15). Se observă modul în care filtrarea subliniază marginile şi contururile de suprafaţă ale monedelor:
K = rangefilt(I);
figure, imshow(K)
[pic]
Fig. nr. 15
Utilizarea unei matrice de co ocurenţă a nivelurilor de gri (GLCM)
Filtru de textură furnizează o imagine statistică asupra texturii, bazată pe histograma imaginii. Din păcate, ele nu pot furniza şi informaţii despre forma, respectiv relaţiile spaţiale ale pixelilor dintr-o imagine. În acest scop se foloseşte o altă metodă statistică, numită matrice de co ocurenţă a nivelurilor de gri (GLCM).
Crearea unei GLCM
Se foloseşte funcţia graycomatrix Aceasta creează o GLCM care calculează de câte ori un pixel cu o valoare a intensităţii i apare într-o relaţie spaţială specifică cu un pixel având valoarea j. În mod predefinit, relaţia spaţială este definită ca pixelul de interes şi pixelul din dreapta lui (adiacent pe orizontală), dar se pot specifica şi alte relaţii spaţiale între cei doi pixeli. Fiecare element (i,j) din glcm rezultantă reprezintă suma numărului de ori în care un pixel cu valoarea i apare intr-o relaţie spaţială specificată cu un pixel de valoare j în imaginea de intrare.
Numărul nivelurilor de gri din imagine determină dimensiunea GCLM. În mod predefinit, graycomatrix utilează scalarea pentru a reduce numărul valorilor intensităţii la opt, dar se pot utiliza parametrii NumLevels şi GrayLimits pentru a controla această scalare a nivelurilor de gri.
GCLM poate evidenţia anumite proprietăţi ale distribuţiei spaţiale a nivelurilor de gri. De exemplu, dacă cele mai multe dintre intrări din GLCM sunt concentrare de-a lungul diagonalei, textura este aspră.
Figura 16 arată modul în care graycomatrix calculează primele trei valori din GLCM. În GLCM de ieşire, elementul (1,1) conţine valoarea 1 deoarece există o singură situaţie în imaginea de intrare unde doi pixeli adiacenţi pe orizontală au valorile 1 şi 1. glcm(1,2) conţine valoarea 2 deoarece sunt două situaţii în care doi pixeli adiacenţi pe orizontală au valorile 1 şi 2. Elementul (1,3) al GLCM are valoarea 0 deoarece nu sunt situaţii în care doi pixeli adiacenţi pe orizontală să aibă valorile 1 şi 3. graycomatrix continuă procesarea imaginii de intrare, scanând imaginea pentru alte perechi de pixeli (i,j) şi înregistrând suma lor în elementul corespunzător al GLCM.
[pic]
Fig nr 16
Informaţii derivate din GLCM
După ce a fost creată o GLCM, cu ajutorul funcţiei graycoprops pot fi obţinute mai multe informaţii derivate, cu referire la textura unei imagini. Tabelul de mai jos prezintă principalele informaţii ce pot fi obţinute:
|Informaţie |Descriere |
|Contrast |Măsoară variaţiile locale ale GLCM |
|Corelaţie |Măsoară probabilitatea de apariţie a perechii de pixeli specificată. |
|Omogenitate |Măsoară apropierea distribuţiei elementelor GLCM faţă de diagonala acesteia |
Exemplu: Reprezentarea grafică a corelaţiei
Exemplul următor arată modul în care se poate crea o GLCM, cum se obţin informaţiile derivate din aceasta şi modul în care informaţiile returnate de graycoprops sunt în relaţie directă cu imaginea originală.
Citirea şi afişarea unei imagini grayscale. În exemplu (fig. nr. 17) imaginea truecolor este convertită în grayscale şi rotită cu 90°.
circuitBoard = rot90(rgb2gray(imread('board.tif')));
imshow(circuitBoard)
[pic]
Fig. nr. 17
Definirea ofseturilor pe direcţii şi distanţe diferite: Datorită faptului că imaginea conţine obiecte cu o varietate de dimensiuni şi forme care sunt aranjate pe orizontală şi pe verticală, exemplul specifică un set de ofseturi care variază doar cu distanţa.
offsets0 = [zeros(40,1) (1:40)'];
Crearea GLCM. Se apelează funcţia graycomatrix specificând ofseturile:
glcms = graycomatrix(circuitBoard,'Offset',offsets0)
Informaţii derivate din GLCM utilizând funcţia graycoprops. Exemplul calculează contrastul şi corelaţia.
stats = graycoprops(glcms,'Contrast Correlation');
Reprezentarea corelaţiei în funcţie de ofset (fig. nr. 18).
figure, plot([stats.Correlation]);
title('Texture Correlation as a function of offset');
xlabel('Horizontal Offset')
ylabel('Correlation')
[pic]
Fig. nr. 18
Graficul conţine vârfuri la valori ale ofsetului de 7, 15, 23 şi 30. Dacă se examinează cu atenţie imaginea de intrare, se poate observa că anumite elemente din imagine se repetă cu o periodicitate de 7 pixeli. Figura nr. 19 prezintă colţul din stânga sus al imaginii şi precizează locul unde apare acest model de repetiţie.
[pic]
Fig. nr. 20
................
................
In order to avoid copyright disputes, this page is only a partial summary.
To fulfill the demand for quickly locating and searching documents.
It is intelligent file search solution for home and business.