Seperating labeled array areas using contourf

2 visualizzazioni (ultimi 30 giorni)
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:
  1. 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.
  2. 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.

Risposta accettata

darova
darova il 4 Apr 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 Commenti
darova
darova il 5 Apr 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)
Alan Meier
Alan Meier il 8 Apr 2020
This solution worked out for me. Instead of contour I used contours, which is described here. It has the advantage of not creating a visualization and is therefor faster, especially when processing larger data.

Accedi per commentare.

Più risposte (0)

Categorie

Scopri di più su Contour Plots in Help Center e File Exchange

Tag

Community Treasure Hunt

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

Start Hunting!

Translated by