[vtkusers] Volume origin,bounds, extent question

Kall, Bruce A. kall at mayo.edu
Mon Jan 26 16:31:18 EST 2009


I think I answered my own question: vtkImageReslice seems to be what I want.



Kall, Bruce A. wrote:
> Since I've not solved this issue and from what I can tell a large 
> volume in an unstructured grid
> would be slow to volume render, am I better off rotating my volume so 
> it is axis-aligned? Is
> there an easy way to do this in vtk?
>
> Bruce
>
>
> Eric E. Monson wrote:
>> Hey Bruce,
>>
>> I hope that through my ignorance I haven't led you too far astray. I 
>> tried this tonight, too, and can't get it to work. I think I've come 
>> up with the reason, but someone else might want to speak up to 
>> confirm. After swearing for a while I remembered a recent thread on 
>> the VTK mailing list and found at least a possible direction.
>>
>> http://www.vtk.org/pipermail/vtkusers/2008-November/098299.html
>>
>> This says that you can't create a non-axis-aligned vtkImageData. This 
>> would explain why you can't apply a vtkTransformFilter to an 
>> ImageData set -- because most of the transformations would break the 
>> constraints of ImageData. Instead, "You could use a 
>> vtkStructuredGrid. You can place the points of the regular grid 
>> anywhere you like, so it would be easy to construct a rotated grid."
>>
>> I'm a little too tired to work this out tonight, but if you read your 
>> data into a vtkStructuredGrid, you could construct the correct 
>> rotated array right from the beginning. I think you should also be 
>> able to apply a vtkTransformFilter to the structured grid since 
>> vtkPolyData, vtkStructuredGrid and vtkUnstructuredGrid all derive 
>> from vtkPointSet, and vtkTransformFilter derives from 
>> vtkPointSetAlgorithm.
>>
>> Hope I've helped more than hurt,
>> -Eric
>>
>>
>> On Jan 20, 2009, at 4:42 PM, Kall, Bruce A. wrote:
>>
>>> Eric,
>>>
>>> Thanks.  This doesn't seem to have any effect on my volume.  Here's 
>>> a snippet:
>>>
>>>> xform_filter = vtkTransformFilter::New();
>>>> xform_filter_xform = vtkTransform::New();
>>>>
>>>> xform_filter_xform->Identity();
>>>> xform_filter_xform->Translate(0.0,0.0,25.0);
>>>>
>>>> xform_filter->SetInputConnection(original_volume_reader->GetOutputPort()); 
>>>>
>>>> xform_filter->SetTransform(xform_filter_xform);
>>> If I add a xform_filter->Update(), I get the following error:
>>>
>>>> vtkStreamingDemandDrivenPipeline (0x1af4b540): Algorithm 
>>>> vtkTransformFilter(0x1af4b680) returned failure for request: 
>>>> vtkInformation (0x1af4c4a0)
>>>>  Debug: Off
>>>>  Modified Time: 1217
>>>>  Reference Count: 1
>>>>  Registered Events: (none)
>>>>  Request: REQUEST_DATA_OBJECT
>>>>  FORWARD_DIRECTION: 0
>>>>  FROM_OUTPUT_PORT: 0
>>>>  ALGORITHM_AFTER_FORWARD: 1
>>>
>>> I must be missing a step?
>>>
>>> Bruce
>>>
>>>
>>> Eric E. Monson wrote:
>>>> Hey Bruce,
>>>>
>>>> It really doesn't sound like this should be a problem if you're 
>>>> really talking about rotating the whole volume, even by these small 
>>>> amounts. Since this transformation, as you saw before, doesn't fit 
>>>> the definition of a permutation, I think you just need to apply a 
>>>> vtkTransformFilter to your data after the reader pulls it in.
>>>>
>>>> xform = vtkTransform()::New();
>>>> xform->RotateZ(0.6467807);
>>>> xform->RotateX(-0.18608);
>>>> xform->RotateY(-0.49602);
>>>>
>>>> xformFilter = vtkTransformFilter()::New();
>>>> xformFilter->SetInputConnection(original_volume_reader->GetOutputPort()); 
>>>>
>>>> xformFilter->SetTransform(xform);
>>>>
>>>> Talk to you later,
>>>> -Eric
>>>>
>>>>
>>>> On Jan 19, 2009, at 5:04 PM, Kall, Bruce A. wrote:
>>>>
>>>>> Eric,
>>>>>
>>>>> Thanks.  Unfortunately my rotations are quite small (in one 
>>>>> particular volume,
>>>>> rotating about the center of the volume):
>>>>>
>>>>> Rotate around Z by: 0.6467807 degrees
>>>>> Rotate around X by: -0.18608 degrees
>>>>> Rotate around Y by: -0.49602 degrees
>>>>>
>>>>> It's enough though that if not done, coordinates of voxels on the 
>>>>> other
>>>>> side of the volume are incorrect (using an origin of lower left in 
>>>>> vtk). Seems
>>>>> like vtk just increments each voxel by the spacing to get from
>>>>> the lower left to the upper right coordinate. But even with these 
>>>>> small angular
>>>>> rotations, over a 256x256x86 volume with a voxel size of 0.977 it 
>>>>> puts
>>>>> me off by about 3mm on the other size from what coordinates are 
>>>>> supposed to be.
>>>>>
>>>>> Any other suggestions?
>>>>>
>>>>> Bruce
>>>>>
>>>>>
>>>>>
>>>>> Eric E. Monson wrote:
>>>>>> Hey Bruce,
>>>>>>
>>>>>> (try to keep the discussion on-list)
>>>>>>
>>>>>> So what is your original align_matrix[][] -- is the issue that 
>>>>>> it's being changed after you assign the values to "matrix"?
>>>>>>
>>>>>> My suggestion was to use vtkTransform itself to calculate the 
>>>>>> transformation matrix. If you only do rotations in 90 degree 
>>>>>> increments and scalings of +/- 1, then the matrix will still be a 
>>>>>> permutation matrix. As I understand it, there is nothing that 
>>>>>> forces the transformation matrix in vtkTransform to be a 
>>>>>> permutation matrix, though, since it can do "a full range of 
>>>>>> linear (also known as affine) coordinate transformations in three 
>>>>>> dimesions". SetTransform() requires a permutation matrix, though, 
>>>>>> and I'm not sure how that is enforced.
>>>>>>
>>>>>> e.g. If you do:
>>>>>>
>>>>>> xform = vtk.vtkTransform()::New();
>>>>>> xform->RotateX(90);
>>>>>> xform->Scale(1, 1, -1);
>>>>>>
>>>>>> the matrix will be:
>>>>>>
>>>>>>       1 0 0 0
>>>>>>       0 -1.99673e-16 1 0
>>>>>>       0 1 1.99673e-16 0
>>>>>>       0 0 0 1
>>>>>>
>>>>>> Which would hopefully still qualify for the SetTransform() input.
>>>>>>
>>>>>> -Eric
>>>>>>
>>>>>>
>>>>>> On Jan 19, 2009, at 1:23 PM, Kall, Bruce A. wrote:
>>>>>>
>>>>>>> Eric,
>>>>>>>
>>>>>>> Thanks.  I think this is what I tried, but what I am getting 
>>>>>>> back after the SetTransform is the same xform
>>>>>>> which is not a permutation matrix (e.g., sum in all rows is 
>>>>>>> 1.0).  Is there some step I am missing? I'm sending
>>>>>>> in my matrix (I called it align_matrix which is  double 
>>>>>>> align_matrix[4][4]) and then read back what my image
>>>>>>> reader has:
>>>>>>>
>>>>>>> Here's a code snippet right after I've calculated the transform 
>>>>>>> I want:
>>>>>>>
>>>>>>>> matrix = vtkMatrix4x4::New();
>>>>>>>> matrix->Identity();
>>>>>>>>
>>>>>>>> fprintf(stderr,"Setting VTK Matrix to align_matrix\n");
>>>>>>>> for(i = 0; i < 4; i++)
>>>>>>>> {
>>>>>>>> for(j = 0; j < 4; j++)
>>>>>>>>  {
>>>>>>>>  matrix->SetElement(i,j,align_matrix[i][j]);
>>>>>>>>  }
>>>>>>>> }
>>>>>>>>
>>>>>>>> printf("\n\n");
>>>>>>>> printf("FINAL VTK MATRIX Before Install\n");
>>>>>>>> for(i = 0;i < 4;i++)
>>>>>>>> {
>>>>>>>> for(j = 0;j < 4;j++)
>>>>>>>>  {
>>>>>>>>  e = matrix->GetElement(i,j);
>>>>>>>>  fprintf(stderr,"%12.5f  ",e);
>>>>>>>>  }
>>>>>>>> printf("\n");
>>>>>>>> }
>>>>>>>> printf("\n\n");
>>>>>>>>
>>>>>>>>
>>>>>>>> xform = vtkTransform::New();
>>>>>>>> xform->SetMatrix(matrix);
>>>>>>>> original_volume_reader->SetTransform(xform);
>>>>>>>> original_volume_reader->Update();
>>>>>>>>
>>>>>>>> vtkTransform *read_back_xform = 
>>>>>>>> original_volume_reader->GetTransform();
>>>>>>>> vtkMatrix4x4 *read_back_matrix = read_back_xform->GetMatrix();
>>>>>>>>
>>>>>>>> printf("\n\n");
>>>>>>>> printf("Image Reader Transform\n");
>>>>>>>> double row_sum;
>>>>>>>> for(i = 0;i < 4;i++)
>>>>>>>> {
>>>>>>>> row_sum = 0.0;
>>>>>>>> for(j = 0;j < 4;j++)
>>>>>>>>  {
>>>>>>>>  e = read_back_matrix->GetElement(i,j);
>>>>>>>>  row_sum = row_sum + e;
>>>>>>>>  fprintf(stderr,"%12.5f  ",e);
>>>>>>>>  }
>>>>>>>> printf("     row_sum[%12.5f]\n",row_sum);
>>>>>>>> }
>>>>>>>> printf("\n\n");
>>>>>>>>
>>>>>>> and this is the output I get:
>>>>>>>
>>>>>>> Setting VTK Matrix to align_matrix
>>>>>>>
>>>>>>>
>>>>>>> FINAL VTK Affine MATRIX Before Install
>>>>>>>  0.99990       0.01129      -0.00862       0.00000    
>>>>>>> -0.01126       0.99993       0.00335       0.00000     
>>>>>>> 0.00866      -0.00325       0.99996       0.00000    
>>>>>>> -1.05445       1.22598      -0.63108       1.00000
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Image Reader Transform
>>>>>>>  0.99990       0.01129      -0.00862       0.00000       
>>>>>>> row_sum[     1.00257]
>>>>>>> -0.01126       0.99993       0.00335       0.00000       
>>>>>>> row_sum[     0.99202]
>>>>>>>  0.00866      -0.00325       0.99996       0.00000       
>>>>>>> row_sum[     1.00537]
>>>>>>> -1.05445       1.22598      -0.63108       1.00000       
>>>>>>> row_sum[     0.54045]
>>>>>>>
>>>>>>> My image volume is now a bunch of dots. If I send in an identity 
>>>>>>> matrix, it renders
>>>>>>> correctly, but with the wrong coordinates.
>>>>>>>
>>>>>>> Am I missing a step that converts the matrix into a permutation 
>>>>>>> matrix?
>>>>>>>
>>>>>>> Thanks in advance for any suggestions,
>>>>>>> Bruce
>>>>>>>
>>>>>>>
>>>>>>>
>>>>>>> Eric E. Monson wrote:
>>>>>>>> Hey Bruce,
>>>>>>>>
>>>>>>>> I'm not an expert in this, but it looks like you can create a 
>>>>>>>> vtkTransform object, set the rotation and translation on that 
>>>>>>>> object, and then feed this to the SetTransform method of your 
>>>>>>>> reader. This makes it easy to construct the required 
>>>>>>>> permutation matrix using a more intuitive interface (as long as 
>>>>>>>> what you're trying to do is really an affine transformation).
>>>>>>>>
>>>>>>>> Talk to you later,
>>>>>>>> -Eric
>>>>>>>>
>>>>>>>> ------------------------------------------------------
>>>>>>>> Eric E Monson
>>>>>>>> Duke Visualization Technology Group
>>>>>>>>
>>>>>>>>
>>>>>>>> On Jan 16, 2009, at 4:47 PM, Kall, Bruce A. wrote:
>>>>>>>>
>>>>>>>>> Anybody have any thoughts on my question from the other day?
>>>>>>>>> The only thing I can find in vtkImageReader is the SetTransform
>>>>>>>>> but that has to be a permutation matrix.  I need to 
>>>>>>>>> rotate/translate.
>>>>>>>>> I've got the transform calculated, I just don't know where to 
>>>>>>>>> apply it.
>>>>>>>>>
>>>>>>>>> Thanks,
>>>>>>>>> Bruce
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>> I'm reading in a premade (raw) image volume. I know the voxel 
>>>>>>>>>> size (same for all dimensions) as
>>>>>>>>>> well as the coordinates of all 8 corners of the volume.  I'm 
>>>>>>>>>> using vtkImageReader.
>>>>>>>>>>
>>>>>>>>>> This only seems to allow me to set the coordinate of the 
>>>>>>>>>> lower left voxel and the voxel size.
>>>>>>>>>>
>>>>>>>>>> How do you set the coordinate for another corner (e.g., upper 
>>>>>>>>>> right) so the coordinates
>>>>>>>>>> run in the direction I want using the fixed voxel size I 
>>>>>>>>>> have?  Right now it seems to just
>>>>>>>>>> increment in the x,y,z dimensions by the voxel size and the 
>>>>>>>>>> coordinate of the upper right
>>>>>>>>>> is not correct (my volume is slightly oblique for lack of a 
>>>>>>>>>> better phrase).
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> This is the private VTK discussion list.
>>>>>>>>>> Please keep messages on-topic. Check the FAQ at: 
>>>>>>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>>>>>>> Follow this link to subscribe/unsubscribe:
>>>>>>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>>>>>>>
>>>>>>>>> _______________________________________________
>>>>>>>>> This is the private VTK discussion list.
>>>>>>>>> Please keep messages on-topic. Check the FAQ at: 
>>>>>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>>>>>> Follow this link to subscribe/unsubscribe:
>>>>>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>>>>>
>>>>>>>>
>>>>>>
>>>>>>
>>>>> _______________________________________________
>>>>> This is the private VTK discussion list.
>>>>> Please keep messages on-topic. Check the FAQ at: 
>>>>> http://www.vtk.org/Wiki/VTK_FAQ
>>>>> Follow this link to subscribe/unsubscribe:
>>>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>>>
>>>>
>>> _______________________________________________
>>> This is the private VTK discussion list.
>>> Please keep messages on-topic. Check the FAQ at: 
>>> http://www.vtk.org/Wiki/VTK_FAQ
>>> Follow this link to subscribe/unsubscribe:
>>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>>
> _______________________________________________
> This is the private VTK discussion list.
> Please keep messages on-topic. Check the FAQ at: 
> http://www.vtk.org/Wiki/VTK_FAQ
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>



More information about the vtkusers mailing list