Pedro Marques
Pedro Marques

Reputation: 175

Image Segmentation Matlab

I have this BW image:

Mask Object Connected

And using the function RegionProps, it shows that some objetcs are connected:Region Props

So I used morphological operations like imerode to separte the objects to get their centroids: Objects separated Centroids

Now I have all the centroids of each object separated, but to that I lost a lot of information when eroding the region, like you can see in picture 3 in comparison with picture 1. So I was thinking if is there anyway to "dilate" the picture 3 till get closer to picture 1 but without connecting again the objects.

Upvotes: 0

Views: 640

Answers (2)

Tapio
Tapio

Reputation: 1642

You might want to take a look at bwmorph(). With the 'thicken', inf name-value pair it will thicken the labels until they would overlap. It's a neat tool for segmentation. We can use it to create segmentation borders for the original image.

bw is the original image. labels is the image of the eroded labels.

lines = bwmorph(labels, 'thicken', inf);

Image of segmentation lines

 segmented_bw = bw & lines

enter image description here

You could also skip a few phases and achieve similiar results with a marker based watershed. Or even better, as the morphological seesaw has destroyed some information as seen on the poorly segmented cluster on the lower right.

Upvotes: 3

Shai
Shai

Reputation: 114976

You can assign each white pixel in the mask to the closest centroid and work with the resulting label map:

[y x]= find(bw);  % get coordinates of mask pixels
D = pdist2([x(:), y(:)], [cx(:), cy(:)]);  % assuming cx, cy are centers' coordinates
[~, lb] = min(D, [], 2); % find index of closest center
lb_map = 0*bw;
lb_map(bw) = lb; % should give you the map.

See pdist2 for more information.

Upvotes: 1

Related Questions