[vtkusers] vtkFastSplatter broken?

Richard Brown richard.j.brown at live.co.uk
Wed Jan 6 11:00:53 EST 2016


Cory,

If possible I’d like to splat them into an existing image. When repeating the process many times for a large image, surely it becomes rather slow to create a new image each time and set all the other values to zero?

Regards,
Richard

> On 06 Jan 2016, at 15:19, Cory Quammen <cory.quammen at kitware.com> wrote:
> 
> Richard,
> 
> Not sure what you mean. You are splatting a vtkImageData at the 5
> points you defined into a new image. Do you mean you want to splat
> them into an existing image?
> 
> Thanks,
> Cory
> 
> On Wed, Jan 6, 2016 at 6:19 AM, Richard Brown
> <richard.j.brown at live.co.uk <mailto:richard.j.brown at live.co.uk>> wrote:
>> Cory,
>> 
>> Thanks for the help. Still trying to wrap my head around it though - is there any way to splat a pre-existing vtkImageData?
>> 
>> Regards,
>> Richard
>> 
>>> On 05 Jan 2016, at 21:59, Cory Quammen <cory.quammen at kitware.com> wrote:
>>> 
>>> Hi Richard,
>>> 
>>> I think you had two problems in your code:
>>> 
>>> 1). The vtkFastSplatter was auto-determining the origin and pixel
>>> spacing of the output image. When you moved the one point around, the
>>> origin was adjusted so that it was always at the location of the one
>>> point. This appeared in the renderer as though nothing was happening.
>>> You can fix this by adding a call to
>>> 
>>> splatter->SetModelBounds(...)
>>> 
>>> to some fixed bounding box.
>>> 
>>> 2). Moving points 2-5 by 1 unit in space won't really be visible in an
>>> image where the voxel size is also 1 and the splat is relatively
>>> large. You can fix this by moving the points a further distance.
>>> 
>>> Here is a modified version of your example where the points show up
>>> where expected:
>>> 
>>> /*
>>> * Copyright 2004 Sandia Corporation.
>>> * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
>>> * license for use of this work by or on behalf of the
>>> * U.S. Government. Redistribution and use in source and binary forms, with
>>> * or without modification, are permitted provided that this Notice and any
>>> * statement of authorship are reproduced on all copies.
>>> */
>>> 
>>> // Simple test of vtkFastSplatter
>>> #include "vtkImageData.h"
>>> #include "vtkImageShiftScale.h"
>>> #include "vtkFastSplatter.h"
>>> #include "vtkImageViewer2.h"
>>> #include "vtkPoints.h"
>>> #include "vtkPolyData.h"
>>> #include "vtkRenderer.h"
>>> #include "vtkRenderWindow.h"
>>> #include "vtkRenderWindowInteractor.h"
>>> 
>>> #include "vtkSmartPointer.h"
>>> #define VTK_CREATE(type, name) \
>>> 
>>> vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
>>> 
>>> #include <math.h>
>>> 
>>> const int SPLAT_IMAGE_SIZE = 100;
>>> 
>>> int main(int, char *[])
>>> {
>>> // For the purposes of this example we'll build the splat image by
>>> // hand.
>>> 
>>> VTK_CREATE(vtkImageData, SplatImage);
>>> SplatImage->SetDimensions(SPLAT_IMAGE_SIZE, SPLAT_IMAGE_SIZE, 1);
>>> SplatImage->AllocateScalars(VTK_FLOAT, 1);
>>> 
>>> for (int i = 0; i < SPLAT_IMAGE_SIZE; ++i)
>>>   {
>>>   for (int j = 0; j < SPLAT_IMAGE_SIZE; ++j)
>>>     {
>>>     double xCoord = 1 - fabs(  (i - SPLAT_IMAGE_SIZE/2)
>>>                                / (SPLAT_IMAGE_SIZE/2.0) );
>>>     double yCoord = 1 - fabs(  (j - SPLAT_IMAGE_SIZE/2)
>>>                                / (SPLAT_IMAGE_SIZE/2.0) );
>>> 
>>>     SplatImage->SetScalarComponentFromDouble(i, j, 0, 0,
>>>                                              xCoord * yCoord );
>>>     }
>>>   }
>>> 
>>> VTK_CREATE(vtkPolyData, SplatPoints);
>>> VTK_CREATE(vtkPoints, Points);
>>> 
>>> Points->SetNumberOfPoints( 5 );
>>> double point[3];
>>> 
>>> // Move the points further
>>> point[0] = 100;
>>> point[1] = 100;
>>> point[2] = 0;
>>> Points->SetPoint( 0, point );
>>> 
>>> point[0] = 100;
>>> point[1] = 0;
>>> point[2] = 0;
>>> Points->SetPoint( 1, point );
>>> 
>>> point[0] = 0;
>>> point[1] = 100;
>>> point[2] = 0;
>>> Points->SetPoint( 2, point );
>>> 
>>> point[0] = 0;
>>> point[1] = 0;
>>> point[2] = 0;
>>> Points->SetPoint( 3, point );
>>> 
>>> point[0] = 199;
>>> point[1] = 199;
>>> point[2] = 0;
>>> Points->SetPoint( 4, point );
>>> 
>>> SplatPoints->SetPoints(Points);
>>> 
>>> VTK_CREATE(vtkFastSplatter, splatter);
>>> splatter->SetInputData( SplatPoints );
>>> splatter->SetOutputDimensions( 2*SPLAT_IMAGE_SIZE,
>>>                                2*SPLAT_IMAGE_SIZE,
>>>                                1 );
>>> 
>>> // Fix the model bounds rather than relying on vtkFastSplatter to
>>> calculate them
>>> splatter->SetModelBounds(0, 199, 0, 199, 0, 0);
>>> splatter->SetInputData(1, SplatImage );
>>> 
>>> // The image viewers and writers are only happy with unsigned char
>>> // images.  This will convert the floats into that format.
>>> VTK_CREATE(vtkImageShiftScale, resultScale);
>>> resultScale->SetOutputScalarTypeToUnsignedChar();
>>> resultScale->SetShift(0);
>>> resultScale->SetScale(255);
>>> resultScale->SetInputConnection( splatter->GetOutputPort() );
>>> 
>>> splatter->Update();
>>> resultScale->Update();
>>> 
>>> splatter->GetOutput()->Print(cout);
>>> 
>>> // Set up a viewer for the image.  vtkImageViewer and
>>> // vtkImageViewer2 are convenient wrappers around vtkActor2D,
>>> // vtkImageMapper, vtkRenderer, and vtkRenderWindow.  All you need
>>> // to supply is the interactor and hooray, Bob's your uncle.
>>> VTK_CREATE(vtkImageViewer2, ImageViewer);
>>> ImageViewer->SetInputConnection( resultScale->GetOutputPort() );
>>> ImageViewer->SetColorLevel(127);
>>> ImageViewer->SetColorWindow(255);
>>> 
>>> VTK_CREATE(vtkRenderWindowInteractor, iren);
>>> ImageViewer->SetupInteractor(iren);
>>> 
>>> ImageViewer->Render();
>>> ImageViewer->GetRenderer()->ResetCamera();
>>> 
>>> iren->Initialize();
>>> ImageViewer->Render();
>>> iren->Start();
>>> 
>>> return EXIT_SUCCESS;
>>> }
>>> 
>>> HTH,
>>> Cory
>>> 
>>> 
>>> On Thu, Dec 17, 2015 at 6:58 AM, mbcx9rb9 <richard.j.brown at live.co.uk> wrote:
>>>> Hi all,
>>>> 
>>>> I was hoping to use vtkFastSplatter so I took a look at the test. However,
>>>> it doesn't work how I expected (or how it should, I think).
>>>> 
>>>> The example places 5 splatters at various coordinates. But I can't control
>>>> the position of those splats. If I comment out all but the first splat and
>>>> then change the coordinates, it doesn't move!
>>>> 
>>>> Below is the relevant code, can someone confirm that if they change point[0]
>>>> and point[1], nothing happens? Then, try adding in a second splat (remember
>>>> to change Points->SetNumberOfPoints( 1 ) to 2), changing its coordinates and
>>>> observe that weird things start happening...
>>>> 
>>>> 
>>>> /*
>>>> * Copyright 2004 Sandia Corporation.
>>>> * Under the terms of Contract DE-AC04-94AL85000, there is a non-exclusive
>>>> * license for use of this work by or on behalf of the
>>>> * U.S. Government. Redistribution and use in source and binary forms, with
>>>> * or without modification, are permitted provided that this Notice and any
>>>> * statement of authorship are reproduced on all copies.
>>>> */
>>>> 
>>>> // Simple test of vtkFastSplatter
>>>> 
>>>> #include "vtkImageData.h"
>>>> #include "vtkImageShiftScale.h"
>>>> #include "vtkFastSplatter.h"
>>>> #include "vtkImageViewer2.h"
>>>> #include "vtkPoints.h"
>>>> #include "vtkPolyData.h"
>>>> #include "vtkRenderer.h"
>>>> #include "vtkRenderWindow.h"
>>>> #include "vtkRenderWindowInteractor.h"
>>>> 
>>>> #include "vtkSmartPointer.h"
>>>> #define VTK_CREATE(type, name) \
>>>> vtkSmartPointer<type> name = vtkSmartPointer<type>::New()
>>>> 
>>>> #include <math.h>
>>>> 
>>>> const int SPLAT_IMAGE_SIZE = 100;
>>>> 
>>>> int main(int, char *[])
>>>> {
>>>> // For the purposes of this example we'll build the splat image by
>>>> // hand.
>>>> 
>>>> VTK_CREATE(vtkImageData, SplatImage);
>>>> SplatImage->SetDimensions(SPLAT_IMAGE_SIZE, SPLAT_IMAGE_SIZE, 1);
>>>> SplatImage->AllocateScalars(VTK_FLOAT, 1);
>>>> 
>>>> for (int i = 0; i < SPLAT_IMAGE_SIZE; ++i)
>>>>   {
>>>>   for (int j = 0; j < SPLAT_IMAGE_SIZE; ++j)
>>>>     {
>>>>     double xCoord = 1 - fabs(  (i - SPLAT_IMAGE_SIZE/2)
>>>>                              / (SPLAT_IMAGE_SIZE/2.0) );
>>>>     double yCoord = 1 - fabs(  (j - SPLAT_IMAGE_SIZE/2)
>>>>                              / (SPLAT_IMAGE_SIZE/2.0) );
>>>> 
>>>>     SplatImage->SetScalarComponentFromDouble(i, j, 0, 0,
>>>>                                              xCoord * yCoord );
>>>>     }
>>>>   }
>>>> 
>>>> VTK_CREATE(vtkPolyData, SplatPoints);
>>>> VTK_CREATE(vtkPoints, Points);
>>>> 
>>>> Points->SetNumberOfPoints( 1 );
>>>> double point[3];
>>>> 
>>>> point[0] = 0;
>>>> point[1] = 0;
>>>> point[2] = 0;
>>>> Points->SetPoint( 0, point );
>>>> /*
>>>> point[0] = 1;
>>>> point[1] = 0;
>>>> point[2] = 0;
>>>> Points->SetPoint( 1, point );
>>>> 
>>>> point[0] = -1;
>>>> point[1] = 1;
>>>> point[2] = 0;
>>>> Points->SetPoint( 2, point );
>>>> 
>>>> point[0] = 1;
>>>> point[1] = -1;
>>>> point[2] = 0;
>>>> Points->SetPoint( 3, point );
>>>> 
>>>> point[0] = -1;
>>>> point[1] = -1;
>>>> point[2] = 0;
>>>> Points->SetPoint( 4, point );
>>>> */
>>>> SplatPoints->SetPoints(Points);
>>>> 
>>>> VTK_CREATE(vtkFastSplatter, splatter);
>>>> splatter->SetInputData( SplatPoints );
>>>> splatter->SetOutputDimensions( 2*SPLAT_IMAGE_SIZE,
>>>>                                2*SPLAT_IMAGE_SIZE,
>>>>                                1 );
>>>> splatter->SetInputData(1, SplatImage );
>>>> 
>>>> // The image viewers and writers are only happy with unsigned char
>>>> // images.  This will convert the floats into that format.
>>>> VTK_CREATE(vtkImageShiftScale, resultScale);
>>>> resultScale->SetOutputScalarTypeToUnsignedChar();
>>>> resultScale->SetShift(0);
>>>> resultScale->SetScale(255);
>>>> resultScale->SetInputConnection( splatter->GetOutputPort() );
>>>> 
>>>> splatter->Update();
>>>> resultScale->Update();
>>>> 
>>>> // Set up a viewer for the image.  vtkImageViewer and
>>>> // vtkImageViewer2 are convenient wrappers around vtkActor2D,
>>>> // vtkImageMapper, vtkRenderer, and vtkRenderWindow.  All you need
>>>> // to supply is the interactor and hooray, Bob's your uncle.
>>>> VTK_CREATE(vtkImageViewer2, ImageViewer);
>>>> ImageViewer->SetInputConnection( resultScale->GetOutputPort() );
>>>> ImageViewer->SetColorLevel(127);
>>>> ImageViewer->SetColorWindow(255);
>>>> 
>>>> VTK_CREATE(vtkRenderWindowInteractor, iren);
>>>> ImageViewer->SetupInteractor(iren);
>>>> 
>>>> ImageViewer->Render();
>>>> ImageViewer->GetRenderer()->ResetCamera();
>>>> 
>>>> iren->Initialize();
>>>> ImageViewer->Render();
>>>> iren->Start();
>>>> 
>>>> return EXIT_SUCCESS;
>>>> }
>>>> 
>>>> 
>>>> 
>>>> 
>>>> --
>>>> View this message in context: http://vtk.1045678.n5.nabble.com/vtkFastSplatter-broken-tp5735566.html
>>>> Sent from the VTK - Users mailing list archive at Nabble.com.
>>>> _______________________________________________
>>>> Powered by www.kitware.com
>>>> 
>>>> Visit other Kitware open-source projects at http://www.kitware.com/opensource/opensource.html
>>>> 
>>>> Please keep messages on-topic and check the VTK FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
>>>> 
>>>> Search the list archives at: http://markmail.org/search/?q=vtkusers
>>>> 
>>>> Follow this link to subscribe/unsubscribe:
>>>> http://public.kitware.com/mailman/listinfo/vtkusers
>>> 
>>> 
>>> 
>>> --
>>> Cory Quammen
>>> R&D Engineer
>>> Kitware, Inc.
>> 
> 
> 
> 
> -- 
> Cory Quammen
> R&D Engineer
> Kitware, Inc.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtkusers/attachments/20160106/f7206471/attachment.html>


More information about the vtkusers mailing list