• SimpleITK使用——4. 奇怪的问题


    1. 数据dtype类型问题

    1.1 确定原因

    现象描述

    • windows下使用numpy处理Nifti图像并保存,
      • 得到的图像是49KB
      • ITK-Snap可以打开
    • linux下使用相同代码用numpy处理Nifti图像并保存
      • 得到图像时85KB
      • ITK-Snap打开报错:itk::ERROR: NiftiImageIO(000001CB27E1CD80): Unknown component type: 0
        在这里插入图片描述
      • 但是3D Slicer可以打开

    寻找原因

    • 由于代码相同,测试过保存的numpy数据也相同,但是最终文件大小不同。
    • 因此考虑数据类型,dtype的问题

    实验

    由于代码中有一句是:

    skull_striper_array = np.where(pred_label_array - skull_mask_array == 1, 1, 0)
    
    • 1

    因此逐个查看数据类型,发现

    pred_label_array.dtype
    > dtype('uint8')
    
    skull_mask_array.dtype
    > dtype('uint8')
    
    skull_striper_array.dtype
    > dtype('int64')
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    因此考虑是由于在numpy中引入了常量,导致数据类型发生变化。

    skull_mask_path = "./skull_striper_mask.nii.gz"
    skull_mask_image = sitk.ReadImage(skull_mask_path)
    print(skull_mask_image.GetPixelIDTypeAsString())
    > 64-bit signed integer
    
    • 1
    • 2
    • 3
    • 4

    查看linux下图像的数据类型,确实是int64,转为int32之后,itk-snap就可以打开处理后的图像了。


    考虑不同环境下numpy对常量默认的数据类型

    • linux环境下:numpy-1.19.2、simpleitk-2.1.1.2
      test =np.array([1])
      test.dtype
      > dtype('int64')
      
      • 1
      • 2
      • 3
    • windows环境:numpy-1.19.2、simpleitk-2.1.1.2
      	test =np.array([1])
      	test.dtype
      	> dtype('int32')
      
      • 1
      • 2
      • 3

    1.2 numpy中默认dtype类型

    numpy文档-Data types中,有以下描述:

    NumPy提供numpy.iinfonumpy.finfo来确认Numpy中整数和浮点数的最值。

    np.iinfo(int) # Bounds of the default integer on this system.
    iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
    np.iinfo(np.int32) # Bounds of a 32-bit integer
    iinfo(min=-2147483648, max=2147483647, dtype=int32)
    np.iinfo(np.int64) # Bounds of a 64-bit integer
    iinfo(min=-9223372036854775808, max=9223372036854775807, dtype=int64)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    因此在自己的机器上进行测试:

    • windows上:
      在这里插入图片描述
    • linux上:
      在这里插入图片描述
    • 因此可以知道,当我使用下面的代码,引入整数后
      skull_striper_array = np.where(pred_label_array - skull_mask_array == 1, 1, 0)
      
      • 1
    • windows默认这个整数(int)是int32位,而linux默认这个整数(int)是int64位

    StackOverflow上也有个类似的问题阐述,详见Specifying default dtype for np.array(1.)

    1.3 itk-snap打开int64格式的问题

    在上面阐述了现象:

    • 64位的图像使用ITK-Snap打开报错:itk::ERROR: NiftiImageIO(000001CB27E1CD80): Unknown component type: 0
      在这里插入图片描述
    • 但是3D Slicer可以打开

    因此考虑是否ITK-Snap不支持int64位的图像。暂时没有找到有效的相关内容。
    TBD

  • 相关阅读:
    无线联网门锁为美好生活上好锁
    Abnova 荧光染料 510-M 链霉亲和素方案
    4、Linux:如何在zip压缩文件中搜索指定内容
    SAM + YOLOv8 图像分割及对象检测
    聊聊日志硬扫描,阿里 Log Scan 的设计与实践
    设置差分对的两种方法
    第七章:Springmvc中applicationContext.xml配置文件应用上下文详解
    数据库-范式
    智能车菜单编写(1)
    Unity 时间格式 12小时制与24小时制
  • 原文地址:https://blog.csdn.net/Castlehe/article/details/125549223