配置: 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,lib,include等文件#BUILD_OUTPUT#
例如,我的设置是#SOLUTION_PATH#=C:\IVTK\ITK32Py_install
#BUILD_OUTPUT# =C:\IVTK\ITK32Py
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确认。
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路径添加到Eclipse的PYTHONPATH中
5.1 用ITK打开并保存一副图像
import itk import sys import vtk inputfilename="D:/DATA/small/0200.dcm" outputfilename="D:/DATA/0200.png" # # Reads a 2D image in with signed short (16bits/pixel) pixel type # and save it as unsigned char (8bits/pixel) pixel type # InputImageType = itk.Image.SS2 OutputImageType = itk.Image.UC2 reader = itk.ImageFileReader[InputImageType].New() writer = itk.ImageFileWriter[OutputImageType].New() filter = itk.RescaleIntensityImageFilter[InputImageType, OutputImageType].New() filter.SetOutputMinimum( 0 ) filter.SetOutputMaximum(255) filter.SetInput( reader.GetOutput() ) writer.SetInput( filter.GetOutput() ) reader.SetFileName(inputfilename ) writer.SetFileName(outputfilename ) writer.Update()
在上述代码后面添加:
ivfilter=itk.ImageToVTKImageFilter[OutputImageType].New() ivfilter.SetInput(filter.GetOutput()) viewer=vtk.vtkImageViewer() iren=vtk.vtkRenderWindowInteractor() viewer.SetupInteractor(iren) viewer.SetInput(ivfilter.GetOutput()) viewer.Render() viewer.SetColorWindow(255) viewer.SetColorLevel(128) iren.Start()
5.3 ITK 配准的例子
from InsightToolkit import * from sys import argv fixedImageName="D:/DATA/Brain.png" movingImageName="D:/DATA/Brainshifted13x17y.png" outputImageName="D:/DATA/Brainresult2.png" fixedImageReader = itkImageFileReaderIF2_New() movingImageReader = itkImageFileReaderIF2_New() fixedImageReader.SetFileName( fixedImageName ) movingImageReader.SetFileName( movingImageName ) fixedImageReader.Update() movingImageReader.Update() fixedImage = fixedImageReader.GetOutput() movingImage = movingImageReader.GetOutput() # # Instantiate the classes for the registration framework # registration = itkImageRegistrationMethodIF2IF2_New() imageMetric = itkMeanSquaresImageToImageMetricIF2IF2_New() transform = itkTranslationTransformD2_New() optimizer = itkRegularStepGradientDescentOptimizer_New() interpolator = itkLinearInterpolateImageFunctionIF2D_New() registration.SetOptimizer( optimizer.GetPointer() ) registration.SetTransform( transform.GetPointer() ) registration.SetInterpolator( interpolator.GetPointer() ) registration.SetMetric( imageMetric.GetPointer() ) registration.SetFixedImage( fixedImage ) registration.SetMovingImage( movingImage ) registration.SetFixedImageRegion( fixedImage.GetBufferedRegion() ) transform.SetIdentity() initialParameters = transform.GetParameters() registration.SetInitialTransformParameters( initialParameters ) # # Iteration Observer # def iterationUpdate(): currentParameter = transform.GetParameters() print "M: %f P: %f %f " % ( optimizer.GetValue(), currentParameter.GetElement(0), currentParameter.GetElement(1) ) iterationCommand = itkPyCommand_New() iterationCommand.SetCommandCallable( iterationUpdate ) optimizer.AddObserver( itkIterationEvent(), iterationCommand.GetPointer() ) # # Define optimizer parameters # optimizer.SetMaximumStepLength( 4.00 ) optimizer.SetMinimumStepLength( 0.01 ) optimizer.SetNumberOfIterations( 200 ) print "Starting registration" # # Start the registration process # registration.Update() # # Get the final parameters of the transformation # finalParameters = registration.GetLastTransformParameters() print "Final Registration Parameters " print "Translation X = %f" % (finalParameters.GetElement(0),) print "Translation Y = %f" % (finalParameters.GetElement(1),) # # Now, we use the final transform for resampling the # moving image. # resampler = itkResampleImageFilterIF2IF2_New() resampler.SetTransform( transform.GetPointer() ) resampler.SetInput( movingImage ) region = fixedImage.GetLargestPossibleRegion() resampler.SetSize( region.GetSize() ) resampler.SetOutputSpacing( fixedImage.GetSpacing() ) resampler.SetOutputOrigin( fixedImage.GetOrigin() ) resampler.SetOutputDirection( fixedImage.GetDirection() ) resampler.SetDefaultPixelValue( 100 ) outputCast = itkRescaleIntensityImageFilterIF2IUC2_New() outputCast.SetOutputMinimum( 0 ) outputCast.SetOutputMaximum( 255 ) outputCast.SetInput(resampler.GetOutput()) # # Write the resampled image # writer = itkImageFileWriterIUC2_New() writer.SetFileName( outputImageName ) writer.SetInput( outputCast.GetOutput() ) writer.Update() print "image registration has been finished"
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<module>
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)
再次运行该例子程序,即可成功。