如何解决vtk:如何从世界点获取图像像素索引
如果我从图像中选取一个世界点,如何将世界坐标转换为图像索引?
import vtk
import numpy as np
from vtk.util.numpy_support import numpy_to_vtk
def numpyToVTK(data,multi_component=False,type='float'):
if type == 'float':
data_type = vtk.VTK_FLOAT
elif type == 'char':
data_type = vtk.VTK_UNSIGNED_CHAR
else:
raise RuntimeError('unkNown type')
if multi_component == False:
if len(data.shape) == 2:
data = data[:,:,np.newaxis]
flat_data_array = data.transpose(2,1,0).flatten()
vtk_data = numpy_to_vtk(num_array=flat_data_array,deep=True,array_type=data_type)
shape = data.shape
else:
assert len(data.shape) == 3,'only test for 2D RGB'
flat_data_array = data.transpose(1,2)
flat_data_array = np.reshape(flat_data_array,newshape=[-1,data.shape[2]])
vtk_data = numpy_to_vtk(num_array=flat_data_array,array_type=data_type)
shape = [data.shape[0],data.shape[1],1]
img = vtk.vtkImageData()
img.GetPointData().SetScalars(vtk_data)
img.SetDimensions(shape[0],shape[1],shape[2])
return img
global sphereActor,textActor
sphereActor = None
textActor = None
def mouseMoveEvent(iren,event):
x,y = iren.GetEventPosition()
picker = vtk.vtkWorldPointPicker()
picker.Pick(x,y,render)
worldPoint = picker.GetPickPosition()
##############################################
## convert world point to image index
##############################################
sphere = vtk.vtkSphereSource()
sphere.SetCenter(worldPoint[0],worldPoint[1],worldPoint[2])
sphere.SeTradius(2)
sphere.Update()
sphereMapper = vtk.vtkpolyDataMapper()
sphereMapper.SetInputData(sphere.Getoutput())
global sphereActor,textActor
if sphereActor != None:
render.RemoveActor(sphereActor)
sphereActor = vtk.vtkActor()
sphereActor.SetMapper(sphereMapper)
sphereActor.Getproperty().SetColor(255,0)
render.AddActor(sphereActor)
render.Render()
if textActor != None:
render.RemoveActor(textActor)
textActor = vtk.vtkTextActor()
textActor.SetInput('world coordinate: (%.2f,%.2f,%.2f)'%(worldPoint[0],worldPoint[2]))
textActor.GetTextproperty().SetColor(1,0)
textActor.GetTextproperty().SetFontSize(15)
render.AddActor(textActor)
img = np.zeros(shape=[128,128])
for i in range(128):
for j in range(128):
img[i,j] = i+j
vtkImg = numpyToVTK(img)
imgActor = vtk.vtkImageActor()
imgActor.SetInputData(vtkImg)
render = vtk.vtkRenderer()
render.AddActor(imgActor)
# render.Render()
renWin = vtk.vtkRenderWindow()
renWin.AddRenderer(render)
renWin.Render()
iren = vtk.vtkRenderWindowInteractor()
iren.SetRenderWindow(renWin)
iren.SetInteractorStyle(vtk.vtkInteractorStyletrackballCamera())
iren.Initialize()
iren.Addobserver('MouseMoveEvent',mouseMoveEvent)
iren.Start()
在上面的代码中,如果我不旋转图像,世界点是(x,0):
这与我所知道的一致。对于世界点(x,z)和图像索引(i,j,k),转换应该是:
worldPoint (x,z) = i*spacingX*directionX + j*spacingY*directionY + k*spacingZ*directionZ + originPoint
在上面的代码中,图像是从numpy转换过来的,因此:
directionX = [1,0]
directionY = [0,0]
directionZ = [0,1]
originPoint=[0,0]
spacingX=1
spacingY=1
spacingZ=1
这样,x=i,y=j,z=k
。由于此图像是 2D 图像,因此 k
应为 0,'z' 也应为 0。
然后,我旋转图像,z
不是 0。如下图。
我不知道为什么 z
是 -0.24。
worldPoint (x,z) = i*spacingX*directionX + j*spacingY*directionY + k*spacingZ*directionZ + originPoint
感谢任何建议!
解决方法
vtkImageData 有 TransformPhysicalPointToContinuousIndex 方法,用于从世界空间到图像空间,而 TransformIndexToPhysicalPoint 则相反。
我认为您所做的计算不正确,因为方向是 3x3 旋转矩阵。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。