Expert Answer:
:
In the first example, you can use imclose
to perform a dilation followed by an erosion to close those edges. Then you can follow up with imfill
to completely fill it in.
img = imread('http://i.stack.imgur.com/Pt3nl.png');
img = img(:,:,1) > 0;
% You can play with the structured element (2nd input) size
closed = imclose(img, strel('disk', 13));
filled = imfill(closed, 'holes');
Similarly, with your second set of images, you can use imopen
(erosion followed by dilation) to remove the tail.
img = imread('http://i.stack.imgur.com/yj32n.png');
img = img(:,:,1);
% You can play with the structured element (2nd input) size
% Increase this number if you want to remove the legs and more of the tail
opened = imopen(img, strel('disk', 7));
Update
If you want the centroid of the central opening of the "closed" image above, you can get a mask which is just this opening by subtracting closed
from filled
.
% Find pixels that were in the filled region but not the closed region
hole = filled - closed;
% Then compute the centroid of this
[r,c] = find(hole);
centroid = [mean(r), mean(c)];