Reputation: 155
In MatLab, I have a binary image and I am trying to fill a hole. The problem is that the area is mostly (but not entirely) closed. Is there any existing visual processing functions that can do this? Do I have to write my own algorithm?
Original / Desired
Another separate problem is that I am having trouble detecting thin tail-like structures in a binary image. I need to remove these type of structures without removing the larger body it is attached to. Is there any existing visual processing functions that can do this? Do I have to write my own algorithm?
Original / Desired
Upvotes: 3
Views: 2767
Reputation: 65430
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('https://i.sstatic.net/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('https://i.sstatic.net/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)];
Upvotes: 5