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

如何为NumPy数组创建圆柱掩码并实现反向遮罩效果

3D数组圆柱掩码反向效果实现

问题描述

我尝试创建一个圆柱形状的数组,用于对尺寸为1648×1648×1420的3D NumPy数组进行掩码操作,目标是移除图像的外环区域。目前已完成圆柱构造和逐元素掩码应用,但结果是遮盖了目标图像,请问如何实现与当前效果相反的结果?

原实现代码:

import numpy as np 
import matplotlib.pyplot as plt 
import nrrd 
seg,header = nrrd.read("image.nrrd")


x = np.linspace(-10, 10, 1658)
y = np.linspace(-10, 10, 1658)
z = np.linspace(-10, 10, 1420)
x,y,z = np.meshgrid(x,y,z)
x0 = 3
y0 = 2
z0 = 3
mask = (x-x0)**2 + (y-y0)**2 > (z-z0)**2 

maskimg = plt.imshow(mask[:,:,100],cmap="gray")
plt.show()

z_masked = np.multiply(mask,seg)
zimg_masked = plt.imshow(z_masked[:,:,200])
plt.show()

解决方案

要实现保留圆柱内部、移除外环的反向效果,只需要对掩码的逻辑取反即可,有两种简单方式:

方式1:直接修改掩码条件

将原掩码的大于号(>)替换为小于等于号(<=),这样掩码中True对应的就是圆柱内部区域:

mask = (x-x0)**2 + (y-y0)**2 <= (z-z0)**2 

方式2:对原掩码取反

基于原掩码,使用~运算符或np.logical_not()函数取反,同样能得到圆柱内部为True的掩码:

# 使用~取反
mask = ~((x-x0)**2 + (y-y0)**2 > (z-z0)**2)
# 或者使用np.logical_not
mask = np.logical_not((x-x0)**2 + (y-y0)**2 > (z-z0)**2)

修改后的完整代码

import numpy as np 
import matplotlib.pyplot as plt 
import nrrd 
seg,header = nrrd.read("image.nrrd")


x = np.linspace(-10, 10, 1658)
y = np.linspace(-10, 10, 1658)
z = np.linspace(-10, 10, 1420)
x,y,z = np.meshgrid(x,y,z)
x0 = 3
y0 = 2
z0 = 3
# 保留圆柱内部的掩码
mask = (x-x0)**2 + (y-y0)**2 <= (z-z0)**2 

maskimg = plt.imshow(mask[:,:,100],cmap="gray")
plt.show()

z_masked = np.multiply(mask,seg)
zimg_masked = plt.imshow(z_masked[:,:,200])
plt.show()

关键说明

  • 原掩码(x-x0)**2 + (y-y0)**2 > (z-z0)**2标记的是圆柱外部区域为True,与原图像相乘后,这些区域会被保留,而圆柱内部区域会被置0(即被遮盖),和你的需求正好相反。
  • 取反后的掩码会将圆柱内部区域标记为True,相乘后保留内部内容,外环区域被置0,完美实现移除外环的目标。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 06:50:28