Seperating labeled array areas using contourf

조회 수: 1 (최근 30일)
Alan Meier
Alan Meier 2020년 4월 4일
댓글: Alan Meier 2020년 4월 8일
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.

채택된 답변

darova
darova 2020년 4월 4일
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
darova
darova 2020년 4월 5일
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 2020년 4월 8일
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.

댓글을 달려면 로그인하십시오.

추가 답변 (0개)

카테고리

Help CenterFile Exchange에서 Data Distribution Plots에 대해 자세히 알아보기

태그

Community Treasure Hunt

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

Start Hunting!

Translated by