ITK安装与读取DICOM序列

一:ITK功能

ITK 与 OpenCV 主打功能相似,都是面向于图像处理,但是两者在领域应用方面有一定的差别;ITK主要用于医学图像的分割与配准(有c++与python版本)。OPENCV是计算机视觉的基础(有c++与python版本),可以说做二维图像算法肯定都会用到OPENCV。机器学习,深度学习的前处理工作很多也都是由opencv完成。

二:编译

环境:

Windows10

VS2019

官网下载ITK软件包:

ITK安装与读取DICOM序列_第1张图片

创建安装目录:

ITK安装与读取DICOM序列_第2张图片

并在ITK5.2.0里面创建build和bin文件夹

ITK安装与读取DICOM序列_第3张图片

使用Cmake开始编译:

source code:将目录改成之前下载的itk解压缩文件。

binaries:目录为之前建的build文件夹。

点击configure运行。

ITK安装与读取DICOM序列_第4张图片

然后选择自己相应的配置:

ITK安装与读取DICOM序列_第5张图片

上面结束后,将会弹出一堆红,然后勾选advanced。

BUILD_SHARED_LIBS 默认关闭,意味着是库是静态编译的,只生成lib,若选中,则动态编译,将生成 dll 文件(这里是选中)

ITK安装与读取DICOM序列_第6张图片

找到 CMAKE_INSTALL_PREFIX 选项,这个是表示 ITK 的安装路径,(此处改成了我们之前建的bin文件夹)。然后再次点击configure运行。

ITK安装与读取DICOM序列_第7张图片

直到运行到没有出现红色,如果还有红色就多点击运行几次configure。

然后生成,点击运行generate。

ITK安装与读取DICOM序列_第8张图片

最终会显示generating done(证明生成成功)。

ITK安装与读取DICOM序列_第9张图片

三:安装

以管理员身份打开VS2019,然后打开ITK.sln

ITK安装与读取DICOM序列_第10张图片

在资源管理器找到ALL_BUILD,右键生成

ITK安装与读取DICOM序列_第11张图片

ITK安装与读取DICOM序列_第12张图片

如果按照流程,一般不会报什么错误。

ITK安装与读取DICOM序列_第13张图片

接着找到INSTALL右键生成,开始安装。

ITK安装与读取DICOM序列_第14张图片

四:环境配置

首先在系统的环境变量path中加入之前创建的bin文件夹下的bin文件,然后重启电脑。

ITK安装与读取DICOM序列_第15张图片

接着用vs2019创建一个新项目,在VC++目录---包含目录中添加bin\include\ITK-5.2

7622a2d8b2e6789ab857346a0c9f250a.png

在VC++目录---库目录中添加bin\lib

5299547872871a038bfad39b1768baa4.png

在连接器---输入---附加依赖项中添加许多的.lib文件(就是bin\lib文件夹下的所有.lib结尾的文件名)。

快速获取.lib文件名,在bin\lib文件夹下新建一个txt文档,然后在里面输入

DIR *.lib*  /B >LIST.TXT      再将后缀名改为.bat运行文件。双击运行,就会产生LIST.TXT文件,里面就是所有的.lib文件名。

ITK安装与读取DICOM序列_第16张图片

ITK安装与读取DICOM序列_第17张图片

将LIST.TXT文件中的所有.lib添加到附加依赖项。

ITK安装与读取DICOM序列_第18张图片

上述环境就配置完成。

五:读取DICOM序列,并且快速获得数值。

#include
#include "itkGDCMImageIO.h"
#include "itkImageSeriesReader.h"//用于读取图像序列
#include "itkGDCMSeriesFileNames.h"//用于读取序列文件名


using namespace std;
int main()
{


  string file = "./GTI5BZZQ";//dicom文件夹


  //初始化待读取的dicom序列的各种参数
  using PixelType = signed short;//像素数据类型
  constexpr unsigned int dims = 3;//3维
  using ImageType = itk::Image;
  using ReaderType = itk::ImageSeriesReader;
  using ImageIOType = itk::GDCMImageIO;
  using NamesGeneratorType = itk::GDCMSeriesFileNames;


  //设置IO,并获取文件名
  ImageIOType::Pointer gdcmIO = ImageIOType::New();
  NamesGeneratorType::Pointer namesGenerator = NamesGeneratorType::New();
  namesGenerator->SetInputDirectory(file);
  const ReaderType::FileNamesContainer& filenames = namesGenerator->GetInputFileNames();


  //输出文件名
  for (int i = 0; i < filenames.size(); i++)
  {
    cout << filenames[i] << endl;
  }


  //读取dcm序列
  ReaderType::Pointer reader = ReaderType::New();
  reader->SetImageIO(gdcmIO);
  reader->SetFileNames(filenames);
  reader->Update();


  //通过直接读取内存的方式获取像素值(高效率
  short* ptr = reader->GetOutput()->GetBufferPointer();//将获得首地址的指针
  //只需偏移就可以获得任何位置像素
  cout << ptr[0] << endl;


  gdcmIO->Delete();
  namesGenerator->Delete();
  reader->Delete();
  return 0;
}

你可能感兴趣的:(c++,python,java,linux,opencv)