[Insight-users] Problem in 3D segmentation
Luis Ibanez
luis.ibanez at kitware.com
Wed, 28 Apr 2004 20:25:39 -0400
Hi Rodrigo,
Two questions:
1) What is the size (in pixels) of the image that
you are passing as input to this ITK pipeline ?
2) Does this error happens the first time you run
the pipeline, or does it happens when you have
ran it once and then you change the input image
for another one ?
Please let us know,
Thanks
Luis
------------------------
Rodrigo Trujillo wrote:
> Hi,
>
> I'm testing itkShapeDetectionLevelSetImageFilter in Python. With 2D
> images (1 slice) my program
> works very well, but when i tried to expand the code for 3D images, the
> following error occurs:
>
> "
> Traceback (most recent call last):
> File "C:\Meus
> Documentos\Rodrigo\Segmentacao\ShapeDetection_3D_MRI.py", line 84, in ?
> shapeD.Update()
> File "C:/ITK/Release\itkShapeDetectionLevelSetImageFilter.py", line
> 692, in Update
> def Update(*args): return
> apply(_itkShapeDetectionLevelSetImageFilter.itkShapeDetectionLevelSetImageFilterF3F3_Pointer_Update,args)
> RuntimeError:
> C:\Compilacao\InsightToolkit-1.6.0\Code\Common\itkDataObject.cxx:376:
> Requested region is (at least partially) outside the largest possible
> region.
> "
>
> Does somebody know the reason of the error ? And how can i solve ?
> My code is attached.
>
>
> Thanks,
>
> Rodrigo Trujillo
>
>
> ------------------------------------------------------------------------
>
> import vtk
> import ConnectVTKITK as itk
> from vtk.tk.vtkTkRenderWidget import *
>
> reader = vtk.vtkImageReader2()
> reader.SetDataByteOrderToLittleEndian()
> reader.SetFilePrefix('C://TEMP//InVesalius//Jair')
> reader.SetDataSpacing(0.32,0.32,0.6)
> reader.SetDataExtent(0,255,0,255,2,27)
> reader.Update()
>
> imageCast = vtk.vtkImageCast()
> imageCast.SetOutputScalarTypeToFloat()
> imageCast.SetInput(reader.GetOutput())
> imageCast.Update()
>
> vtkExporter = vtk.vtkImageExport()
> vtkExporter.SetInput(imageCast.GetOutput())
> itkImporter = itk.itkVTKImageImportF3_New()
> itk.ConnectVTKToITKF3(vtkExporter, itkImporter.GetPointer())
> itkImporter.Update() # Sem este update, dah pau !!!
>
> # Passando um filtro de SMOOTHING
> filter = itk.itkCurvatureAnisotropicDiffusionImageFilterF3F3_New()
> filter.SetInput(itkImporter.GetOutput())
>
> filter.SetNumberOfIterations(6)
> filter.SetTimeStep(0.0625)
> filter.SetConductanceParameter(3.0)
> filter.Update()
>
> # Criando o gradiente das imagem
> gradiente = itk.itkGradientMagnitudeRecursiveGaussianImageFilterF3F3_New()
> gradiente.SetInput(filter.GetOutput())
> gradiente.SetSigma(0.7)
> gradiente.Update()
>
> # Passando sigmoid. Cria a funcao SPEED
> sigmoid = itk.itkSigmoidImageFilterF3F3_New()
> sigmoid.SetInput(gradiente.GetOutput())
> sigmoid.SetOutputMinimum(0)
> sigmoid.SetOutputMaximum(4095)
> sigmoid.SetAlpha(-1.0) # Deve ser negativo para inverter as cores
> sigmoid.SetBeta(14.0)
> sigmoid.Update()
>
> # Pipeline do FastMarching
> fastMarching = itk.itkFastMarchingImageFilterF3F3_New()
>
> sementes = itk.itkNodeContainerF3_New() # Guardara as sementes (LevelSetNodes !!)
> node = itk.itkLevelSetNodeF3() # Pega a semente e transforma num LevelSetNode
>
> idx = itk.itkIndex3() # Selecionando uma semente
> idx.SetElement(0,130)
> idx.SetElement(1,114)
> idx.SetElement(2,20)
>
> #node.SetValue(0.0)
> node.SetValue(-5.0)
> node.SetIndex(idx)
>
> sementes.Initialize() # Inicializa as sementes
> sementes.InsertElement(0,node)
>
> fastMarching.SetTrialPoints(sementes.GetPointer())
> fastMarching.SetOutputSize( gradiente.GetOutput().GetBufferedRegion().GetSize())
> fastMarching.SetSpeedConstant( 1.0 )
> fastMarching.SetStoppingValue(5.0)
> fastMarching.Update()
>
>
> # Implementacao do SHAPE
>
> shapeD = itk.itkShapeDetectionLevelSetImageFilterF3F3_New()
>
> shapeD.SetInput( fastMarching.GetOutput() )
> shapeD.SetFeatureImage( sigmoid.GetOutput() )
>
> shapeD.SetPropagationScaling( 10.0 )
> shapeD.SetCurvatureScaling( 5.0 )
>
> shapeD.SetMaximumRMSError( 0.02 )
> shapeD.SetNumberOfIterations( 400 )
> shapeD.Update()
>
> # Threshold binario na imagem do Shape
> bt = itk.itkBinaryThresholdImageFilterF3US3_New() # Retorna UShort
> bt.SetInput(shapeD.GetOutput())
> bt.SetLowerThreshold(0)
> bt.SetUpperThreshold(204)
> bt.SetOutsideValue(0)
> bt.SetInsideValue(2000)
> bt.Update()
>
> itkExporter = itk.itkVTKImageExportUS3_New()
> itkExporter.SetInput(bt.GetOutput())
> vtkImporter = vtk.vtkImageImport()
> itk.ConnectITKUS3ToVTK(itkExporter.GetPointer(), vtkImporter)
> vtkImporter.Update()
>
>
> # Visualizacao
>
> # Definindo a opacidade: Funcao de transferencia de opacidade
>
> tfun = vtk.vtkPiecewiseFunction()
> tfun.AddPoint(0.0, 0)
> tfun.AddPoint(1.0, 0)
> #tfun.AddPoint(199.0, 0)
> #tfun.AddPoint(200.0, 0.5)
> tfun.AddPoint(2.0, 1.0)
> tfun.AddPoint(4095.0, 1.0)
>
> # Definindo a funcao de transferencia de cores
>
> ctfun = vtk.vtkColorTransferFunction()
> ctfun.AddRGBPoint(0.0, 1.0, 0.1, 0.1)
> ctfun.AddRGBPoint(4095.0, 1.0, 1.0, 1.0)
>
>
> # Criando o volume
> compositeFunction = vtk.vtkVolumeRayCastCompositeFunction()
>
> volumeMapper = vtk.vtkVolumeRayCastMapper()
> volumeMapper.SetInput(vtkImporter.GetOutput())
> volumeMapper.SetVolumeRayCastFunction(compositeFunction)
>
> volumeProperty = vtk.vtkVolumeProperty()
> volumeProperty.SetColor(ctfun)
> volumeProperty.SetScalarOpacity(tfun)
> volumeProperty.SetInterpolationTypeToLinear()
> volumeProperty.ShadeOn()
>
> Ator = vtk.vtkVolume()
> Ator.SetMapper(volumeMapper)
> Ator.SetProperty(volumeProperty)
>
> ren = vtk.vtkRenderer()
> ren.AddVolume(Ator)
>
> # Criando a grade em volta do volume
> out = vtk.vtkOutlineFilter()
> out.SetInput(vtkImporter.GetOutput())
>
> isoMapper2 = vtk.vtkOpenGLPolyDataMapper()
> isoMapper2.SetInput(out.GetOutput())
> isoMapper2.ScalarVisibilityOff()
>
> isoActor2 = vtk.vtkOpenGLActor()
> isoActor2.SetMapper(isoMapper2)
>
> ren.AddActor(isoActor2)
>
> janela = Tkinter.Tk()
>
> imageframe = Frame(janela)
> imageframe.pack(side=LEFT,fill = BOTH)
>
> pane = vtkTkRenderWidget(imageframe,width = 512, height = 512)
> pane.GetRenderWindow().AddRenderer(ren)
> pane.pack()
>
> janela.mainloop()