栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

SimpleITK使用——3. 常见操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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")

效果类似下面这样:


参考:

  • 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] << "   ";
    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;
 
  const auto input = itk::ReadImage(inputImage);
 
  using StructuringElementType = itk::FlatStructuringElement;
  StructuringElementType::RadiusType radius;
  radius.Fill(radiusValue);
  StructuringElementType structuringElement = StructuringElementType::Ball(radius);
 // 主要是这句
  using BinaryDilateImageFilterType = itk::BinaryDilateImageFilter;
 
  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.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)

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. 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
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这个强度值的内容,即骨骼。

类似下图:

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

参考:

  • itk::simple::ThresholdImageFilter Class Reference
  • Introduction to ITK Segmentation in SimpleITK Notebooks
  • ITK 基础(二) — 图像分割 General Threshold
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1002168.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号