Finish lines in the image

8 views (last 30 days)
Mateusz Matysiak
Mateusz Matysiak on 16 Sep 2019
Commented: Matt J on 27 Sep 2019
Dear all,
I have an image like the one attached. I have it in binary format.
How do I complete the white lines so the first lines crosses x=0 point, and the remaining lines are finished until they cross each other?
This script should be flexible enough so the number of lines may change (more gaps) and they don't necessarily are lines. They may also be curves.
Here is another example where there are more gaps in data.
Thank you for your help!
  5 Comments
Matt J
Matt J on 20 Sep 2019
This script should be flexible enough so the number of lines may change (more gaps) and they don't necessarily are lines. They may also be curves.
You mentioned here that the pieces might be curved (not lines) and so naive line-fitting wouldn't work. Please show an example of this more complicated case and how you want the curves extended.

Sign in to comment.

Accepted Answer

Matt J
Matt J on 18 Sep 2019
Edited: Matt J on 18 Sep 2019
Here is another method based on interpolation, and faster than dilating with large strels.
[m,n]=size(A);
[I,J]=find(bwskel(A));
IJ=sortrows([I,J],2);
[I,J]=deal(IJ(:,1),IJ(:,2));
Jw=(J(1):J(end)).';
Iw=round(interp1(J,I,Jw));
B=imdilate( accumarray([Iw,Jw],1,[m,n]) , strel('sphere',1));
imshow(B)
  6 Comments
Matt J
Matt J on 20 Sep 2019
You are welcome, but please Accept-click an answer if you have found one that works for you.

Sign in to comment.

More Answers (2)

Matt J
Matt J on 17 Sep 2019
Perhaps as follows,
gapsize=36;
A=imcrop(rgb2gray(imread('image.png')));
B=(imdilate(A,strel('sphere',ceil(gapsize/2)))>0);
C=imdilate(bwskel(B),strel('sphere',1))|A;
imshow(C)
Capture.PNG
  12 Comments
Matt J
Matt J on 27 Sep 2019
I don't understand how the linking is supposed to work. I suspect, in any case, that it will require a very different method, since it is a very different kind of image. A new thread may be a good idea.

Sign in to comment.


Image Analyst
Image Analyst on 18 Sep 2019
You might look to the "edge linking" link to the right for alternative methods. The method I like, which may be faster than dilation followed by skeletonization is to call bwmorph(bw, 'endpoints') and then use imline() to draw a line connecting endpoints closer than some distance that you specify.
  1 Comment
Mateusz Matysiak
Mateusz Matysiak on 21 Sep 2019
Image Analyst,
Please explain the imline part. Please give an example.
Thank you

Sign in to comment.

Community Treasure Hunt

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

Start Hunting!