Namai > Tyrinėjimai > Matematinės morfologijos operatoriai

Matematinės morfologijos operatoriai

2011-10-05

Apie pačią matematinę morfologiją plačiai nerašysiu, mes tik pabandysime pažiūrėti kelias sąvokas ir iš karto šį bei tą išbandyti.

Struktūrizavimo elementas (structuring elements) yra binarinis paveiksliukas, pavyzdžiui kokia nors geometrinė forma (stačiakampis, diskas, kaimynų aibė ir t.t.), dažniausiai gerokai mažesnis už paveiksliuką kuriam bus naudojamas.

Morfologiniai operatoriai:

  • Išplėtimas (dilation) – padidina paveiksliuką;
  • Erozija (erosion) – sumažina paveiksliuką;
  • Uždarymas (closing) – uždaro vidines skyles ar išorines įlankas;
  • Atidarymas (opening) – pašalina smulkias, atsikišusias į foną dalis.

Paimkim tokį pavyzdį:

Tai binarinis 10×10 dydžio paveiksliukas su figūra.

Paimkime paprastą struktūrizavimo elementą 3×3 dydžio (kvadratą): [1 1 1; 1 1 1; 1 1 1] ir panaudokime visus keturis operatorius (viršutinis kairysis – dilation, viršutinis dešinysis – closing, apatinis kairysis – erosion, apatinis kairysis – opening):

dilation, erosion, opening, closing

Kodas:

Selec All Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
tic;
clc;
close all;
file = 'D:\shape.bmp';
rgb = imread(file);
B = im2bw(rgb, 0.8);
 
se = strel('square', 3);
B1 = imdilate(B, se);
subplot(2,2,1), subimage(B1)
 
se = strel('square', 3);
B2 = imerode(B, se);
subplot(2,2,2), subimage(B2)
 
se = strel('square', 3);
B3 = imclose(B, se);
subplot(2,2,3), subimage(B3)
 
se = strel('square', 3);
B4 = imopen(B, se);
subplot(2,2,4), subimage(B4)
 
fprintf('Užtruko: %4.2f s\n', toc);

Naudojant šias operacijas atliekamos įvairiausios užduotys, pavyzdžiui galime išryškinti šių dvejų detalių defektus:

Jei labai gerai įsižiūrėti, tai abi detalės turi po defektą t.y. trūksta po vieną dantuką, tačiau tam kad pastebėti tokius defektus, reikia labai daug atidumo. Pabandysime naudojant morfologinius operatorius, šiuos defektus išryškinti. Kodas:

Selec All Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
tic;
clc;
close all;
file = 'D:\gears.bmp';
rgb = imread(file);
B = im2bw(rgb, 0.8);
imshow(B); 
 
% rasti skyles
file = 'D:\hole_ring.bmp';
rgb = imread(file);
hole_ring = im2bw(rgb, 0.8);
SE = strel(hole_ring);
B1 = imerode(B, SE); % erozija naudojant žiedo struktūros kaimynus
imshow(B1); 
 
% padidinti skyles
SE = strel('disk', 20, 0);
B2 = imdilate(B1, SE);
imshow(B2); 
 
% užkimšti skyles
B3 = bitor(B, B2);
imshow(B3); 
 
% tik dantukai
SE = strel('disk', 20, 0);
B7 = imopen(B3, SE);
B8 = B3 - B7;
imshow(B8);
 
% padidinti dantukai
SE = strel([1; 1]);
B9 = imerode(B8, SE);
SE = strel('disk', 4, 0);
B9 = imdilate(B9, SE);
imshow(B9);

Rezultatai:

Paskutiniame paveiksliuke defektai išryškinti akivaizdžiai. Jei žiūrėti paeiliui, tai pirmiausia erozijos pagalba aptinkamos skylės. Tam pritaikytas erozijos operatorius ir žiedo kaimynai, kurie pateikti atskiru paveiksliuku – hole_ring.bmp:

Gauti keturi maži objektai (antras paveiksliukas), kurie yra skylių centruose. Jie padidinami tiek, kad pilnai uždengtų pačias skyles. Naudojant OR operaciją su originaliu paveiksliuku ir tais gautais objektais, gaunamas trečias paveiksliukas be skylių. Ketvirtame atmesta vidinė detalės dalis, o penktame kiekvienas dantukas išryškinamas.

Tyrinėjimai , , , , , , , ,

Komentavimas uždarytas.