Binary Image Edge Linking

I have a binary image of 200 rows and 200 columns. I need to find the distance between two white (255) pixel along the row and column. If the distance is 3 , i need to fill the gap along row and column with ones. I tried something but it doesnt work well. Can anyone please help me ?
vess is the binary output.
[M N]=size(vess);
[x y]=find(vess);
points = [ x y];
[~,ii] = sort(points(:,1));
out = points(ii,:);
% for i=1:M
[M1 N1]=size(points);
% u=2;
for i=1:M1-1
C=[out(i,1),out(i,2);out(i+1,1),out(i+1,2)];
d = round(pdist(C,'euclidean'))
if d==3
p1=[out(i,1),out(i,2)];
p2=[out(i+1,1),out(i+1,2)];
if p1(1)==p2(1)
vess(p1(1),p1(2)+1:p2(2)+1)=1;
end
if p2(2)==p1(2)
vess(p1(1)+1,p1(1):p2(1)+1)=1;
end
end
end

 Accepted Answer

Image Analyst
Image Analyst on 28 May 2015
Yes, I can tell it wouldn't.
  1. First of all you need to find the endpoints of your lines/curves segments with bwmorph.
  2. Then you need to label the segments and get a list of all the points in the segment.
  3. Then you need to get a list of the distances from each endpoint to all other endpoints that are not in the same segment, and pick the endpoint with the smallest distance.
  4. If the distance is less than some specified allowable distance, you need to use imline() to burn a line into the binary image connecting those two endpoints.
  5. Repeat for every endpoint.
So that's the algorithm, though it could be made more sophisticated if you were to add criteria like saying the angle of the ends needs to be about the same angle, etc.. So, try to code it up and if you run into trouble, be SURE to attach your binary image of your skeletonized line/curve segments.

13 Comments

The top image looks like an edge detection image, and the bottom image looks like the original binary image. Did you use bwmorph(binaryImage, 'skel', inf) to skeletonize the binary image, and bwmorph(binaryImage, 'endpoints') to generate the endpoints image? Did you use bwlabel to label each skeleton segment? Where is your code? You could help me help you if you at least did some of it for me, rather than me writing all of it for you.
Jes
Jes on 28 May 2015
Edited: Image Analyst on 28 May 2015
Bottom image is the edge detected image from the original image. Here, I have connect the pixels which are unconnected by using some local processing(based on the distance between white pixels) to improve the accuracy.
%vess -bottom image
vess1=bwmorph(vess, 'skel', inf);
vess2 = bwmorph(vess,'endpoints');
L = bwlabel(vess1);
Where is the rest of the code? I think it somehow got cutoff or didn't make it. Where are steps 3, 4, and 5 in the algorithm I gave you?
Jes
Jes on 29 May 2015
I have little knowledge in MATLAB. I tried the following code: vess4=bwmorph(vess, 'skel', inf); vess3 = bwmorph(vess,'endpoints'); [L num] = bwlabel(vess4); [M N]=size(L);k=1;sum=0;r=1; while k<50 for i=1:M for j=1:N if L(i,j)==k sum=sum+1; x(r)=i; y(r)=j;r=r+1; end end end R(k)=sum;sum=0;k=k+1; end S=vertcat(x,y);S=S'; Please help me further to find the distance from each endpoint to all others.
Nevermind - I'll work on it and do it. I think it might make a good demo since people often ask about edge linking. Maybe by tomorrow afternoon or the next day I'll have something. Be patient if you want me to do it, but by all means keep working on it yourself.
Jes
Jes on 29 May 2015
ok. Thanks a lot. I am also keep working.
Did you finalize the results ?
I'm still working on it. A few things to clean up and perfect. Here is a copy but I'm still going to make changes on it.
Thank you very much. have you finalized the code?
No, not yet, maybe this weekend. But it would be just things to make it look fancier - most of the code would be the same.
Thank you
Jes
Jes on 2 Jun 2015
Edited: Jes on 3 Jun 2015
Could you please help me how to obtain the binary edge linked image (variable) in the above code? Thanks in Advance.
That's the part I have not finished yet. But I'll tell you how to do it. You need to use imline() to burn a line into an image and then "OR" that into the main binary image. I'm attaching a demo for doing that, which you can incorporate into the demo I already gave you.

Sign in to comment.

More Answers (0)

Products

Asked:

Jes
on 28 May 2015

Commented:

on 3 Jun 2015

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!