Thanks, just gave it a go. Think I’m pretty close - my current workflow is to convert nifti
to vtkImageData
, use the vtkGridTransform
and then fill back to nifti
at the end.
However, GetScalarComponentAsFloat
at the end is causing a segfault (for the first index 0,0,0,0). Does this mean I haven’t called Update
correctly? Sorry if it’s a basic question, not sure how to debug this one.
Thanks
const int *dims = this->dim;
const float *spacing = this->pixdim;
using vtkImage = vtkSmartPointer<vtkImageData>;
using vtkTransform = vtkSmartPointer<vtkGridTransform>;
vtkImage image_data_sptr = vtkImage::New();
image_data_sptr->SetDimensions(dims[1],dims[2],dims[3]);
image_data_sptr->SetSpacing(spacing[1],spacing[2],spacing[3]);
image_data_sptr->AllocateScalars(VTK_FLOAT,dims[5]);
int idx[7] = {0, 0, 0, 0, 0, 0, 0};
for (idx[0]=0; idx[0]<dims[1]; ++idx[0])
for (idx[1]=0; idx[1]<dims[2]; ++idx[1])
for (idx[2]=0; idx[2]<dims[3]; ++idx[2])
for (idx[4]=0; idx[4]<dims[5]; ++idx[4]) // t is 3, skip to 4 for tensor component
image_data_sptr->SetScalarComponentFromFloat(
idx[0],idx[1],idx[2],idx[4],(*this)(idx));
vtkTransform transform_sptr = vtkTransform::New();
transform_sptr->SetDisplacementGridData(image_data_sptr);
transform_sptr->Update();
vtkTransform inverse_transform_sptr =
vtkGridTransform::SafeDownCast(transform_sptr->GetInverse());
vtkImage inverse_image = inverse_transform_sptr->GetDisplacementGrid();
NiftiImageData3DDisplacement<float> output = *this->clone();
for (idx[0]=0; idx[0]<dims[1]; ++idx[0])
for (idx[1]=0; idx[1]<dims[2]; ++idx[1])
for (idx[2]=0; idx[2]<dims[3]; ++idx[2])
for (idx[4]=0; idx[4]<dims[5]; ++idx[4]) {// t is 3, skip to 4 for tensor component
// this line segfaults at 0,0,0,0
inverse_image->GetScalarComponentAsFloat(idx[0],idx[1],idx[2],idx[4]);
// output(idx) = inverse_image->GetScalarComponentAsFloat(idx[0],idx[1],idx[2],idx[4]);
}