How to convert the coordinate between pixel and physical (vtkImageReslice)?

久未见 提交于 2019-12-11 15:51:28

问题


I reslice a 2D image from a 3D volume image by vtkImageReslice. Then, I convert the image (matrix) from vtkImageReslice.GetOutput(). My question is: for one pixel (x, y) in image, what's the coordinate in 3D volume?

I have found a solution to convert the coordinate from vtkImageReslice to 3D volume: vtkImageReslice.GetResliceAxes().MultiplyPoint().

However, how to convert the coordinate from pixel to vtkImageReslice? The vtkImageReslice need two inputs: the axes and center point. However, I find that some different center point would have the same output. And my test code is:

from vtk.util.numpy_support import vtk_to_numpy, numpy_to_vtk 
import vtk 
import numpy as np 

def vtkToNumpy(data): 
    temp = vtk_to_numpy(data.GetPointData().GetScalars()) 
    dims = data.GetDimensions() 
    numpy_data = temp.reshape(dims[2], dims[1], dims[0]) 
    numpy_data = numpy_data.transpose(2,1,0) 
    return numpy_data 

def numpyToVTK(data): 
    flat_data_array = data.transpose(2,1,0).flatten() 
    vtk_data_array = numpy_to_vtk(flat_data_array) 
    vtk_data = numpy_to_vtk(num_array=vtk_data_array, deep=True, array_type=vtk.VTK_FLOAT) 
    img = vtk.vtkImageData() 
    img.GetPointData().SetScalars(vtk_data) 
    img.SetDimensions(data.shape) 
    return img 

img = np.zeros(shape=[512,512,120]) 
img[0:300,0:100,:] = 1 

vtkImg = numpyToVTK(img) 

reslice = vtk.vtkImageReslice() 
reslice.SetInputData(vtkImg) 
reslice.SetAutoCropOutput(True) 
reslice.SetOutputDimensionality(2) 
reslice.SetInterpolationModeToCubic() 
reslice.SetSlabNumberOfSlices(1) 
reslice.SetOutputSpacing(1.0,1.0,1.0) 

axialElement = [ 
    1, 0, 0, 256, 
    0, 1, 0, 1000, 
    0, 0, 1, 100, 
    0, 0, 0, 1 
] 
resliceAxes = vtk.vtkMatrix4x4() 
resliceAxes.DeepCopy(axialElement) 
reslice.SetResliceAxes(resliceAxes) 
reslice.Update() 

reslicedImg = reslice.GetOutput() 
reslicedNpImg = vtkToNumpy(reslicedImg) 
import matplotlib.pyplot as plt 
plt.figure() 
plt.imshow(reslicedNpImg[:,:,0]) 
plt.show() 

In the above code, the center point is (256,1000,100). Actually, this center point is outside of the original image (512,512,120), but the output is fine. And the center point (256, x, 100) would output the same image no matter what the x is. By the way, how to get the pixel index (x, y) for the center point in the resliced image.

So, for a pixel (x, y) in reslicedNpImg, how to obtain the coordinate in 3D image?

Thank you very much in advance!

来源:https://stackoverflow.com/questions/57130558/how-to-convert-the-coordinate-between-pixel-and-physical-vtkimagereslice

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!