ITK+VTK+Pythonの統合と例プログラム

7697 ワード

構成:VS 2008(32-bit)
Python2.7.8(32-bit)
Cmake 3.0
ITK4.5.2
VTKバージョン要求5.9以上
注意:Pythonと組み合わせてVS 2008を使用することを提案します.VS 2010ではコンパイルに失敗する可能性があります.ブロガーは何度も実験をして、VS 2010ではいつもエラーが報告されていることを発見しました. 
一、前期準備
1.1 VS 2008のインストール
1.2 Cmakeのインストール
1.3 Python 2をインストールする.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新規2つのフォルダ
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#
チェックITKV 3_COMPATIBILITY
チェックITK_WRAP_PYTHON
Module_をチェックITKVtkGlue
VTK_をチェックDIRが正しいかどうか、例えばC:/IVTK/VTK 510_32Py/lib/vtk-5.10
すべてのエントリがグレーになるまでConfigureを再度クリックし、構成に成功したことを示し、Generateをクリックして確認します.
三、VS 2008を使用してコンパイルする
3.1環境変数の設定
gccxml_pah=#SOLUTION_PATH#\Wrapping\Generators\GccXML\gccxml\bin
%gccxml_path%path環境変数の末尾に追加
3.2
 
コンパイル
VS 2008で#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#libITK-4.5Pythonパス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()

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 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"

注意:この例を実行すると、Observerの定義でエラーが発生する可能性があります.
iterationCommand = itkPyCommand_New()
NameError: name 'itkPyCommand_New' is notdefined
InsightToolkit.を見つけたpyファイル(#BUILD_OUTPUT#libITK-4.5Pythonの下)は、最後の行に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#libITK-4.5Pythonの下)、103行の後ろに次のコードが追加されています.
 module = loader.load(swigModuleName)
この例のプログラムを再実行すれば、成功します.