KÉPFELDOLGOZÁS 10. gyakorlat: Morfológiai műveletek, alakjellemzők
Min-max szűrők MATLAB-ban • SE = strel(alak, paraméter(ek)); szerkesztőelem generálása – – – – –
strel(’square’, w): négyzet alakú, w méretű strel(’rectangle’, [m n]): téglalap alakú, m∙n méretű strel(’disk’, r): kör alakú, r sugarú strel(’line’, len, deg): vonal alakú, len hosszú, deg irányú …
• imdilate(img, SE): dilatáció az SE szerkesztőelemmel • imerode(img, SE): erózió az SE szerkesztőelemmel
Nyitás és zárás MATLAB-ban • imopen(img, SE): morfológiai nyitás, azaz erózió és dilatáció egymásutánja az SE szerkesztőelemmel • imclose(img, SE): morfológiai zárás, azaz dilatáció és erózió egymásutánja az SE szerkesztőelemmel
Morfológiai műveletek (példa) img = imread('binimg.png’); img = img / 255; se = strel('disk', 3); img_erode = imerode(img, se); img_dilate = imdilate(img, se); img_open = imopen(img, se); img_close = imclose(img, se);
Morfológiai műveletek (példa) img = imread('binimage.png’); img = img / 255; se = strel('disk', 3); img_open = imopen(img, se); img_open_close = imclose(img_open, se);
Váz • Az objektum általános, egyszerűsített formája • A meghatározandó struktúra… – … vékony (1 pixel vastag szegmensekből áll), – … topológiailag ekvivalens a kiindulási képpel, – … az objektumok közepén helyezkedik el.
A váz egy lehetséges meghatározása
Vékonyítás A front-terjedés modellezése: topológia- és alakmegőrző iteratív redukció
Vázkijelölés MATLAB-ban • Kétféle beépített vékonyító algoritmus: – bwmorph(BW, ’skel’, Inf); – bwmorph(BW, ’thin’, Inf); 3. paraméter: hány iterációig menjen, Inf esetén addig fut, amíg a vázhoz nem jutunk
• A vázon kijelölhető speciális pontok: – bwmorph(skel, ’endpoints’): végpontok – bwmorph(skel, ’branchpoints’): elágazási pontok
Váz (példa) skeleton1 = bwmorph(img_open_close, 'skel', Inf); skeleton2 = bwmorph(img_open_close, 'thin', Inf); figure('Name', 'Kétféle váz', 'NumberTitle', 'off'); imshow([skeleton1, skeleton2]);
Elágazási pontok, végpontok (példa) branch = bwmorph(skeleton2, 'branchpoints'); ends = bwmorph(skeleton2, 'endpoints'); figure('Name', 'A váz elágagási pontjai és végpontjai', ... 'NumberTitle', 'off'); imshow([branch,ends]);
Határvonal Olyan objektumpontok (fehér pontok, ’1’-esek) halmaza, amelyeknek legalább az egyik 4szomszédjuk háttérpont (fekete pont, ’0’-ás). N W
p
E
N==0 or E==0 or S==0 or W==0
S
• Határvonal-generálás MATLAB-ban: bwmorph(BW, ’remove’);
Határvonal (példa) border = bwmorph(img_open_close, 'remove'); figure('Name', 'Határvonal', 'NumberTitle', 'off'); imshow(border);
A struct típus MATLAB-ban • Struktúratömb: különböző nevű elemekkel (mezőkkel) rendelkezhet, a mezők különböző adattípusúak lehetnek. objektum(1).nev = 'első'; objektum(1).vektor = [1 2 3 4 5]; objektum(2).nev = 'második'; objektum(2).vektor = [10 20]; objektum(3).nev = 'harmadik'; objektum(3).vektor = [2 3 5 7];
A regionprops függvény • stats = regionprops(BW,properties): – BW: bináris kép, – properties: egy vagy több alakleíró neve (sztringek vesszővel elválasztva) – stats: az alakleírókat tartalmazó struktúratömb a mezők neve az alakleírók nevével egyezik Az n-edik objektum X nevű jellemzője: stats(n).X A cat függvénnyel mátrixra konvertálható: M = cat(1, stats.X) M mátrix n-edik sorába kerül a stats(n).X
Terület és kerület • Terület: objektumpixelek száma – regionprops(BW,’area’);
• Kerület: a határ hossza (közelítő érték) – regionprops(BW,’perimeter’);
Terület és kerület (példa) prop = regionprops(img_open_close, 'Perimeter'); P = cat(1, prop.Perimeter) prop = regionprops(img_open_close, 'Area'); A = cat(1, prop.Area) P = 144.8270 385.5260 215.4610 146.1570 213.8750 365.0140 181.0240 34.0400
A = 1238 2127 1372 687 1052 2267 1750 109
Befoglaló téglalap • Az objektumot tartalmazó minimális területű téglalap • Vízszintes helyzetű befoglaló téglalapok paramétereinek számítása: regionprops(BW,’BoundingBox’); Négyelemű vektorként tárolódnak: [ bal felső sarok y koordinátája, bal felső sarok x koordinátája, szélesség (oszlopok száma), magasság (sorok száma) ]
Befoglaló téglalap prop = regionprops(img_open_close, 'BoundingBox'); BB = cat(1, prop.BoundingBox); figure imshow(img_open_close); for i=1:size(BB,1) rectangle('Position', BB(i,:),'EdgeColor','g', 'LineWidth', 2, 'LineStyle', '-');
Az i-edik objektum befoglaló téglalapjának rárajzolása az ábrára zöld színnel, 2 pixel vastagon, folytonos vonallal
Befoglaló téglalap • imcrop(img, [y x w h]): külön mátrixba kinyeri az img azon w széles és h magas téglalap által határolt részét, melynek bal felső sarka az (x,y) pontban van prop = regionprops(img_open_close, 'BoundingBox'); BB = cat(1, prop.BoundingBox); cropped = imcrop(img_open_close, BB(1,:)); figure, imshow(cropped);
Az első objektum befoglaló téglalapja által határolt rész kinyerése
Súlypont (vagy centroid) • Az objektumpixelek y és x koordinátáinak átlagaként kapjuk regionprops(BW,’Centroid’) – [y,x] alakú vektorként tárolódik az (x,y) koordinátájú centroid
Súlypont (példa) prop = regionprops(img_open_close,'centroid'); C = cat(1, prop.Centroid); figure, imshow(img_open_close); hold on; plot(C(:,1),C(:,2), 'b*');
Súlypontok rárajzolása az ábrára kék csillagokként
Konvex burok • Az alakzatot tartalmazó minimális konvex alakzat: bwconvhull(BW, method) – BW: bináris kép – method: ’union’ vagy ’objects’ ’union’: az objektumok együttesének konvex burkát számolja (egyetlen konvex burok) ’objects’: objektumonként külön-külön konvex burkot számol
Konvex burok CH1 = bwconvhull(img_open_close, 'objects'); CH2 = bwconvhull(img_open_close, 'union'); imshow([CH1,CH2]);
Objektumok címkézése • L = bwlabel(BW) BW kép mindegyik objektuma egy sorszámot kap, az n-edik objektum pixelei n intenzitásúak az L képen
Címkézés (példa) labelled = bwlabel(img_open_close); imshow(labelled, []); display('Objektumok száma:'); display(max(max(labelled))); figure, imshow(labelled == 3); Objektumok száma: ans = 8
Erózió implementációja kereszt alakú szerk. elemre
p
function result = bwerode(img) [height,width] = size(img); padimg = false(height+2, width+2); padimg(2:height+1,2:width+1) = img; result = padimg; for i=2:height+1 for j=2:width+1 if padimg(i-1,j)==0 | padimg(i+1,j)==0 | ... padimg(i,j-1)==0 | padimg(i,j+1)==0 result(i,j) = 0; end end end result = result(2:height+1, 2:width+1); end
Megjegyés: ugyanilyen szerkesztőelemű dilatáció hasonlóképpen implementálható, csak a 0-ákat 1-esekre kell lecserélni
Határvonal implementációja p
function result = bwborder(img) [height,width] = size(img); padimg = false(height+2, width+2); padimg(2:height+1,2:width+1) = img; result = padimg; for i=2:height+1 for j=2:width+1 if padimg(i,j)==1 & ... padimg(i-1,j)==1 & padimg(i+1,j)==1 & ... padimg(i,j-1)==1 & padimg(i,j+1)==1 result(i,j) = 0; end end end result = result(2:height+1, 2:width+1); end