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

为含横向不连续轮廓的3D NumPy数组分配唯一填充值

问题:为3D二进制轮廓数组中的独立物体分配唯一标签

我有一个以x、y、深度为维度的3D NumPy二进制数组,所有物体都被标记为1,但实际对应不同的独立物体。我已经提取了每个物体的轮廓,目标是为每个轮廓包围的区域分配唯一值。

2D模拟示例(含横向不连续轮廓)

以下是模拟真实数据的2D二进制轮廓数组:

contour_array = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0],
                           [0,0,0,0,0,0,0,0,0,0,0,0,0],
                           [1,1,1,1,1,1,1,1,1,1,1,1,1],
                           [0,0,0,0,0,0,0,0,0,0,0,0,0],
                           [1,1,1,1,1,0,0,0,0,0,0,0,0],
                           [0,0,0,0,0,1,0,0,0,0,0,0,0],
                           [0,0,0,0,1,0,0,0,0,0,0,0,0],
                           [1,1,1,1,0,0,0,0,0,0,0,0,0],
                           [0,0,0,0,0,0,0,0,0,0,0,0,0],
                           [1,1,1,1,1,1,1,1,1,1,1,1,1],
                           [0,0,0,0,0,0,0,0,0,0,0,0,0],
                           [0,0,0,0,0,0,0,0,0,0,0,0,0]])

该数组的matplotlib可视化图:(图中可见多条横向不连续的白色轮廓线条,分布在不同行)

预期输出

处理后的标签数组如下:

mask_array = np.array([[0,0,0,0,0,0,0,0,0,0,0,0,0],
                       [0,0,0,0,0,0,0,0,0,0,0,0,0],
                       [1,1,1,1,1,1,1,1,1,1,1,1,1],
                       [1,1,1,1,1,1,1,1,1,1,1,1,1],
                       [2,2,2,2,2,1,1,1,1,1,1,1,1],
                       [2,2,2,2,2,2,1,1,1,1,1,1,1],
                       [2,2,2,2,2,1,1,1,1,1,1,1,1],
                       [2,2,2,2,1,1,1,1,1,1,1,1,1],
                       [1,1,1,1,1,1,1,1,1,1,1,1,1],
                       [3,3,3,3,3,3,3,3,3,3,3,3,3],
                       [3,3,3,3,3,3,3,3,3,3,3,3,3],
                       [3,3,3,3,3,3,3,3,3,3,3,3,3]])

预期输出的matplotlib可视化图:(图中可见4个被唯一标签填充的独立区域,标签2嵌入在标签1内部,标签1遇到标签3后终止,边界值与下方填充值一致)

从示例中可见,共有4个需要标记的独立物体,标签2嵌入标签1且在x方向横向不连续,标签1遇到标签3时终止。

补充说明

边界值需与下方填充值一致,参考mask数组可视化图。实际提取的2D二进制轮廓数组在x空间并非始终连续。

已尝试的方案

首次尝试

遍历每一列数据,使用.cumsum()生成唯一值,再用push()向下前向填充。代码如下:

# create an empty array for the labels
mask_array = np.zeros_like(contour_array)
# determine shape of data for iteration
xx, yy, d = contour_array.shape
# loop through 3d array
for x in range(xx):
    for y in range(yy):
        # apply cumsum() to assign unique values to each object
        mask_array[x,y,:] = contour_array[x,y,:].cumsum()*contour_array[x,y,:]
        # replace zeros with nulls for for forward fill
        mask_array[x,y,:] = np.where(mask_array[x,y,:] == 0, np.nan, mask_array[x,y,:])
        # apply push to each column to create labels
        mask_array[x,y,:] = push(mask_array[x,y,:])
        # fill remaining nulls with 0
        mask_array[np.isnan(mask_array)] = 0.0

该方法运行较慢,且仅适用于x空间连续的物体/图层;由于数据横向不连续,输出结果零散,无法区分嵌入物体与连续图层。

第二次尝试

结合numpy sliding_window_view()使用移动窗口捕捉横向变化,但未能成功运行,代码效果不佳。

最后尝试

研究使用cv2.fillPoly(),但不确定是否适用。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:05:17