python---VTK---ITK

ITK+VTK+Python的整合及例子程序

原创 2014年07月31日 14:49:05

配置: VS2008(32-bit)

Python2.7.8(32-bit)

Cmake 3.0

ITK4.5.2

VTK 版本要求5.9及其以上

注意: 和Python结合建议使用VS2008,在VS2010中有可能编译不通过,博主经过多次试验发现在VS2010中总是报错。 

一,前期准备

1.1 安装VS2008

1.2 安装Cmake

1.3 安装Python2.7.8

1.4 安装VTK 5.10(方法见之前的一篇博文)

1.5 下载pygccxml并安装:下载好以后使用Python 命令运行pygccxml文件夹中的setup.py文件。

1.6 下载ITK源码

新建一个目录#ITK_SOUCCE#,将itk下载到该目录下并且解压到当前文件夹。例如,如果#ITK_SOUCCE#=D:\ITK_source,那么解压后ITK的源文件放在了这个目录下面:D:\ITK_source\InsightToolkit-4.5.2

1.7 新建两个文件夹

存放cmake产生的ITK项目文件#SOLUTION_PATH#

存放编译成功后的bin,libinclude等文件#BUILD_OUTPUT#

例如,我的设置是#SOLUTION_PATH#=C:\IVTK\ITK32Py_install

#BUILD_OUTPUT# =C:\IVTK\ITK32Py

二,Cmake中的设置

where is the source code 选择#ITK_SOUCCE#/InsightToolkit-4.5.2

where to build the binaries 选择#SOLUTION_PATH#

编译器选择VS 2008

等待Configure完成。

cmake的选项中将BUILDTESTING和BUILD EXAMPLES不选。

勾选BUILD_SHARED_LIBS.

勾选Advanced之后更改CMAKE_INSTALL_PREFIX(表示编译ITK后生成的lib 及include等的安装路径)设置为#BUILD_OUTPUT#

勾选ITKV3_COMPATIBILITY

勾选 ITK_WRAP_PYTHON

勾选 Module_ITKVtkGlue

检查VTK_DIR是否正确,例如C:/IVTK/VTK510_32Py/lib/vtk-5.10

再次点击 Configure, 直至所有条目都变成灰色,表示配置成功, 点击Generate确认。

三,使用VS2008编译

3.1 设置环境变量

gccxml_pah=#SOLUTION_PATH#\Wrapping\Generators\GccXML\gccxml\bin

%gccxml_path%添加到path环境变量的末尾

3.2   编译

VS2008打开位于#SOLUTION_PATH#下面的ITK项目文件,选择Release进行编译。

3.3 安装

编译成功后再次编译INSTALL工程,相关的include, lib和bin文件就被提取到了#BUILD_OUTPUT#目录下。

四,后续

4.1 #BUILD_OUTPUT#\bin中的dll文件复制到:#BUILD_OUTPUT#\ lib\ITK-4.5\Python

4.2#BUILD_OUTPUT#\lib\ITK-4.5\Python路径添加到EclipsePYTHONPATH

五,例子程序

5.1 用ITK打开并保存一副图像

[python] view plain copy
  1. import itk  
  2. import sys  
  3. import vtk  
  4.   
  5. inputfilename="D:/DATA/small/0200.dcm"  
  6. outputfilename="D:/DATA/0200.png"  
  7. #  
  8. # Reads a 2D image in with signed short (16bits/pixel) pixel type  
  9. # and save it as unsigned char (8bits/pixel) pixel type  
  10. #  
  11. InputImageType  = itk.Image.SS2  
  12. OutputImageType = itk.Image.UC2  
  13.   
  14. reader = itk.ImageFileReader[InputImageType].New()  
  15. writer = itk.ImageFileWriter[OutputImageType].New()  
  16.   
  17.   
  18. filter = itk.RescaleIntensityImageFilter[InputImageType, OutputImageType].New()  
  19. filter.SetOutputMinimum( 0 )  
  20. filter.SetOutputMaximum(255)  
  21.   
  22. filter.SetInput( reader.GetOutput() )  
  23. writer.SetInput( filter.GetOutput() )  
  24.   
  25. reader.SetFileName(inputfilename )  
  26. writer.SetFileName(outputfilename )  
  27.   
  28. writer.Update()  

5.2 用ITK打开图像,用VTK显示

在上述代码后面添加:

[python] view plain copy
  1. ivfilter=itk.ImageToVTKImageFilter[OutputImageType].New()  
  2. ivfilter.SetInput(filter.GetOutput())  
  3. viewer=vtk.vtkImageViewer()  
  4. iren=vtk.vtkRenderWindowInteractor()  
  5. viewer.SetupInteractor(iren)  
  6. viewer.SetInput(ivfilter.GetOutput())  
  7. viewer.Render()  
  8. viewer.SetColorWindow(255)  
  9. viewer.SetColorLevel(128)  
  10. iren.Start()  

5.3 ITK 配准的例子

[python] view plain copy
  1. from InsightToolkit import *  
  2. from sys import argv  
  3.   
  4. fixedImageName="D:/DATA/Brain.png"  
  5. movingImageName="D:/DATA/Brainshifted13x17y.png"  
  6. outputImageName="D:/DATA/Brainresult2.png"  
  7.   
  8. fixedImageReader  = itkImageFileReaderIF2_New()  
  9. movingImageReader = itkImageFileReaderIF2_New()  
  10.   
  11. fixedImageReader.SetFileName(  fixedImageName )  
  12. movingImageReader.SetFileName( movingImageName )  
  13.   
  14. fixedImageReader.Update()  
  15. movingImageReader.Update()  
  16.   
  17. fixedImage  = fixedImageReader.GetOutput()  
  18. movingImage = movingImageReader.GetOutput()  
  19.   
  20. #  
  21. #  Instantiate the classes for the registration framework  
  22. #  
  23. registration = itkImageRegistrationMethodIF2IF2_New()  
  24. imageMetric  = itkMeanSquaresImageToImageMetricIF2IF2_New()  
  25. transform    = itkTranslationTransformD2_New()  
  26. optimizer    = itkRegularStepGradientDescentOptimizer_New()  
  27. interpolator = itkLinearInterpolateImageFunctionIF2D_New()  
  28.   
  29.   
  30. registration.SetOptimizer(    optimizer.GetPointer()    )  
  31. registration.SetTransform(    transform.GetPointer()    )  
  32. registration.SetInterpolator( interpolator.GetPointer() )  
  33. registration.SetMetric(       imageMetric.GetPointer()  )  
  34. registration.SetFixedImage(  fixedImage  )  
  35. registration.SetMovingImage( movingImage )  
  36.   
  37. registration.SetFixedImageRegion( fixedImage.GetBufferedRegion() )  
  38.   
  39. transform.SetIdentity()  
  40. initialParameters = transform.GetParameters()  
  41.   
  42. registration.SetInitialTransformParameters( initialParameters )  
  43.   
  44. #  
  45. # Iteration Observer  
  46. #  
  47. def iterationUpdate():  
  48.     currentParameter = transform.GetParameters()  
  49.     print "M: %f   P: %f %f " % ( optimizer.GetValue(),  
  50.                         currentParameter.GetElement(0),  
  51.                         currentParameter.GetElement(1) )  
  52.   
  53. iterationCommand = itkPyCommand_New()  
  54. iterationCommand.SetCommandCallable( iterationUpdate )  
  55. optimizer.AddObserver( itkIterationEvent(), iterationCommand.GetPointer() )  
  56.   
  57.   
  58.   
  59. #  
  60. #  Define optimizer parameters  
  61. #  
  62. optimizer.SetMaximumStepLength(  4.00 )  
  63. optimizer.SetMinimumStepLength(  0.01 )  
  64. optimizer.SetNumberOfIterations( 200  )  
  65.   
  66.   
  67. print "Starting registration"  
  68.   
  69. #  
  70. #  Start the registration process  
  71. #  
  72.   
  73. registration.Update()  
  74.   
  75.   
  76. #  
  77. # Get the final parameters of the transformation  
  78. #  
  79. finalParameters = registration.GetLastTransformParameters()  
  80.   
  81. print "Final Registration Parameters "  
  82. print "Translation X =  %f" % (finalParameters.GetElement(0),)  
  83. print "Translation Y =  %f" % (finalParameters.GetElement(1),)  
  84.   
  85. #  
  86. # Now, we use the final transform for resampling the  
  87. # moving image.  
  88. #  
  89. resampler = itkResampleImageFilterIF2IF2_New()  
  90. resampler.SetTransform( transform.GetPointer()    )  
  91. resampler.SetInput(     movingImage  )  
  92.   
  93. region = fixedImage.GetLargestPossibleRegion()  
  94.   
  95. resampler.SetSize( region.GetSize() )  
  96.   
  97. resampler.SetOutputSpacing( fixedImage.GetSpacing() )  
  98. resampler.SetOutputOrigin(  fixedImage.GetOrigin()  )  
  99. resampler.SetOutputDirection(  fixedImage.GetDirection()  )  
  100. resampler.SetDefaultPixelValue( 100 )  
  101.   
  102. outputCast = itkRescaleIntensityImageFilterIF2IUC2_New()  
  103. outputCast.SetOutputMinimum(      0  )  
  104. outputCast.SetOutputMaximum(  255  )  
  105. outputCast.SetInput(resampler.GetOutput())  
  106.   
  107. #  
  108. #  Write the resampled image  
  109. #  
  110. writer = itkImageFileWriterIUC2_New()  
  111.   
  112. writer.SetFileName( outputImageName )  
  113. writer.SetInput( outputCast.GetOutput() )  
  114. writer.Update()  
  115. print "image registration has been finished"  

注意:运行该例子,在Observer的定义处可能会报错:

iterationCommand = itkPyCommand_New()

NameError: name 'itkPyCommand_New' is notdefined

找到InsightToolkit.py文件(#BUILD_OUTPUT#\lib\ITK-4.5\Python下面),在最后一行添加添加from ITKPyUtilsPython import *,再次运行该例子程序。

接下来会遇到一个新的错误:

Traceback (most recent call last):

 File"C:\Users\User\workspace\python_itk\registration2D.py", line 83, in

   optimizer.AddObserver( itkIterationEvent(),iterationCommand.GetPointer() )

 File "C:\IVTK\ITK32Py\lib\ITK-4.5\Python\ITKCommonBasePython.py",line 1464, in AddObserver

   elif len(args) == 2 and not issubclass(args[1].__class__, itk.Command)and callable(args[1]):

 File"C:\IVTK\ITK32Py\lib\ITK-4.5\Python\itkLazy.py", line 37, in__getattribute__

   itkBase.LoadModule(module, namespace)

 File"C:\IVTK\ITK32Py\lib\ITK-4.5\Python\itkBase.py", line 119, inLoadModule

   for k, v in module.__dict__.items():

UnboundLocalError: local variable 'module'referenced before assignment

  解决办法:在itkBase.py中(#BUILD_OUTPUT#\lib\ITK-4.5\Python下面),103行后面添加如下代码:

 module = loader.load(swigModuleName)

  再次运行该例子程序,即可成功。


转载:https://blog.csdn.net/taigw/article/details/38316847

注:

  • 我之前按照网上的教程装itk,然后想把itk导入到python里面去,但是我忽视了一点就是,网上的教程都没有添加到python的环境变量这一步,所以我导包的时候出现了no moduel namde itk,还百思不得其解,我按照官网的教程装的,为什么会出现这种情况,出现这种问题的第一反应,我觉得可能是环境变量的原因,但是我马上否定了自己,因为官网的教程都没有添加环境变量这一步啊,其实根本原因我忽视了官网教程,只是教你如何安装Itk,并没有教你如何把itk配置到Python中去,直到看了这篇文章,我才肯定自己的怀疑是正确的,总的来说原因还是对Python这种配置的深层原因,包括编译的文件的认识匮乏。有时间一定要补上来。
  • 后来我直接在pycharm里直接安装了itk,非常方便。

你可能感兴趣的:(python学习笔记)