matlab - 如何从连续的单元格 block 的外部单元格创建多边形

标签 matlab geometry computational-geometry

我在 Matlab 中绘制了一 block 连续的单元格。 enter image description here

必须确定红色补丁的外部单元格,然后连接这些单元格中心的多边形会给我一个多边形。我如何计算连续补丁的外部单元格?

我有一个整数数组,其元素表示红色补丁中的单元格,例如,

a=[1;64;23;456;345];

每一个元素,比如64对应图片中的一个cell,就是属于红色patch的cell。

解决该问题的动机是处理边数最少的多边形,而不是处理这么多单元。它减慢了计算速度。凸包不够好。我根本不希望生成的多边形与棕色区域重叠。

我的建议是下图中左侧的情况,但看起来很难看。因此,更好的方法是跳过仅与外部棕色区域共享一个点的单元格。我希望我的外部细胞只是那些与外部棕色区域共享不止一个点的细胞。

但我们要避免在生成的多边形中出现大量边!

enter image description here

最佳答案

我首先处理了您问题中的示例图像以创建一个逻辑掩码(您已经有一个如何执行此操作的示例 here )。

一旦你有了这个掩码,就可以使用 bwtraceboundary 中的 Image Processing Toolbox 函数生成你想要的多边形。这将为您提供一组像素索引,这些索引围绕您的蒙版区域的周边排列:

[r, c] = find(mask, 1);
coords = bwtraceboundary(mask, [r c], 'N');

我们可以这样想象它:

imagesc(mask);
colormap([0.9 0.9 0.9; 0.6 0.6 0.6]);
axis equal
set(gca, 'XLim', [0.5 0.5+size(mask, 2)], 'YLim', [0.5 0.5+size(mask, 1)]);
hold on;
plot(coords(:, 2), coords(:, 1), 'r', 'LineWidth', 2);
plot(coords(1, 2), coords(1, 1), 'go', 'LineWidth', 2);

enter image description here

红线的坐标从绿色圆圈开始并围绕 mask 区域的周边像素顺时针移动。

如果您希望生成沿着区域的周边像素边缘而不是周边像素中心的边界轮廓,您可以使用 my answer 中的解决方案到 related question 。这将产生以下结果:

enter image description here

关于matlab - 如何从连续的单元格 block 的外部单元格创建多边形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41988945/

相关文章:

matlab - 在 Matlab 中返回数组的大小

matlab - 如何使用 Mikolajczyk 的特征检测器/描述符评估框架?

android - 是否可以进行循环 Activity ?

css - Firefox 17 和基于 CSS 边框的三 Angular 形无法正确呈现

c++ - 求圆内坐标的角度

matlab - 如何在 MATLAB 中以彩色打印字符串?

Matlab 将数字元胞数组写入文件

html - SVG 圆环图未显示在电子邮件中

c++ - 如何在 C++ 中分割边缘

javascript - SVG 路径上的 bool 运算