一:ITK功能
ITK 与 OpenCV 主打功能相似,都是面向于图像处理,但是两者在领域应用方面有一定的差别;ITK主要用于医学图像的分割与配准(有c++与python版本)。OPENCV是计算机视觉的基础(有c++与python版本),可以说做二维图像算法肯定都会用到OPENCV。机器学习,深度学习的前处理工作很多也都是由opencv完成。
二:编译
环境:
Windows10
VS2019
官网下载ITK软件包:
创建安装目录:
并在ITK5.2.0里面创建build和bin文件夹
使用Cmake开始编译:
source code:将目录改成之前下载的itk解压缩文件。
binaries:目录为之前建的build文件夹。
点击configure运行。
然后选择自己相应的配置:
上面结束后,将会弹出一堆红,然后勾选advanced。
BUILD_SHARED_LIBS 默认关闭,意味着是库是静态编译的,只生成lib,若选中,则动态编译,将生成 dll 文件(这里是选中)
找到 CMAKE_INSTALL_PREFIX 选项,这个是表示 ITK 的安装路径,(此处改成了我们之前建的bin文件夹)。然后再次点击configure运行。
直到运行到没有出现红色,如果还有红色就多点击运行几次configure。
然后生成,点击运行generate。
最终会显示generating done(证明生成成功)。
三:安装
以管理员身份打开VS2019,然后打开ITK.sln
在资源管理器找到ALL_BUILD,右键生成
如果按照流程,一般不会报什么错误。
接着找到INSTALL右键生成,开始安装。
四:环境配置
首先在系统的环境变量path中加入之前创建的bin文件夹下的bin文件,然后重启电脑。
接着用vs2019创建一个新项目,在VC++目录---包含目录中添加bin\include\ITK-5.2
在VC++目录---库目录中添加bin\lib
在连接器---输入---附加依赖项中添加许多的.lib文件(就是bin\lib文件夹下的所有.lib结尾的文件名)。
快速获取.lib文件名,在bin\lib文件夹下新建一个txt文档,然后在里面输入
DIR *.lib* /B >LIST.TXT 再将后缀名改为.bat运行文件。双击运行,就会产生LIST.TXT文件,里面就是所有的.lib文件名。
将LIST.TXT文件中的所有.lib添加到附加依赖项。
上述环境就配置完成。
五:读取DICOM序列,并且快速获得数值。
#include<iostream>
#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<PixelType, dims>;
using ReaderType = itk::ImageSeriesReader<ImageType>;
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;
}