Matlab: Segmentierung Wachstum (Segmentation Growing)
Segmentierung Wachstum (Segmentation Growing)
(English) Diese Post ist über ein Verfahren um Objekte aus BIldern zu segmentieren. Dafür wird eine Region gewählt (seed) und mit einem Gewichtungsfaktor, der von der Standartabweichung und der Durchschnittswert der Region und dem Faktor f abhängt, gewählt. Wenn Pixel, die unmittelbar um das seed liegen innerhalb der Grenzen sind, wird dieser dem seed hinzugefügt. Dies wird so lange fortgezetzt, bis kein Wert mehr dem seed hinzugefügt wird. Dann ist das Objekt somit segmentiert.function [region, area, seed, sx1, sx2, sy1, sy2] = Segmentation_Growing(img,sx1,sx2,sy1,sy2,f):
Diese Funktion benötigt ein Bild als input. Wird sonst nichts als input angegeben kann mit 2 Markern der Bereich festgelegt werden, in dem der seed ist. Andernfalls wird mit sx1, sy1 die obere linke Ecke und mit sx2, sy2 die untere rechte Ecke definiert. Wird mit den Markern gearbeitet, kann als zweiter input f angegeben werden. Diese Variable beschreibt die Gewichtung und kann Werte größer gleich Null annehmen.
Dies ist in der unteren Abbildung für f=1 (blau), f=1.5 (gelb) und f=2 (grün) gezeigt. Das rote Rechteck beschreibt den seed.
Die Augabe der Funktion ist region, welches das segmentierte Objekt ausgibt. Die Variable area gibt für den segmentierten Bereich eine 1 und für den Rest eine 0 zurück zur leichteren Darstellung. Mit seed wird der seed zurückgegeben, der mit den Markern ausgewählt wurde.
In unterer Abbildung sind für 3 verschiedene Regionen die Ergebnisse für 3 verschiedene Werte von f dargestellt. Das Bild unten rechts zeigt das Auswahlfenster zur Definition des seeds mit dem Marker.
Hier kann die Funktion auf Matlab heruntergeladen werden, bzw. weiter unten ebenfalls angeschaut werden:
Quellcode:
function [region, area, seed, sx1, sx2, sy1, sy2] = Segmentation_Growing(img,sx1,sx2,sy1,sy2,f)%img is the image which is segmentated
%sx1 and sy1 are the values of the upper left corner and
%sx2 and sy2 are the values of the lower right corner
%f can vary between 1 and 2 and is the weigthing factor
%region is the output of the segmentated region
%if area is in region it's one otherwise it's 0
%seed is the start area
%definition of f if not already defined
if nargin < 6
f = 1.5;
end
if nargin == 2
f = sx1;
end
% initialize the the region of interest by to cursors
if nargin < 3
fig(1) = figure(1);
clf(1);
imshow(img);
dcm_obj = datacursormode(fig(1));
set(dcm_obj,'DisplayStyle','datatip','SnapToDataVertex','off','Enable','on')
disp('Click for left upper corner of region of interest')
pause
pos1 = getCursorInfo(dcm_obj);
pos = pos1.Position;
sx1 = pos(2);
sy1 = pos(1);
disp('Click for right lower corner of region of interest')
pause
pos2 = getCursorInfo(dcm_obj);
pos = pos2.Position;
sx2 = pos(2);
sy2 = pos(1);
close(fig(1));
end
%generate the seed;
seed = img(sx1:sx2, sy1:sy2);
n = size(img);
% all non segmented regions are infinity
region = ones(n)*inf;
region(sx1:sx2, sy1:sy2) = img(sx1:sx2, sy1:sy2);
region2 = ones(n);
% end condition if region in 2 following steps are equal
tf = isequal(region2,region);
q = double(tf);
while q < 1
%calculate the mean and standard deviation of all non-inf elements
rv = region(:);
vec = rv(rv~=inf);
m = mean(vec);
s = std(vec);
%find all elements in region and sum over them
[i1,j1,v1] = find(region~=inf);
for r=1:1:numel(i1)
i = i1(r);
j = j1(r);
%sum over all neighboors
for k=-1:1:1
for l=-1:1:1
if i+k >= n(1) || j+l >= n(2) || i+k <= 0 || j+l <= 0
continue
end
%include all outside particles which fullfill condition
if region(i+k,j+l) ~= inf
else
if img(i+k,j+l) > m-f*s && img(i+k,j+l) <m+f*s
region(i+k,j+l) = img(i+k,j+l);
end
end
end
end
end
% ending condition
tf = isequal(region2,region);
q = double(tf);
region2 = region;
end
% define the area which is segmented as 1, otherwise 0
area = region;
area(region~=inf) = 1;
area(area~=1) = 0;
end
Kommentare
Kommentar veröffentlichen