[vtk-developers] Problem with using vtkArrayCalculator to extract fields for vtkImageFFT Processing

Berk Geveci berk.geveci at gmail.com
Wed Sep 14 16:47:06 EDT 2005


This is a guess but if the array calculator outputs a data type than
the input's scalars, no imaging filter can be used down the pipeline.
This is a known bug. Essentially no (non-imaging) filter that changes
the data type of the scalars is allowed in a pipeline with imaging
filters. There is work (slow) going on to fix this issue. I would not
hold my breath for it's completion.

On 9/14/05, Randall Hand <randall.hand at gmail.com> wrote:
> Ok, I posted this once before, but here it is again with some more
> information.
>  
>  I've written a piece of code to create a synthetic dataset.  It's a 128^3
> dataset, each point with a 3-component double value consisting of (sin(x),
> junk, morejunk).  I extract just the first component, and do an FFT.  You'll
> find the code at the end of this message, along with my "PrintStatistics"
> function attached.
>  
>  You'll see from the #if/#endif blocks that there's two possible ways to do
> it.  The first is with a vtkArrayCalculator, where I set a very trivial
> function to simply copy out the one value.  The other way is with a
> vtkImageExtractComponents.  When doing it with the vtkArrayCalculator, the
> filter seems to work just fine but then the FFT yields values like :
>  
> p       Array [0]: vtkDoubleArray "result", 2,097,152 points, 8 bytes per
> point
>  p                       Magnitude Range:        0.0000  1482912.5793
>  p                       Component 0 Range:      -1048575.9848  
> 1048575.8760
>  p                       Component 1 Range:      -1048572.9243  
> 1048579.0968
>  With a simple sin wave, the result should be almost purely imaginary, so
> the Component 0 range should be almost 0 to 0.  
>  
>  When I switch to using the vtkImageExtractComponents, the results look
> better:
>  
>  
> p       Array [0]: vtkDoubleArray "image", 2,097,152 points, 8 bytes per
> point
>  p                       Magnitude Range:        0.0000  1048576.0091
>  p                       Component 0 Range:      -0.0557 0.0011
>  p                       Component 1 Range:      -1048576.0089  
> 1048576.0091
>  
>  
>  Unfortunately, when working with the vtkImageExtractComponents filter, I
> lose the other two fields if I had planned on using them for coloring or
> something.  Also, my results aren't quite what I expected.  Much better, but
> on more complex datasets I seem to get results that are a little off from
> the expected result.  I don't know if the cause of all this is related, but
> I'm chasing down what I can.
>  
>  So, any ideas?
>  
>  ----- Code starts here -------
>  
> #include <stdio.h>
>  #include <string.h>
>  #include <stdlib.h>
>  #include <unistd.h>
>  #include "stat.h"
>  #include <sys/types.h>
>  #include <sys/stat.h>
>  #include <sys/mman.h>
>  #include <fcntl.h>
>  #include <vtkObject.h>
>  #include "vtkImageData.h"
>  #include "vtkPointData.h"
>  #include <vtkDataArray.h>
>  #include <vtkUnsignedCharArray.h>
>  #include <vtkDoubleArray.h>
>  #include <vtkImageData.h>
>  #include <vtkImageFFT.h>
>  #include <vtkArrayCalculator.h>
>  #include <vtkImageExtractComponents.h>
>  
>  int main (int argc, char *argv[])
>  {
>      double *data;
>      int xdim, ydim, zdim;
>      double kx;
>      int x,y,z;
>      long index;
>      xdim = 128;
>      ydim = 128;
>      zdim = 128;
>  
>      if ((data =
> (double*)malloc(sizeof(double)*xdim*ydim*zdim*3)) == NULL)
> {
>          perror("Unable to allocate memory!\n\t");
>          return -1;
>      }
>  
>      printf("Constructing sin(kx * x) dataset...\n");
>      kx = 2.0 * 3.1415926 / (double)xdim;
>      for(x=0; x<xdim; x++) {
>          for(y=0; y<ydim; y++) {
>              for(z=0; z<zdim; z++) {
>                  index = z + (y*zdim) + (x * ydim * zdim);
>                  data[(index*3)+0] = sin(kx * (double)x);
>                  data[(index*3)+1] = cos(kx * (double)x);
>                  data[(index*3)+2] = tan(kx * (double)x);
>              }
>          }
>      }
>  
>      vtkDoubleArray *ucPointer = vtkDoubleArray::New();
>      ucPointer->SetNumberOfComponents(3);
>      ucPointer->SetArray(data, xdim*ydim*zdim*3, 1);
>      ucPointer->SetName("image");
>  
>      vtkImageData *image = vtkImageData::New();
>      image->Initialize();
>      image->SetDimensions(xdim, ydim, zdim);
>      image->SetExtent(1, xdim, 1, ydim, 1, zdim);
>      image->SetScalarTypeToDouble();
>      image->SetNumberOfScalarComponents(3);
>      image->GetPointData()->SetScalars(ucPointer);
>      PrintStatistics(image);
>      printf("Extracting Velocity X-Component...\n");
>  
>  #if 0
>      vtkArrayCalculator *extract = vtkArrayCalculator::New();
>      extract->SetInput(image);
>      extract->SetResultArrayName("result");
>      extract->AddScalarVariable("x", "image", 0);
>      extract->SetFunction("(x*1.0)+0.0");
>      extract->ReplaceInvalidValuesOff();
>      extract->Update();
>     
> extract->GetOutput()->GetPointData()->RemoveArray("image");
>     
> extract->GetOutput()->GetPointData()->SetActiveScalars("result");
>  #else
>      vtkImageExtractComponents *extract =
> vtkImageExtractComponents::New();
>      extract->SetInput(image);
>      extract->SetComponents(0);
>      extract->Update();
>  #endif
>      PrintStatistics(extract->GetOutput());
>  
>      printf("Computing FFT...\n");
>      vtkImageFFT *fft = vtkImageFFT::New();
>      fft->SetInput(extract->GetOutput());
>      fft->Update();
>      PrintStatistics(fft->GetOutput());
>  
>  }
>  
>  
> -- 
> Randall Hand
> Visualization Scientist, 
> ERDC-MSRC Vicksburg, MS
> Homepage: http://www.yeraze.com 
> _______________________________________________
> vtk-developers mailing list
> vtk-developers at vtk.org
> http://www.vtk.org/mailman/listinfo/vtk-developers
> 
> 
> 
>



More information about the vtk-developers mailing list