[Insight-developers] Filter Update Woes
Karthik Krishnan
Karthik.Krishnan at kitware.com
Sat Jun 4 15:19:08 EDT 2005
To answer my own question, I found a bug in
itkImageToParametricSpaceFilter.txx. The filter creates new point data
for the mesh during every update call wiping out existing point data.
The bug was resolved by replacing:
template <class TInputImage, class TOutputMesh>
void
ImageToParametricSpaceFilter<TInputImage,TOutputMesh>
::GenerateOutputInformation()
{
OutputMeshPointer mesh = this->GetOutput();
PointsContainerPointer points = mesh->GetPoints();
PointDataContainerPointer pointData = PointDataContainer::New();
}
with
template <class TInputImage, class TOutputMesh>
void
ImageToParametricSpaceFilter<TInputImage,TOutputMesh>
::GenerateOutputInformation()
{
OutputMeshPointer mesh = this->GetOutput();
PointsContainerPointer points = mesh->GetPoints();
PointDataContainerPointer pointData;
if( mesh->GetPointData() )
{
pointData = mesh->GetPointData();
}
else
{ // Create
pointData = PointDataContainer::New();
}
}
Thanks
Regards
Karthik
Karthik Krishnan wrote:
> Hi,
>
> I am having a curious problem with updates. I've posted a minimal
> example.
> The pipeline is as follows:
>
> Image -> CastImageFilter -> ImageToParametricSpaceFilter ->
> InteriorExteriorMeshFilter
>
>
> In the example, I create a 3x3x3 image. The cast image filter really
> does nothing. It just spits the input as the output. The
> ImageToParametricSpaceFilter takes the three images (each of them
> being the same input image).
> This InteriorExteriorMeshFilter uses a SphereSpatialFunction, whose
> radius is so large that all points are inside.
>
> The output is fine if Update is called once.
> as in m_SpatialFunctionFilter->Update();
>
> If Update is called twice in succession as in
> as in m_SpatialFunctionFilter->Update();
> m_SpatialFunctionFilter->Update();
> the mesh point data gets garbled.
> If I remove the filter, everything works fine.
>
> Any suggestions ?
>
> Thank you
> Regards
> Karthik
>
>------------------------------------------------------------------------
>
>#include "itkInteriorExteriorMeshFilter.h"
>#include "itkSphereSpatialFunction.h"
>#include "itkImageToParametricSpaceFilter.h"
>#include "itkImage.h"
>#include "itkMesh.h"
>#include "itkCastImageFilter.h"
>
>int main()
>{
> // Create a simple image 3x3x3 image
> typedef itk::Image< float, 3 > ImageType;
> ImageType::Pointer image = ImageType::New();
> ImageType::IndexType start;
> ImageType::SizeType size;
> size.Fill(3);
> start[0] = 0;
> start[1] = 0;
> start[2] = 0;
> ImageType::RegionType region;
> region.SetSize( size );
> region.SetIndex( start );
> image->SetRegions( region );
> image->Allocate();
>
> ImageType::IndexType pixelIndex;
> ImageType::PixelType pixelValue = 0;
> for( unsigned int i = 0; i<size[0]; i++)
> {
> for( unsigned int j=0; j< size[1]; j++)
> {
> for( unsigned int k=0; k< size[1]; k++)
> {
> pixelIndex[0] = i;
> pixelIndex[1] = j;
> pixelIndex[2] = k;
> image->SetPixel( pixelIndex, ++pixelValue );
> }
> }
> }
>
>
> // Use a cast image filter, or for that matter any other filter
> // The filter here just passes the input to the output
> typedef itk::CastImageFilter< ImageType, ImageType > CastImageFilterType;
> CastImageFilterType::Pointer caster1 = CastImageFilterType::New();
> CastImageFilterType::Pointer caster2 = CastImageFilterType::New();
> CastImageFilterType::Pointer caster3 = CastImageFilterType::New();
> caster1->SetInput(image);
> caster2->SetInput(image);
> caster3->SetInput(image);
>
>
> // Image to Parametric Space filter
> typedef itk::Point<float,3> MeshPointDataType;
> typedef itk::Mesh< MeshPointDataType, 3 > MeshType;
> typedef itk::Mesh< MeshType::PointType, 3 > ImageSpaceMeshType;
> typedef itk::ImageToParametricSpaceFilter< ImageType, MeshType >
> ParametricSpaceFilterType;
> ParametricSpaceFilterType::Pointer m_ParametricSpace = ParametricSpaceFilterType::New();
> m_ParametricSpace->SetInput( 0, caster1->GetOutput() );
> m_ParametricSpace->SetInput( 1, caster2->GetOutput() );
> m_ParametricSpace->SetInput( 2, caster3->GetOutput() );
>
>
> // Map selected points in parametric space to image space..
> typedef itk::SphereSpatialFunction<
> MeshType::PointDimension,
> MeshType::PointType > SphereSpatialFunctionType;
> typedef SphereSpatialFunctionType SpatialFunctionType;
> typedef itk::InteriorExteriorMeshFilter<
> MeshType,
> MeshType,
> SpatialFunctionType >
> SpatialFunctionFilterType;
> SpatialFunctionFilterType::Pointer m_SpatialFunctionFilter
> = SpatialFunctionFilterType::New();
> m_SpatialFunctionFilter->SetInput( m_ParametricSpace->GetOutput() );
> SpatialFunctionType::Pointer m_SpatialFunction = SpatialFunctionType::New();
> m_SpatialFunction->SetRadius( 100 );
> m_SpatialFunctionFilter->SetSpatialFunction( m_SpatialFunction );
>
>
> // Update and print out output....
> {
> m_SpatialFunctionFilter->Update();
> MeshType::PointDataContainerPointer pointData = m_ParametricSpace->GetOutput()->GetPointData();
> MeshType::PointsContainerPointer points = m_ParametricSpace->GetOutput()->GetPoints();
> MeshType::PointsContainerIterator pointIt = points->Begin();
> MeshType::PointDataContainerIterator pointDataIt = pointData->Begin();
> while (pointIt != points->End() )
> {
> std::cout << "Image space point: " << pointDataIt.Value()
> << " mapped to Parametric space location: " << pointIt.Value() << std::endl;
> ++pointIt;
> ++pointDataIt;
> }
> }
>
> // Update again and print out output....
> {
> m_SpatialFunctionFilter->Update();
> MeshType::PointDataContainerPointer pointData = m_ParametricSpace->GetOutput()->GetPointData();
> MeshType::PointsContainerPointer points = m_ParametricSpace->GetOutput()->GetPoints();
> MeshType::PointsContainerIterator pointIt = points->Begin();
> MeshType::PointDataContainerIterator pointDataIt = pointData->Begin();
> while (pointIt != points->End() )
> {
> std::cout << "Image space point: " << pointDataIt.Value()
> << " mapped to Parametric space location: " << pointIt.Value() << std::endl;
> ++pointIt;
> ++pointDataIt;
> }
> }
>
> return EXIT_SUCCESS;
>}
>
>
>------------------------------------------------------------------------
>
>_______________________________________________
>Insight-developers mailing list
>Insight-developers at itk.org
>http://www.itk.org/mailman/listinfo/insight-developers
>
>
More information about the Insight-developers
mailing list