swi.nii.gz医学影像3D numpy数组沿z轴取非零np.min输出全黑问题求解
问题原因
你当前的写法存在多处逻辑错误:
np.min(image_data>0, axis=2)是对布尔数组(仅含0/1)求最小值,返回结果只有0或1,完全不是原影像的灰度最小值,自然无法得到正确输出- 注释中的
np.where(image_data>0,image_data,1)写法会强制把0值替换为1,若存在小于1的有效灰度值、或某(x,y)坐标对应所有z层全为0时,会得到错误结果 np.ndarray.nonzero返回的是非零值的坐标索引,不是灰度值,完全不符合计算需求
解决方案
使用np.nanmin计算,自动忽略空值即可实现仅统计非零点的最小值,修改后代码如下:
import nibabel as nib import matplotlib.pyplot as plt import numpy as np import os # 路径前加r避免转义字符报错 image_path = r'd:\img\swi.nii.gz' # 加载影像 image_obj = nib.load(image_path) image_data = image_obj.get_fdata() # 将0值替换为NaN,后续计算最小值时会自动忽略NaN data_with_nan = np.where(image_data > 0, image_data, np.nan) # 沿z轴(axis=2)计算非零值的最小值,最终的NaN(对应全0的位置)替换为0作为背景 z_min = np.nanmin(data_with_nan, axis=2) z_min = np.nan_to_num(z_min, nan=0) plt.title(os.path.basename(image_path)) plt.imshow(z_min, cmap='jet') plt.axis('off') plt.show()
如果你的numpy版本 >= 1.20,也可以直接用np.min的where参数简化写法:
z_min = np.min(image_data, axis=2, where=image_data>0) z_min = np.nan_to_num(z_min, nan=0)
内容的提问来源于stack exchange,提问作者nazi
相关产品推荐
相关产品推荐

