ITK+VTK+Python的整合及例子程式__Python

來源:互聯網
上載者:User

配置: 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)

  再次運行該例子程式,即可成功。


聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.