码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • SimpleITK使用——3. 常见操作


    文章目录

    • 1. 腐蚀/膨胀
      • 1.1 python实现
      • 1.2. C++实现
        • 1.2.1 膨胀(Dilate)
        • 1.2.2 腐蚀(Erode)
    • 2. SimpleITK进行padding操作
    • 3. SimpleITK提取某个切片
    • 4. SimpleITK的GetSize和GetArrayFromImage后的xyz对应
    • 5. SimpleITK阈值去骨

    1. 腐蚀/膨胀

    1.1 python实现

    import SimpleITK as sitk
    
    demo_mask_path = "./seg.nii.gz"
    demo_mask_image = sitk.ReadImage(demo_mask_path)
    dilate_img=sitk.GrayscaleDilate(demo_mask_image , kernelRadius=[3,3,3])
    sitk.WriteImage(dilate_img, "./dilatenii.gz")
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    效果类似下面这样:
    在这里插入图片描述


    参考:

    • Welcome to the SimpleITK Image Filtering Tutorial
    • 根据上一参考链接找到:GrayscaleErodeImageFilter,进而去SimpleITK的在线文档进行搜索
    • 进而找到:itk::simple::GrayscaleErodeImageFilter Class Reference
      • 其中包括:GrayscaleErode()这个接口。
    • 如果不小心忘了腐蚀和膨胀的意义,可以看看这个文章:opencv学习笔记(八):图像形态学操作
      • 腐蚀是暗部变多,亮部变少,每次filter取最小值来覆盖(0-255,0是黑色)
      • 膨胀是暗部变少,亮部变少,每次filter取最大值来覆盖
    • SimpleITK等解析医学图像
    • ITK07 掩膜处理
    • ITK做腐蚀操作,这个使用了itkGrayscaleErodeImageFilter这个类

    1.2. C++实现

    如果想搜索ITK的某些类,可以直接去SimpleITK的文档里去搜索,这里会显示那些ImageFilter的对应ITK中的说明文档。

    例如:去文档中搜索erosion,可以得到以下结果,还是看一下哪个是自己需要的功能比较好
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    还有几个,这里就不放截图了

    1.2.1 膨胀(Dilate)

    膨胀对应的ImageFilter是:

    • itk::BinaryDilateImageFilter< TInputImage, TOutputImage, TKernel > Class Template Reference
    • 膨胀的C++示例位于:SphinxExamples/src/Filtering/BinaryMathematicalMorphology/DilateABinaryImage/Code.cxx
    • 具体如下:
    #include "itkImage.h"
    #include "itkImageFileReader.h"
    #include "itkImageFileWriter.h"
    #include "itkFlatStructuringElement.h"
    #include "itkBinaryDilateImageFilter.h"
     
    int main(int argc, char * argv[])
    {
      if (argc < 4)
      {
        std::cerr << "Usage: " << std::endl;
        std::cerr << argv[0] << " <inputImage> <outputImage> <radius>";
        std::cerr << std::endl;
        return EXIT_FAILURE;
      }
      const char *       inputImage = argv[1];
      const char *       outputImage = argv[2];
      const unsigned int radiusValue = std::stoi(argv[3]);
     
      using PixelType = unsigned char;
      constexpr unsigned int Dimension = 2;
      using ImageType = itk::Image<PixelType, Dimension>;
     
      const auto input = itk::ReadImage<ImageType>(inputImage);
     
      using StructuringElementType = itk::FlatStructuringElement<Dimension>;
      StructuringElementType::RadiusType radius;
      radius.Fill(radiusValue);
      StructuringElementType structuringElement = StructuringElementType::Ball(radius);
     // 主要是这句
      using BinaryDilateImageFilterType = itk::BinaryDilateImageFilter<ImageType, ImageType, StructuringElementType>;
     
      BinaryDilateImageFilterType::Pointer dilateFilter = BinaryDilateImageFilterType::New();
      dilateFilter->SetInput(input);
      dilateFilter->SetKernel(structuringElement);
      dilateFilter->SetForegroundValue(255); // Value to dilate
     
      try
      {
        itk::WriteImage(dilateFilter->GetOutput(), outputImage);
      }
      catch (itk::ExceptionObject & error)
      {
        std::cerr << "Error: " << error << std::endl;
        return EXIT_FAILURE;
      }
     
      return EXIT_SUCCESS;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48

    1.2.2 腐蚀(Erode)

    腐蚀对应的ImageFilter是:

    • [itk::BinaryErodeImageFilter< TInputImage, TOutputImage, TKernel > Class Template Reference](itk::BinaryErodeImageFilter< TInputImage, TOutputImage, TKernel > Class Template Reference)
    • 腐蚀的C++示例位于:SphinxExamples/src/Filtering/MathematicalMorphology/ErodeBinaryImageUsingFlatStruct/Code.cxx,以及SphinxExamples/src/Filtering/BinaryMathematicalMorphology/ErodeABinaryImage/Code.cxx

    2. SimpleITK进行padding操作

    我的使用场景:

    • 对mask图像做了crop,删除了mask中一些不需要的标记点
    • crop之后mask图像大小发生了变化,因此需要变回到crop之前的size
    import SimpleITK as sitk
    
    demo_mask_path = "./seg.nii.gz"
    demo_mask_image = sitk.ReadImage(demo_mask_path)
    
    cropped_image = sitk.Crop(demo_mask_image ,lowerBoundaryCropSize=[0,0,0],upperBoundaryCropSize=[crop_size,0,0])
    
    half_image_y_pad =sitk.ConstantPad(cropped_image ,padLowerBound=[0,0,0],padUpperBound=[crop_size,0,0],constant=0)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    ConstantPad和Crop很像,只是一个是裁剪,一个是补充。


    参考:

    • itk::simple::ConstantPadImageFilter Class Reference

    3. SimpleITK提取某个切片

    根据参考1,可以知道,

    • 纯使用SimpleITK的Image去进行切片,代码比较复杂
    • 建议还是直接转为numpy数组进行
    import SimpleITK as sitk
    
    demo_mask_path = "./seg.nii.gz"
    demo_mask_image = sitk.ReadImage(demo_mask_path)
    demo_array = sitk.GetArrayFromImage(demo_mask_image)
    # 进行一些数组切片操作
    ....
    demo_image =sitk.GetImageFromArray(demo_array)
    demo_image.CopyInformation(demo_mask_image )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    参考:

    1. SimpleITK 文档:Advanced Image Reading
    2. SimpleITK reading a slice of an image
    3. Python/ExtractSlice.py
    4. itk::simple::ExtractImageFilter Class Reference

    4. SimpleITK的GetSize和GetArrayFromImage后的xyz对应

    参考:【SimpleITK教程】GetSize()方法和GetArrayFromImage()方法
    在这里插入图片描述
    在这里插入图片描述
    即

    padding_path="XXXX.nii.gz"
    padding_image=sitk.ReadImage(padding_path)
    print(padding_image.GetSize())
    padding_array = sitk.GetArrayFromImage(padding_image)
    print(padding_array.shape)
    padding_array[78,131,80]
    > (240, 240, 155)  (x,y,z)
      (155, 240, 240)  (z,y,x)
    2
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    5. SimpleITK阈值去骨

    我使用的数据比较简单,这里也就是个简单的预处理。

    import SimpleITK as sitk
    image_path = "./im.nii.gz"
    image = sitk.ReadImage(image_path)
    skull_mask =sitk.BinaryThreshold(image, lowerThreshold=125, upperThreshold=2000, insideValue=1, outsideValue=0)
    # 在125~2000范围内的,赋值为1,范围外的,赋值为0。得到的mask就是125~2000这个强度值的内容,即骨骼。
    
    • 1
    • 2
    • 3
    • 4
    • 5

    类似下图:

    • 上面是将脑部CT窗宽窗位调整至level:700,window:500得到的图像
    • 下面是使用阈值去骨后的结果,看起来还行
      在这里插入图片描述

    参考:

    • itk::simple::ThresholdImageFilter Class Reference
    • Introduction to ITK Segmentation in SimpleITK Notebooks
    • ITK 基础(二) — 图像分割 General Threshold
  • 相关阅读:
    01--MySQL数据库概述
    Simulink代码生成: 可变子系统及其代码
    Spring IOC - Bean的生命周期之实例化
    除静电离子风嘴的工作原理及应用
    scanf、cin及其优化、快读性能测试
    编译原理网课笔记——第一章
    Hive-命令行CDH访问开启kerberos的hive
    需求是怎么一步一步变态的
    手把手教你实现红黑树
    cross-tissue 成纤维细胞比例.r
  • 原文地址:https://blog.csdn.net/Castlehe/article/details/125477886
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号