手把手教你Linux下基于ITK开发基础(1)

手把手教你Linux下基于ITK开发基础(1)

*requirement:

requirement version
git 2.17.1
g++ Ubuntu 7.5.0-3 ubuntu1~18.04
ITK 4.13
VTK 9.1.0

1.installation

(1)下载itk、vtk和cmake(git 下载可能会有问题,建议直接采用以下的命令)

#下载
wget https://github.com/InsightSoftwareConsortium/ITK/releases/download/v4.13.3/InsightToolkit-4.13.3.tar.gz
wget https://www.vtk.org/files/release/9.1/VTK-9.1.0.tar.gz
wget https://github.com/Kitware/CMake/releases/download/v3.22.1/cmake-3.22.1-linux-x86_64.sh
#解压
tar -zxvf InsightToolkit-4.13.3.tar.gz
tar -zxvf VTK-9.1.0.tar.gz

(2)安装cmake

bash cmake-3.22.1-linux-x86_64.sh
#配置环境变量
cd the/cmake/path/
echo "export PATH=$PWD/cmake-3.22.1-linux-x86_64/bin:\$PATH">>$HOME/.bashrc

(3)编译ITK

mkdir ITK-build
cd ITK-build
ccmake ../ITK-src

手把手教你Linux下基于ITK开发基础(1)_第1张图片

先按”c“进行配置,配置好后按”g“生成

make -j4
#编译好后,可进行安装
sudo make install

测试ITK(ITK/HelloInsight - KitwarePublic)

mkdir HelloInsight
vim HelloInsight.cxx
vim CMakeLists.txt

HelloInsight.cxx

#include "itkImage.h"
#include 

int main()
{
  typedef itk::Image< unsigned short, 3 > ImageType;

  ImageType::Pointer image = ImageType::New();

  std::cout << "Hello ITK World !" << std::endl;

  return 0;
}

“CMakeLists.txt”

cmake_minimum_required(VERSION 3.10.2)

project(HelloInsight)

# Find ITK.
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})

add_executable(HelloInsight HelloInsight.cxx )

target_link_libraries(HelloInsight ${ITK_LIBRARIES})
mkdir HelloInsight_build
cd HelloInsight_build
cmake ../HelloInsight

cmake可能会报以下的错误

手把手教你Linux下基于ITK开发基础(1)_第2张图片

#配置cmake,添加ITK的路徑
ccmake HelloInsight_build/
#配置好后
make
./HelloInsight

显示以下则测试成功!

(4)编译vtk(可选)

mkdir VTK_build
cd VTK_build/
ccmake ../VTK-9.1.0

按“c”配置cmake,可能会出现沒有安裝openGL的情況,采用以下命令进行安裝(https://www.linuxidc.com/Linux/2017-03/141555.htm)

#安装编译器与基本的函数库
sudo apt-get install build-essential
#安装OpenGL Library
sudo apt-get install libgl1-mesa-dev
# 安装OpenGL Utilities
sudo apt-get install libglu1-mesa-dev
# 安装OpenGL Utility Toolkit
sudo apt-get install freeglut3-dev

测试VTK

vim test.c

“test.c”

#include 
void init(void)
{
    glClearColor(0.0, 0.0, 0.0, 0.0);
    glMatrixMode(GL_PROJECTION);
    glOrtho(-5, 5, -5, 5, 5, 15);
    glMatrixMode(GL_MODELVIEW);
    gluLookAt(0, 0, 10, 0, 0, 0, 0, 1, 0);
    return;
}

void display(void)
{
    glClear(GL_COLOR_BUFFER_BIT);
    glColor3f(1.0, 0, 0);
    glutWireTeapot(3);
    glFlush();
    return;
}

int main(int argc, char *argv[])
{
    glutInit(&argc, argv);
    glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
    glutInitWindowPosition(0, 0);
    glutInitWindowSize(300, 300);
    glutCreateWindow("OpenGL 3D View");
    init();
    glutDisplayFunc(display);
    glutMainLoop();
    return 0;
}

(5)ITK和VTK混合编程

在对ITK进行ccmake配置时,需要将Module_ITKVTKGlue打开,以避免ITK、VTK混合编译的时候的报错。如图所示

手把手教你Linux下基于ITK开发基础(1)_第3张图片

然后重新配置与生成,并且make

2.创建新项目

(1)创建相应的目录

mkdir PreProcessingDir
mkdir PreProcessingDir/src
mkdir PreProcessingDir/bin

(2) 开始写文件

cd PreProcessingDir/src
vim Preprocessing.cxx
#下一步省略上千行代码
.......
#重点为cmake
vim CMakeLists.txt

CMakeLists.txt

cmake_minimum_required(VERSION 3.10.2)
project(Preprocessing)

#find ITK
find_package(ITK REQUIRED)
include(${ITK_USE_FILE})
#find VTK
#find_package(VTK REQUIRED)
#include(${VTK_USE_FILE})

include_directories(${PROJECT_SOURCE_DIR}/ITKExtraLib
)

add_executable(Preprocessing Preprocessing.cxx)

target_link_libraries(Preprocessing ${ITK_LIBRARIES}
        /usr/lib/x86_64-linux-gnu/libjsoncpp.a
)

CMakeLists.txt文件Q&A

Q1:ITKExtraLib这个文件夹里面是干嘛的?

A1:首先看下目录结构

手把手教你Linux下基于ITK开发基础(1)_第4张图片

可以看到文件夹中是itk的拓展模块,是ITK源码里没有的,有关TV滤波器的在MITK中的去噪模块中可以找到,还有两个文件itkStripTsImageFilter.h/hxx是用于脑部提取的。将他们加入的include里进行调用。

Q2:/usr/lib/x86_64-linux-gnu/libjsoncpp.a又是什么

A2:这个是由于在预处理传入的参数中用到了.json文件,而对于json文件的读取jsoncpp是一个很好的工具,文档后面对其安装与使用进行了介绍,代码中调用了jsoncpp的库,因此在链接库中加入了安装jsoncpp后生成的静态库。

(3) 文件写完了开始编译

cd ../bin
ccmake ../src

进入到cmake之后,按c配置,可能会让你配置ITK的路径,按你的安装路径配置即可

手把手教你Linux下基于ITK开发基础(1)_第5张图片

再按c,然后配置成功后按g生成回到shell界面

#进行编译
make
#下一步找Bug....................

3.ITK编程注意事项

1.读取dicom数据时需要注意数据类型要相同,不然容易报以下错误

注意,保存dicom图象时需要使用GDCMIO类。

2.在实例化一个类的智能指针时,同时New一个内存,若忘记会出现段错误

3.在实例化一个模板类时,需要注意的是,在linux中需要在之前添加typename,如下

typename ResampleImageFilterType::Pointer resampler = ResampleImageFilterType::New();

否则会出现下面的报错

4.提取json文件内容,可安装jsoncpp库,安装jsoncpp时需要注意,如果采用apt安装

#apt安装
sudo apt-get install libjsoncpp-dev

调用时采用下列的方式调用,许多教程上没有带jsoncpp,会导致编译出错

#include "jsoncpp/json/json.h"

5.在编译的时候要保证用的是ITK5以下的,不然拓展ITK库TV滤波器会编译不通过,或者说运行会报错,用了最新的MITK里的TV滤波器相关的文件也是一样的,惨痛教训!

4.采用elastix配准

1.安装

#下载
git clone https://github.com/SuperElastix/elastix.git
 #切换版本(以下支持ITK4.13.0)
cd elastix
git checkout 4.9.0
#创建bin目录
mkdir ../bin
cd ../bin
ccmake ../elastix

按c配置,配置itk目录,然后再按c,config done 之后按g生成

make -j4
make install

安装成功

2.使用

可直接采用elastix命令行运行

#运算配准生成变换参数(源码中有多个配准参数文件选择,下面采用parameters_BSpline.txt进行配准)
elastix -f ./SyntheticTemp/FixedCTImage.nii -m ./SyntheticTemp/MovePTImage.nii -out ./regOut -p parameters_BSpline.txt
#TransformParameters.0.txt为上一步生成的参数文件,通过变换得到最终的配准结果
transformix -in regOut/result.0.mhd -out regResult/ -tp regOut/TransformParameters.0.txt

通过打开最后的regResult可得到最后的配准结果

在这里插入图片描述

3.也可通过cmake添加到自己的项目当中(https://github.com/SuperElastix/elastix/releases/download/5.0.1/elastix-5.0.1-manual.pdf)

*注意,若通过动态或静态库在自己的项目中调用elastix需要在编译时关闭 ELASTIX BUILD EXECUTABLE,在编译elastix时不能编译成动态库,需要把BUILD SHARED LIBS 关闭,详情请看链接文档19页和43页

你可能感兴趣的:(linux,Image,processing,linux,医学图像处理,ITK,VTK)