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 4- szomszé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 = A = 144.8270 385.5260 215.4610 146.1570 213.8750 365.0140 181.0240 34.0400 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