如何为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
相关产品推荐
相关产品推荐

