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

3D二值numpy数组非暴力最大内接立方体求解及分辨率判断问询

3D二值数组最大内接立方体求解及最低分辨率判断方案

高效最大内接立方体求解算法

针对0/1构成的3D numpy数组,可使用3D动态规划(DP)算法替代暴力枚举求解最大内接全1立方体,时间复杂度仅为O(X×Y×Z),其中X、Y、Z为数组三个维度的长度,远优于暴力方案的高阶复杂度,适配大尺寸3D数组的计算需求。

算法核心逻辑

定义三维DP数组dp[i][j][k],表示以坐标(i,j,k)为右下角顶点的最大全1立方体的边长,递推规则如下:

  • 若当前坐标原始值为0:dp[i][j][k] = 0,无法构成全1立方体
  • 若当前坐标原始值为1:dp[i][j][k]等于相邻7个方向DP值的最小值加1,对应三个轴向、三个面、对角线方向的立方体约束
  • 边界位置(三个坐标任意一个为0)的DP值直接等于原始数组的对应值
    遍历过程中记录全局最大DP值,即为所求最大内接立方体的边长。

参考Python实现

import numpy as np

def get_max_cube_edge(bin_3d_arr: np.ndarray) -> int:
    x_dim, y_dim, z_dim = bin_3d_arr.shape
    dp = np.zeros_like(bin_3d_arr, dtype=np.int32)
    # 初始化边界
    dp[0, :, :] = bin_3d_arr[0, :, :]
    dp[:, 0, :] = bin_3d_arr[:, 0, :]
    dp[:, :, 0] = bin_3d_arr[:, :, 0]
    max_edge = dp.max()
    # 递推计算
    for i in range(1, x_dim):
        for j in range(1, y_dim):
            for k in range(1, z_dim):
                if bin_3d_arr[i, j, k] == 1:
                    dp[i, j, k] = min(
                        dp[i-1, j, k], dp[i, j-1, k], dp[i, j, k-1],
                        dp[i-1, j-1, k], dp[i-1, j, k-1], dp[i, j-1, k-1],
                        dp[i-1, j-1, k-1]
                    ) + 1
                    max_edge = max(max_edge, dp[i, j, k])
                else:
                    dp[i, j, k] = 0
    return max_edge

最低识别分辨率的快捷技术路径

如果核心需求仅为判定可识别形状的最低分辨率,不需要输出最大立方体的具体参数,可直接使用多尺度下采样校验法,计算效率更高:

  • 下采样规则:采用最小值滤波对原始数组做整数倍下采样,滤波窗口内存在0则下采样后对应位置设为0,否则为1,保证下采样后的1区域完全属于原始形状的有效区域
  • 校验逻辑:从高到低依次降低分辨率,每次下采样后校验形状的预设识别条件(如连通性、特征点完整性、体积占比等),直到不满足判定要求为止,上一个符合要求的分辨率即为最低可识别分辨率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 18:27:04