[vtkusers] Question about vtkImageData/Writer

Paul McGuinness mcguinpg at maths.tcd.ie
Tue Jul 29 11:28:12 EDT 2003


Hi All,

The problem I am having is that the scalar values are not being read by
vtkImageReader properly. I compare the original scalar values that were
created at the very beginning of the program, and the scalar values the
where read in my vtkImageReader (remember below I said that I wrote the
vtkimagedata object with its scalar values to a file using vtkimagewriter
and read the same file back in using vtkimagereader).

Does anyone know what I am doing wrong such that I am reading in the wrong
values for my scalar values?
I have attached my code below so you can see  what I am trying to achieve.
I should mention that vtkStructuredPointsReader/Writer works fine but due
to the nature of my work I must use vtkImageReader/Writer.

Many Thanks,
Paul.



#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkImageData.h"
#include "vtkFloatArray.h"
#include "vtkContourFilter.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkProperty.h"
#include "vtkPointData.h"
#include "vtkImageWriter.h"
#include "vtkImageReader.h"
#include "vtkSphereSource.h"
#include "vtkStructuredPointsWriter.h"
#include "vtkStructuredPointsReader.h"
#include "vtkDataSet.h"
#include "vtkStructuredData.h"
#include "vtkImageToStructuredPoints.h"
#include "vtkStructuredPointsSource.h"
#include "vtkDataArray.h"

main ()
{

  float sp, z, y, x, s, point[3], point2[3];
int i, j, k,  kOffset, jOffset, offset,h,t=0;
float valuerange[2];

vtkImageData *vol = vtkImageData::New();
 vol->SetDimensions(26,26,26);
  vol->SetOrigin(-0.5,-0.5,-0.5);
  sp =1.0/25.0;
  vol->SetSpacing(sp,sp,sp);
  vol->AllocateScalars();
  vol->SetScalarTypeToFloat();

vtkFloatArray *scalars =vtkFloatArray::New();
                    for(k=0;k<26;k++)
  {
  z = -0.5 + k*sp;
  kOffset = k*26*26;

for(j=0; j<26; j++)
  {
  y = -0.5 +j*sp;
  jOffset = j*26;


                     for(i=0;i<26;i++)
                     {
                     x = -0.5 + i*sp;
                     s = x*x + y*y + z*z - (0.4*0.4);
                     offset = i + jOffset + kOffset;
                    scalars->InsertTuple1(offset,s);
                  //  scalars->InsertValue(offset,s);
		//   if(t<100)  printf("scalars -> %d , %lf\n",offset,s);
		 // t++;
                     }
                     }
                     }

  vol->GetPointData()->SetScalars(scalars);
   vol->GetPointData()->CopyAllOn();
  vol->Update();
  vol->UpdateData();

vtkImageWriter *writer = vtkImageWriter::New();
 writer->SetInput(vol);
 writer->SetFileName("voldataim.vtk");
 writer->SetFileDimensionality(3);
 writer->Write();

vtkImageReader *reader  = vtkImageReader::New();
 reader->SetFileName("voldataim.vtk");
 reader->SetFileDimensionality(3);
 reader->SetDataExtent(0,25, 0, 25, 0, 25);
 reader->SetDataSpacing(1.0/25.0, 1.0/25.0, 1.0/25.0);
 reader->SetDataOrigin(-0.5,-0.5,-0.5);

    reader->GetOutput()->GetScalarRange(valuerange);//new

 reader->Update();
 reader->UpdateWholeExtent();
 reader->UpdateInformation();

 vtkFloatArray *scalars2 =vtkFloatArray::New();
 scalars2=(vtkFloatArray *)reader->GetOutput()->GetPointData()->GetScalars();
 for(i=0;i<100;i++) printf("reader->GetOutput())->GetPointData()->GetScalars(%d) = %lf\n", i, scalars2->GetValue(i));


  vtkContourFilter *contour = vtkContourFilter::New();
      contour->SetInput(reader->GetOutput());
     //   contour->SetInput(vol);
      contour->SetValue(0,0);
      contour->Update();

  vtkPolyDataMapper *volMapper =  vtkPolyDataMapper::New();
      volMapper->SetInput(contour->GetOutput());
      volMapper->ScalarVisibilityOff();
  vtkActor *volActor = vtkActor::New();
      volActor->SetMapper(volMapper);
     // volActor->GetProperty()->SetRepresentationToWireframe();

  vtkRenderer *renderer = vtkRenderer::New();
  vtkRenderWindow *renWin = vtkRenderWindow::New();
    renWin->AddRenderer(renderer);
  vtkRenderWindowInteractor *iren = vtkRenderWindowInteractor::New();
    iren->SetRenderWindow(renWin);


  renderer->AddActor(volActor);
      renderer->SetBackground(1,1,1);
  renWin->SetSize(400,400);

  // interact with data

  renWin->Render();
  iren->Start();

  // Clean up
  renderer->Delete();
  renWin->Delete();
  iren->Delete();
  vol->Delete();
  scalars->Delete();
  contour->Delete();
  volMapper->Delete();
  volActor->Delete();
}


On Mon, 28 Jul 2003, Paul McGuinness wrote:

>
> Hi Users,
>
> I have a question that cannot be answered by the book and I hope one of
> you know the answer.
> My problem to start with is I am creating a sphere using vtkImageData and
> using vol->GetPointData()->SetScalars(scalars) to insert the scalar values
> that define the sphere where scalars is vtkFloatArray. (example Vol.cxx)
> The pipeline is as follows:
>
> vtkImageData -> vtkContourFilter -> vtkPolyDataMapper -> vtkActor
> ->vtkRenderer -> vtkRenderWindow
>
> And the sphere appears correctly.
>
> Now if I use vtkStructuredPointsWriter/Reader in the pipeline; use
> structuredpoints writer to write the vtkImageData of a sphere to a file
> and the structuredpointsreader to read it back in and continue the pipline
> as before e.g.:
>
> vtkImageData -> vtkStructuredPointsWriter ->
> vtkStructuredPointsReader -> vtkContourFilter -> vtkPolyDataMapper ->
> vtkActor ->vtkRenderer -> vtkRenderWindow
>
> The image will appear correctly on the screen as a sphere.
>
> But now if I use vtkImageWriter/Reader instead of
> vtkStructuredPointsWriter/Reader e.g.:
>
> vtkImageData -> vtkImageWriter -> vtkImageReader -> vtkContourFilter ->
> vtkPolyDataMapper -> vtkActor ->vtkRenderer -> vtkRenderWindow
>
> The image will not correctly appear on the screen as a sphere but as a
> shape that resembles a cubic shaped sponge.
>
> Does anyone know why I am getting the wrong shape because I need to use
> vtkImageWriter's void  SetFilePrefix (char *filePrefix) to create multiple files rather
> then having all the data in just one file? And if I cannot use
> vtkImageWriter in the this example because how the vtkImageData object is
> being defined (vtk example Vol.cxx) how should I create this sphere to
> use vtkImageWriter?
>
> Many Thanks,
> Paul.
>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: <http://public.kitware.com/cgi-bin/vtkfaq>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>




More information about the vtkusers mailing list