You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在MATLAB中将凸形2D二值矩阵划分为近似等大小的非重叠块?

可行的凸形区域均匀划分方案

嘿,这个需求很实际!既然你手上是凸形的1元素矩阵,想要比mat2cell更均匀的划分方式,我整理了几个实用的思路,你可以根据自己的偏好选择:

1. 递归质心分割法(贴合凸形特性)

因为你的目标区域是凸形,质心分割会非常好用:

  • 首先提取所有1元素的坐标,用regionprops计算整个凸形的质心;
  • 选择垂直或水平方向(看哪个方向的跨度更大,或者能让分割后的元素数量更均衡)画一条穿过质心的分割线,把区域分成两部分;
  • 对分割后的每个子区域重复这个过程,直到得到你需要的块数。
  • 优势:分割后的块依然是凸形,且每个块的1元素数量会非常接近,完全利用了凸形的几何特性。
  • 实现小贴士:分割后可以用bwconncomp确认子区域的连通性(凸形分割后理论上不会出现不连通的情况,但可以做个校验)。

2. K-means空间聚类法(灵活且均匀)

把1元素的空间坐标作为聚类特征,用K-means直接划分:

  • 先提取所有1元素的行/列索引:[r,c] = find(matrix == 1);
  • 将[r,c]作为输入传入kmeans函数,指定聚类数K;
  • 根据每个点的簇标签,把原矩阵中的1元素分配到对应的块中。
  • 优势:不需要手动调整分割线,算法自动帮你把空间上邻近的1元素聚成数量均匀的块,形状会自然贴合凸形轮廓。
  • 注意:如果担心簇不连通,可以在聚类后检查每个簇的连通性,微调个别点的归属(凸形下这种情况极少发生)。

3. 自适应网格调整法(改进mat2cell的规整性)

如果你还是偏好矩形块,但想要更均匀的元素分布,可以改进mat2cell的思路:

  • 先按目标块数做初始网格划分(比如要分4块就先分成2x2);
  • 统计每个网格内的1元素数量,计算块间的数量差异;
  • 对相邻的“多元素块”和“少元素块”调整网格边界,逐步缩小数量差,直到达到你能接受的均匀度。
  • 优势:保留了矩形块的规整性,比直接用mat2cell更灵活,适合需要块形状规则的场景。

4. 贪心区域生长法(渐进式均匀分配)

从多个初始点开始,逐步分配1元素:

  • 在凸形的边界上选K个均匀分布的初始点(比如最上、最下、最左、最右四个点,或者按角度均匀采样);
  • 每次把相邻的未分配1元素,分配给当前元素数量最少的块;
  • 重复这个过程,直到所有1元素都被分配完毕。
  • 优势:能严格保证每个块的元素数量尽可能接近,块的形状也会贴合凸形的自然轮廓。

额外建议

不管用哪种方法,都可以用sum(sum(block == 1))统计每个块的1元素数量,通过计算方差或者最大最小差值来评估划分的均匀性,以此调整参数(比如K-means的初始点、分割线的方向等)。

内容的提问来源于stack exchange,提问作者Daniele Marinazzo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 08:19:14