jer
jer

Reputation: 13

Filling the gaps in a binary image

I have found a couple areas referring to filling of gaps in binary images in matlab, however I am still struggling. I have written the following code but I cannot get it to work. Here is my binary image:

Binary_image.png.

However, what I'm trying to achieve is the following

Binary_image_after.

Does anyone know how to do this? I have been trying using imfill but I know I think I need to define boundaries also with the bwlabel function but I dont know how. Any help would be greatly appreciated.

%%Blade_Image_Processing

clc;
clear;

%%Video file information
obj = VideoReader('T9_720p;60p_60mm_f4.MOV');

% Sampling rate - Frames per second
fps = get(obj, 'FrameRate');
dt = 1/fps;

% ----- find image info -----
file_info = get(obj);
image_width = file_info.Width;
image_height = file_info.Height;

% Desired image size
x_range = 1:image_height;
y_range = 1:image_width;
szx = length(x_range);
szy = length(y_range);



%%Get grayscale image
grayscaleimg1 = rgb2gray(read(obj,36));
grayscaleimg = imadjust(grayscaleimg1);
diff_im = medfilt2(grayscaleimg, [3 3]);
t1=60;
t2=170;
range=(diff_im > t1 & diff_im <= t2);
diff_im (range)=255;
diff_im (~range)=0;

% Remove all those pixels less than 300px
  diff_im = bwareaopen(diff_im,2000);

  %imshow(diff_im)

  %imhist(grayscaleimg)

  %Fill gaps in binary image
  BW2 = imfill(diff_im,'holes');

Upvotes: 0

Views: 479

Answers (1)

Lech Napierała
Lech Napierała

Reputation: 43

There are two main problems: desired object has no readily usable distinguishing features, and it touches other object. Second problem could be perhaps cleared with morphological opening/closing (touching object is thin, desired object not, is this always the case?), but first problem remains. If your object touched edge but others didn't or vice versa, you could do something with imfill and subtractions. As it is now, MAYBE something like this would work:

  • With opening/closing remove connection, so your object is disjoint.
  • With imfill, remove what is left of this thin horizontal thing.
  • Then, you can bwlabel and remove everything that touches sides or bottom of the image - in shown case that would leave only your object.

Exact solution depends heavily on what additional constrains are there for your pictures. I believe it is not a one-shot, rather you have more of those pictures and want to correctly find objects on all? You have to check what holds for all pictures, such as if object always touches only something thin or if it always touches only upper edge etc.

Upvotes: 1

Related Questions