配置: 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 二,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路徑添加到Eclipse的PYTHONPATH中 五,例子程式
5.1 用ITK開啟並儲存一副映像
import itkimport sysimport vtkinputfilename="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.SS2OutputImageType = itk.Image.UC2reader = 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()
5.2 用ITK開啟映像,用VTK顯示
在上述代碼後面添加:
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 argvfixedImageName="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"
注意:運行該例子,在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<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)
再次運行該例子程式,即可成功。