[ITK-users] Writing from an external buffer to VectorImage

Kabelitz, Gordian Gordian.Kabelitz at medma.uni-heidelberg.de
Wed Jun 28 09:51:41 EDT 2017


Hello,

i computed a gradient with my own function and as a result a pointer to an image buffer is provided. I know the size, origin and spacing of the gradient component image.
I want to copy the gradient image into an itk::VectorImage with the components for the x,y,z gradients.

The way I copied the image to the GPU is that I retrieved the buffer pointer from my input image and use the pointer to copy the image data to the GPU.
I used the way proposed in [1]. The computeGradientImage method is listed at the end of this mail.

[...]
// get float pointer to image data
ImageType::Pointer image = reader->GetOutput();
Image->Update();

float* data = image.GetBufferPointer();
// copy image data to GPU texture memory (this works)
gpu_dev->setVoxels(dimension, voxelSize, data); 
[...]
computeGradientImage<<<n,m>>> (dev_gradientImage, dimension);

// copy resulting gradientImage to host variable
float4* host_gradientImage;
cudaMemcpy(host_gradient, dev_gradientImage, numberOfVoxels*sizeof(float4));

--> Pseudo Code <--
// Now I want to reverse the copy process. I have a float4 image and want to copy this into a itk::VectorImage with VariableVectorLength of 3 (skipping the magnitude value).
[...] -> size, spacing, origin, region definition
Itk::VectorImageType vecImage = VectorImageType::New();
vecImage->setRegion(region);
vecImage ->SetVectorLength(3);
vecImage->Allocate();

// copy image buffer to vecImage, component by component 
auto vecBuffer = vecImage->getBufferPointer();
auto j = 0;
for (i=0; i<totalVoxel; ++i)
{
	vecbuffer[j] = host_gradient[i].x; j++;
	vecbuffer[j] = host_gradient[i].y; j++;
	vecbuffer[j] = host_gradient[i].z; j++;
}

// save vecImage as nrrd image
[...]

I haven't found a way to achieve my idea. 
Are there any suggestions or examples?
As far I can see I cannot use the itk::ImportImageFilter.

Thank you for any suggestions.
With kind regards,
Gordian

[1]: https://itk.org/CourseWare/Training/GettingStarted-V.pdf

void computeGradientImage(float4* gradientImage, int* dimension)
{
	// every thread computes the float4 voxel with theta,phi,magnitude from gradient image
	int idx = blockIdx.x * blockDim.x + threadIdx.x;
	int idy = blockIdx.y * blockDim.y + threadIdx.y;
	int idz = blockIdx.z * blockDim.z + threadIdx.z;

	if (idx < dimension[0] && idy < dimension[1] && idz < dimension[2])
	{
		// define sobel filter for each direction
		[...]

		// run sobel on image in texture memory for each direction and put result into a float4 image
		gradientImage[idx + dimension[0] * (idy + idz * dimension[1])] = make_float4(sobelX, sobelY, sobelZ, magn);
	}
}




More information about the Insight-users mailing list