确定单元格集合中所有连续的单元格集合

时间:2019-07-11 23:40:06

标签: algorithm matlab image-processing computational-geometry convex-polygon

假设我有一个单元格集合。现在,这些单元格可以简单地用数组表示。例如,

indices=[64,65,88,89,90,91,111,112,113,114,115,116,117,135,136,137,138,139,140,141,142,143,158,159,160,161,162,163,164,165,166,167,168,169,182,183,184,185,186,187,188,189,190,191,192,193,194,195,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,282,283,284,285,286,287,288,289,290,291,292,293,294,295,307,308,309,310,311,314,315,316,317,318,319,320,341,342,343,344,345,367,368,369,393,394];

如果您想知道此数组如何表示单元格的集合,请使用以下可视化代码:

clear;
close all;
A=ones(25,25);
indices=[64,65,88,89,90,91,111,112,113,114,115,116,117,135,136,137,138,139,140,141,142,143,158,159,160,161,162,163,164,165,166,167,168,169,182,183,184,185,186,187,188,189,190,191,192,193,194,195,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,282,283,284,285,286,287,288,289,290,291,292,293,294,295,307,308,309,310,311,314,315,316,317,318,319,320,341,342,343,344,345,367,368,369,393,394];
A(indices)=2;
figure
hold on
axis equal
axis ij
xx=10:20:500;
yy=10:20:500;
imagesc(xx,yy,A);
colormap([1.0000         0    0.7931;
    1.0000    0.8276         0]);
rt=[0,500];
gcs=0:20:500;
gds=ones(size(rt,2),size(gcs,2));
gds = bsxfun(@times,gds,gcs);
plot(rt,gds,'Color','k','LineStyle','-');
plot(gds,rt,'Color','k','LineStyle','-');
axis([0 350 100 450])

因此,数组indices表示其可视化效果在下面的单元格的集合。单元格已标记为黄色。

enter image description here

现在使用该数组作为输入,我想开发一种确定所有相邻单元格集合的算法。在这里,很明显,有两个这样的连续单元格集合。这将在计算机代码中表示为以下两个数组:-

indices1=[64,65,88,89,90,91,111,112,113,114,115,116,117,135,136,137,138,139,140,141,142,143,158,159,160,161,162,163,164,165,166,167,168,169,182,183,184,185,186,187,188,189,190,191,192,193,194,195];

indices2=[232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,282,283,284,285,286,287,288,289,290,291,292,293,294,295,307,308,309,310,311,314,315,316,317,318,319,320,341,342,343,344,345,367,368,369,393,394];

因此,考虑到输入indices,我需要一种可以快速输出indices1indices2的算法。我的实际要求是我必须为所有连续的单元格集合确定多边形。但是一旦有了数组indices1indices2,我就可以使用this来确定多边形。

为了完整起见,我提供以下代码,该代码可用于确定相邻单元格集合的多边形(显示为白色虚线):

clear;
close all;
A=ones(25,25);
indices=[64,65,88,89,90,91,111,112,113,114,115,116,117,135,136,137,138,139,140,141,142,143,158,159,160,161,162,163,164,165,166,167,168,169,182,183,184,185,186,187,188,189,190,191,192,193,194,195,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,282,283,284,285,286,287,288,289,290,291,292,293,294,295,307,308,309,310,311,314,315,316,317,318,319,320,341,342,343,344,345,367,368,369,393,394];
A(indices)=2;
figure
hold on
axis equal
axis ij
xx=10:20:500;
yy=10:20:500;
imagesc(xx,yy,A);
colormap([1.0000         0    0.7931;
    1.0000    0.8276         0]);
rt=[0,500];
gcs=0:20:500;
gds=ones(size(rt,2),size(gcs,2));
gds = bsxfun(@times,gds,gcs);
plot(rt,gds,'Color','k','LineStyle','-');
plot(gds,rt,'Color','k','LineStyle','-');
axis([0 350 100 450])
A=zeros(25);
A(indices)=1;
mask = A==1; x = 1:size(A,1); y = 1:size(A,2);
% Create raw triangulation data:
[cx, cy] = meshgrid(x, y);
xTri = bsxfun(@plus, [0; 1; 1; 0], cx(mask).');
yTri = bsxfun(@plus, [0; 0; 1; 1], cy(mask).');
V = [xTri(:) yTri(:)];
F = reshape(bsxfun(@plus, [1; 2; 3; 1; 3; 4], 0:4:(4*nnz(mask)-4)), 3, []).';
% Trim triangulation data:
[V, ~, Vindex] = unique(V, 'rows');
V = V-0.5;
F = Vindex(F);
% Create triangulation and find free edge coordinates:
TR = triangulation(F, V);
freeEdges = freeBoundary(TR).';
xOutline = V(freeEdges(1, [1:end 1]), 1);  % Ordered edge x coordinates
yOutline = V(freeEdges(1, [1:end 1]), 2);  % Ordered edge y coordinates
step_size=20;
xOutline=xOutline*step_size;
xOutline=xOutline-step_size/2;
yOutline=yOutline*step_size;
yOutline=yOutline-step_size/2;
periP=[xOutline,yOutline];
mat = [true; diff(periP(:,1), 2)~=0; true];
periP=periP(mat,:);
line(periP(:,1), periP(:,2),'Color','w','LineWidth',3,'LineStyle',':');

因此,您还可以提供一种算法,将输入indices作为输入,然后输出从每个连续单元格集合计算出的所有多边形。那将是更可取的。但是以前的算法也可以满足我的目的。运行时间是唯一标准。

0 个答案:

没有答案