Nifti to vtkImageData in memory

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]);
                }