Search code examples
matlabimage-processingmatlab-cvst

Fill in a region of a binary image which is not completely closed


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

enter image description here enter image description here

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

Original Image Desired Image


Solution

  • 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');
    

    enter image description here 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));
    

    enter image description here

    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)];
    

    enter image description here