Matte
Matte

Reputation: 339

Connect disjoint edges in binary image

I performed some operations on an image of a cube and I obtained a binary image of the edges of the cube which are disconnected at some places.The image I obtained is shown below:

enter image description here

I want to join the sides to make it a closed figure.I have tried the following:

BW = im2bw(image,0.5);                   
BW = imdilate(BW,strel('square',5));   
figure,imshow(BW);

But this only thickens the image.It does not connect the edges.I have also tried bwmorph() and various other functions, but it is not working.Can anyone please suggest any function or steps to connect the edges? Thank you

Upvotes: 3

Views: 3654

Answers (2)

Matte
Matte

Reputation: 339

I used the above code to write the following one.I haven't tested it on many images and it may not be as efficient as the one above but it executes faster comparatively.So I thought I would post it as a solution.

I = imread('image.jpg');  % your original image
I=im2bw(I);
figure,imshow(I)
I= I(5:end-4,5:end-4);
im1 = bwmorph(I,'thin',Inf);
[x,y] = find(bwmorph(im1,'endpoints'));
for iter = 1:numel(x)-1
im1=linept(im1, x(iter), y(iter), x(iter+1), y(iter+1));
end
im2=imfill(im1,'holes');
figure,imshow(im2);
BW = edge(im2);
figure,imshow(BW);
se = strel('diamond', 1);
im3 = imdilate(BW,se);
figure,imshow(im3);

The final result is this: cube

I got the "linept" function from here:http://in.mathworks.com/matlabcentral/fileexchange/4177-connect-two-pixels

Upvotes: 2

Divakar
Divakar

Reputation: 221714

This could be one approach -

%// Read in the input image
img = im2bw(imread('http://i.imgur.com/Bl7zhcn.jpg'));

%// There seems to be white border, which seems to be non-intended and
%// therefore could be removed
img = img(5:end-4,5:end-4);

%// Thin input binary image, find the endpoints in it and connect them
im1 = bwmorph(img,'thin',Inf);
[x,y] = find(bwmorph(im1,'endpoints'));
for iter = 1:numel(x)-1
    two_pts = [y(iter) x(iter) y(iter+1) x(iter+1)];
    shapeInserter = vision.ShapeInserter('Shape', 'Lines', 'BorderColor', 'White');
    rectangle = int32(two_pts);
    im1 = step(shapeInserter, im1, rectangle);
end
figure,imshow(im1),title('Thinned endpoints connected image')

%// Dilate the output image a bit
se = strel('diamond', 1);
im2 = imdilate(im1,se);
figure,imshow(im2),title('Dilated Thinned endpoints connected image')

%// Get a convex shaped blob from the endpoints connected and dilate image
im3 = bwconvhull(im2,'objects',4);
figure,imshow(im3),title('Convex blob corresponding to previous output')

%// Detect the boundary of the convex shaped blob and 
%// "attach" to the input image to get the final output
im4 = bwboundaries(im3);
idx = im4{:};

im5 = false(size(im3));
im5(sub2ind(size(im5),idx(:,1),idx(:,2))) = 1;

img_out = img;
img_out(im5==1 & img==0)=1;
figure,imshow(img_out),title('Final output')

Debug images -

enter image description here

enter image description here

enter image description here

enter image description here

Upvotes: 8

Related Questions