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


Quellcode Benutzung:

 clear;
clc;

img = imread('onion.png');
img = im2double(img);
img = rgb2gray(img);
%a)

[region,area,seed,sx1,sx2,sy1,sy2] = Segmentation_Growing(img,1);
[region2,area2] = Segmentation_Growing(img,sx1,sx2,sy1,sy2,1.5);
[region3,area3] = Segmentation_Growing(img,sx1,sx2,sy1,sy2,2);

n = size(region);
% use my function and plot everything
fig(1) = figure(1);
clf(1);
subplot(2,2,1);hold on;imshow(img);title('original');
subplot(2,2,2);hold on;imshow(region3);title('f = 2.0');
subplot(2,2,3);hold on;imshow(seed);title('seed');
subplot(2,2,4);hold on;title('All together');
imshow(img);
green = cat(3, zeros(n), ones(n), zeros(n));
h = imshow(green);set(h, 'AlphaData', area3);
yellow = cat(3, 0.8*ones(n), 0.8*ones(n), zeros(n));
h2 = imshow(yellow);set(h2, 'AlphaData', area2);
blue = cat(3, zeros(n), zeros(n), ones(n));
h3 = imshow(blue);set(h3, 'AlphaData', area);
plot([sy1 sy2 sy2 sy1 sy1],[sx1 sx1 sx2 sx2 sx1],'r');

Kommentare

Beliebte Posts aus diesem Blog

Matlab: Fehlergeraden

Matlab: 3D Kartesisches Grid, Vektoren mit Transformation/Rotation

Matlab: Farbspektrum für Plots