How do I convert multiple discontinuous lines into a single polyshape?

6 visualizaciones (últimos 30 días)
For the image attached, I have the coordinates of the points along each individual line, with these lines having been extracted from a contour map. The blue lines show the low amplitude boundaries, while the yellow lines indicate the direction of increasing amplitude. From these line coordinates I am hoping to create polyshapes.
The issue I'm having is that because some of the lines are discontinuous, going beyond the axes limits, when I fill them in they only fill the region bound by that line, not considering the other lines around them. As such, I was wondering if there was an easy way to have Matlab automatically join up the lines that should contribute to the same region (i.e. the 2 seen in the top left or the 3 at the bottom of the figure below) so that I can get polyshapes of the regions I'm interested in?
Thank you in advance for any help you can offer!
  3 comentarios
Fraser Douglas
Fraser Douglas el 14 de Oct. de 2022
Editada: Fraser Douglas el 14 de Oct. de 2022
I have attached the data and code to my original post, hopefully you are able to download it okay!
The lines at the bottom are meant to have the area between them filled, but it isn't entirely necessary to make them into polyshapes, although I was wanting to do this so that I can easily track their centroids. The image is simply one of a long timeseries of images where the shaded regions are expected to move and grow.
I may be going about this in a rather convoluted way though, if there is a way to go directly from the contour plot to polyshapes or similar this would be a better solution.
Matt J
Matt J el 14 de Oct. de 2022
it isn't entirely necessary to make them into polyshapes, although I was wanting to do this so that I can easily track their centroids.
You could do that easily enough with regionprops, e.g.,
regionprops(im>0.41,'Centroid')

Iniciar sesión para comentar.

Respuesta aceptada

Matt J
Matt J el 14 de Oct. de 2022
Editada: Matt J el 14 de Oct. de 2022
Using this FEX download,
load im.mat
imp=padarray(im,[1,1]);
[m,n]=size(im);
levels=[0.4,0.41];
clear p
for i=1:numel(levels)
M=contourc(imp,[levels(i),levels(i)]);
[~,XY]=getContourLineCoordinates(M);
X=cellfun(@(z) z(:,1)-1, XY,'uni',0);
Y=cellfun(@(z) z(:,2)-1, XY,'uni',0);
p(i)=polyshape(X,Y);
end
Warning: Polyshape has duplicate vertices, intersections, or other inconsistencies that may produce inaccurate or unexpected results. Input data has been modified to create a well-defined polyshape.
plot(p);axis equal;
set(gca,'YDir','reverse');
axis([1,m,1,n]);
  1 comentario
Fraser Douglas
Fraser Douglas el 14 de Oct. de 2022
That has done just the trick! Thank you so much for your help, hope you have a great day ahead of you :)

Iniciar sesión para comentar.

Más respuestas (0)

Categorías

Más información sobre Elementary Polygons en Help Center y File Exchange.

Productos


Versión

R2022b

Community Treasure Hunt

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

Start Hunting!

Translated by