[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