[Insight-users] Get ID from a neighbor found using a kd-tree?

motes motes mort.motes at gmail.com
Mon Nov 2 12:21:19 EST 2009


Hm I am not sure I understand the below code. What I need is basically
the possibility to call:

  TreeType::InstanceIdentifierVectorType neighbors;
  tree->Search( queryPoint, numberOfNeighbors, neighbors ) ;

but where neighbors could be:

std::vector<MyNeighborType> neighbors;

instead of:

  TreeType::InstanceIdentifierVectorType neighbors;


In the MyNeighborType I can then define an ID and fields for eg.
deformation vectors. This way when I get the closest neighbors I can
also look up their deformation vectors.



On Mon, Nov 2, 2009 at 5:54 PM, David Doria <daviddoria+itk at gmail.com> wrote:
> Mon, Nov 2, 2009 at 10:49 AM, motes motes <mort.motes at gmail.com> wrote:
>> Hm maybe implementing my own "InstanceIdentifier" type could be a
>> solution since the neighbors are basically a list of
>> InstanceIdentifiers:
>>
>>  typedef std::vector< InstanceIdentifier > InstanceIdentifierVectorType;
>>
>> (from itkKdTree.h)
>>
>>
>>
>> On Mon, Nov 2, 2009 at 4:40 PM, motes motes <mort.motes at gmail.com> wrote:
>>> I am using the itk::kdtree to find the k-nearest neighbors from a
>>> queryPoint within a specified radius.From the example: KdTree.cxx it
>>> looks something like this:
>>>
>>>  double radius = 437.0;
>>>  tree->Search( queryPoint, radius, neighbors ) ;
>>>  std::cout << "kd-tree radius search result:" << std::endl
>>>            << "query point = [" << queryPoint << "]" << std::endl
>>>            << "search radius = " << radius << std::endl;
>>>  std::cout << "measurement vector : distance" << std::endl;
>>>  for ( unsigned int i = 0 ; i < neighbors.size() ; ++i )
>>>    {
>>>    std::cout << "[" << tree->GetMeasurementVector( neighbors[i] )
>>>              << "] : "
>>>              << distanceMetric->Evaluate(
>>>                  tree->GetMeasurementVector( neighbors[i]))
>>>              << std::endl;
>>>    }
>>>
>>>
>>> But each neighbors is actually an object that contains a deformation
>>> vector and a unique identifier: ID.
>>>
>>> How do I lookup the ID and the deformation vector from the neighbors
>>> returned from the "Search" call?
>>>
>>> It seems that this is not possible with the above implementation of a
>>> kd-tree since a neighbor is only identified by a vector which does not
>>> allow for any extra information.
>
>
>
> Motes,
>
> I asked Luis about KDTrees one time. He said to use itkPointLocator2
> that he wrote for QuadEdgeMeshRigidRegistration (available on the
> Insight Journal). Here is an example I put together with it. I'm not
> sure if this answers your question?
>
> #include "itkPoint.h"
> #include "itkPointSet.h"
>
> #include "itkPointLocator2.h" //from QuadEdgeMeshRigidRegistration
>
> int main()
> {
>        typedef float PixelType;
>        const unsigned int Dimension = 3;
>        typedef itk::PointSet< PixelType, Dimension >   PointSetType;
>        typedef PointSetType::PointType PointType;
>        typedef PointSetType::PointsContainerPointer PointsContainerPointer;
>
>        PointSetType::Pointer  PointSet = PointSetType::New();
>        PointsContainerPointer  points = PointSet->GetPoints();
>
>        //create points
>        PointType p0, p1, p2, p3, p4, p5, p6, p7, p8;
>
>        p0[0]=  0.0; p0[1]= 0.0; p0[2]= 0.0;
>        points->InsertElement( 0, p0 );
>        p1[0]=  0.1; p1[1]= 0.0; p1[2]= 0.0;
>        points->InsertElement( 1, p1 );
>        p2[0]=  0.0; p2[1]= 0.1; p2[2]= 0.0;
>        points->InsertElement( 2, p2 );
>        p3[0]=  5.0; p3[1]=  5.0; p3[2]= 5.0;
>        points->InsertElement( 3, p3 );
>        p4[0]=  5.1; p4[1]=  5.0; p4[2]= 5.0;
>        points->InsertElement( 4, p4 );
>        p5[0]=  5.0; p5[1]=  5.1; p5[2]= 5.0;
>        points->InsertElement( 5, p5 );
>        p6[0]=  -5.0; p6[1]=  -5.0; p6[2]= -5.0;
>        points->InsertElement( 6, p6 );
>        p7[0]=  -5.1; p7[1]=  -5.0; p7[2]= -5.0;
>        points->InsertElement( 7, p7 );
>        p8[0]=  -5.0; p8[1]=  -5.1; p8[2]= -5.0;
>        points->InsertElement( 8, p8 );
>
>        typedef itk::PointLocator2<PointSetType> PointLocatorType;
>        PointLocatorType::Pointer locator = PointLocatorType::New();
>
>        locator->SetPointSet( PointSet );
>        locator->Initialize();
>
>        PointType query;
>        query[0] = 0.12; query[1] = 0.0; query[2] = 0.0;
>        PointLocatorType::PointType point( query );
>
>        typedef PointLocatorType::InstanceIdentifierVectorType
> InstanceIdentifierVectorType;
>        InstanceIdentifierVectorType result1;
>
>        locator->Search( point, static_cast<unsigned int> (2), result1 );
>
>        /*
>        //equivalent to this: (must do one of these or the Search() overload
> is ambiguous
>        unsigned int NumNeighbors = 2;
>        locator->Search( point, NumNeighbors, result );
>        */
>
>        std::cout << "Result: " << result1[0] << " " << result1[1] << std::endl;
>
>        ///////////////////////////////////////
>        PointType query2;
>        query2[0] = -5.1; query2[1] = -4.8; query2[2] = -4.9;
>        PointLocatorType::PointType point2( query2 );
>
>        InstanceIdentifierVectorType result2;
>        locator->Search( point2, 1.0, result2 );
>        for(unsigned int i = 0; i < result2.size(); i++)
>        {
>                std::cout << result2[i] << " ";
>        }
>
>        return 0;
> }
>
>
> Thanks,
>
> David
> _____________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Kitware offers ITK Training Courses, for more information visit:
> http://www.kitware.com/products/protraining.html
>
> Please keep messages on-topic and check the ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>


More information about the Insight-users mailing list