微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

vtk:如何从世界点获取图像像素索引

如何解决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):

enter image description here

这与我所知道的一致。对于世界点(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。如下图。

enter image description here

我不知道为什么 z 是 -0.24。

表示下面的转换是错误的。以及如何通过世界点获取图像索引?

worldPoint (x,z) = i*spacingX*directionX + j*spacingY*directionY + k*spacingZ*directionZ + originPoint

感谢任何建议!

解决方法

vtkImageData 有 TransformPhysicalPointToContinuousIndex 方法,用于从世界空间到图像空间,而 TransformIndexToPhysicalPoint 则相反。

我认为您所做的计算不正确,因为方向是 3x3 旋转矩阵。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?