Seperating labeled array areas using contourf
1 visualización (últimos 30 días)
Mostrar comentarios más antiguos
Alan Meier
el 4 de Abr. de 2020
Comentada: Alan Meier
el 8 de Abr. de 2020
I want to seperate areas which are stored in a labeled array. My intention was to use contourf as the built-in interpolation prevents sharp edges. As seen in the following picture, this is what I do not wan't to achieve (just as an example, contourf is not doing that!):
When I use
[M, c] = contourf(image_array, 200)
then 200 areas are succesfully distinguished. I know before how many areas there will be. However the above code results in a strange behaviour as lines are not only surrounding the labeled area, but instead other areas as well. The next picture is illustratin what I'm talking about:
As seen at most boundaries more than one line is seperating the areas.
My two questions are:
- How can I prevent contourf from using multiple lines around an area? What I want is just a single line as in the top right or bottom middle part of the picture.
- Any ideas how I can export the resulting seperation lines to mesh the areas e. g. with gmsh?
I attatched a file showing a cropped part of my areas.
0 comentarios
Respuesta aceptada
darova
el 4 de Abr. de 2020
You want x,y coordinates of boundaries? Or what kind of format it should be?
clc,clear
load areas.mat
I = (image_array);
lev = unique(I); % number of levels (unique values)
I2 = false(size(I)); % matrix for edge pixels
for i = 1:length(lev)
I1 = I == lev(i); % find region
I2 = I2 | edge(I1); % create edge and store
end
I1 = I;
I1(I2) = 50; % put boundaries into original image
imagesc([I 50*I2 I1])
axis equal off
9 comentarios
darova
el 5 de Abr. de 2020
Honestly have no idea how to eliminate those smal non-areas
About triangulation: since stlwrite wants triangles to write geometry you can triangulate manually
simple example
clc,cla
x = data{1,1};
y = data{1,2};
ix1 = isnan(x) | isnan(y);
x(ix1) = [];
y(ix1) = [];
x = [x; x(end)];
y = [y; y(1)];
gd = [2;length(x); x(:); y(:)];
dl = decsg(gd);
[p,e,t] = initmesh(dl); % return points, edges, triangles
fv.vertices = p'; % add points/vertices to struct
fv.faces = t(1:3,:)'; % add tiangles/faces to struct
patch(fv,'facecolor','g') % display patch
stlwrite(fv)
Más respuestas (0)
Ver también
Categorías
Más información sobre Data Distribution Plots en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!