Seperating labeled array areas using contourf

1 view (last 30 days)
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.

Accepted Answer

darova
darova on 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 Comments
darova
darova on 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 on 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.

Sign in to comment.

More Answers (0)

Categories

Find more on Data Distribution Plots in Help Center and File Exchange

Tags

Community Treasure Hunt

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

Start Hunting!