Beispiel #1
0
data = data[46:]
data = data.astype(np.uint8)

# n_data = []
# length = int(spacing[2])-1
# spacing = (spacing[0],spacing[1],1.0)
# for i in range(data.shape[0]-1):
#     n_data.append(data[i])
#     for j in range(length):
#         temp = cv2.resize(data[i],(512+10*(j+1),512+10*(j+1)))
#         temp = temp[5*(j+1):-5*(j+1),5*(j+1):-5*(j+1)]
#         n_data.append(temp)
# n_data = np.array(n_data)
#

img_arr = vtkImageImportFromArray()
img_arr.SetArray(data)
img_arr.SetDataSpacing(spacing)
origin = (0, 0, 0)
img_arr.SetDataOrigin(origin)
img_arr.Update()
srange = img_arr.GetOutput().GetScalarRange()

print('spacing: ', spacing)
print('srange: ', srange)

# def StartInteraction():
#     renWin.SetDesiredUpdateRate(10)
#
# def EndInteraction():
#     renWin.SetDesiredUpdateRate(0.001)
Beispiel #2
0
sum = 0
for i,iindex in enumerate(data):
    for j,jindex in enumerate(data[i]):
        for k,kindex in enumerate(data[i][j]):
            sum = sum + 1
            if data[i][j][k] < 1129:
                data[i][j][k] = -1024
time_end=time.time()
print('time cost',time_end-time_start,'s')'''

spacing = ds.GetSpacing()  #三维数据的间隔
print('spacing_of_data', spacing)
srange = [np.min(data), np.max(data)]
print('srange1: ', srange)
print('shape_of_data_chenged', data.shape)
img_arr = vtkImageImportFromArray()  #创建一个空的vtk类-----vtkImageImportFromArray
print('img_arr: ', img_arr)
img_arr.SetArray(data)  #把array_data塞到vtkImageImportFromArray(array_data)
img_arr.SetDataSpacing(spacing)  #设置spacing
origin = (0, 0, 0)
img_arr.SetDataOrigin(origin)  #设置vtk数据的坐标系原点
img_arr.Update()
srange = img_arr.GetOutput().GetScalarRange()

print('spacing: ', spacing)
print('srange2: ', srange)


# 键盘控制交互式操作
class KeyPressInteractorStyle(vtk.vtkInteractorStyleTrackballCamera):
    def __init__(self, parent=None):
def main():
    args = get_program_parameters()

    # create the color table
    colors = vtk.vtkNamedColors()
    colors.SetColor("surfColor", args.colorsurf)
    colors.SetColor("BkgColor", args.colorbkg)

    # Create the renderer, the render window, and the interactor. The renderer
    # draws into the render window, the interactor enables mouse- and
    # keyboard-based interaction with the data within the render window.
    #
    aRenderer = vtk.vtkRenderer()
    renWin = vtk.vtkRenderWindow()
    renWin.AddRenderer(aRenderer)

    iren = vtk.vtkRenderWindowInteractor()
    iren.SetRenderWindow(renWin)

    if not args.filename:
        print("Must input a volume data to read!")
        return 

    if args.CT:
        volArray = numpy.fromfile(args.filename,dtype=numpy.dtype('float32'))
        volArray = volArray.reshape((args.D[2],args.D[1],args.D[0]))
        volArray = rescale(volArray, args.resize, anti_aliasing=True)
    elif args.US:
        volArray = scio.loadmat(args.filename)
        #volArray = h5py.File(args.filename,'r')
        volArray = numpy.asarray(volArray['usData'], order='C')
    else:
        print("Must choose CT or US!") 
        return   

    importer = vtkImageImportFromArray()
    importer.SetArray(volArray)
    importer.Update() 
    print("Finish loading data.")

    # An isosurface, or contour value of 500 is known to correspond to the
    # skin of the patient.
    Extractor = vtk.vtkMarchingCubes()
    Extractor.SetInputConnection(importer.GetOutputPort())
    #Extractor.SetValue(0, args.isovalue)
    if args.isovalue:
    	Extractor.SetValue(0, args.isovalue)
    else:
    	Extractor.SetValue(0,numpy.max(volArray)*0.2)
    
    if args.savename:
        plyWriter = vtk.vtkPLYWriter()
        plyWriter.SetFileName(args.savename)
        plyWriter.SetInputConnection(Extractor.GetOutputPort())
        plyWriter.Write()
        
    if args.np:
        return

    print("Start rendering.")
    Mapper = vtk.vtkPolyDataMapper()
    Mapper.SetInputConnection(Extractor.GetOutputPort())
    Mapper.ScalarVisibilityOff()

    surf = vtk.vtkActor()
    surf.SetMapper(Mapper)
    surf.GetProperty().SetDiffuseColor(colors.GetColor3d("surfColor"))

    # An outline provides context around the data.
    #
    outlineData = vtk.vtkOutlineFilter()
    outlineData.SetInputConnection(importer.GetOutputPort())

    mapOutline = vtk.vtkPolyDataMapper()
    mapOutline.SetInputConnection(outlineData.GetOutputPort())

    outline = vtk.vtkActor()
    outline.SetMapper(mapOutline)
    outline.GetProperty().SetColor(colors.GetColor3d("Black"))


    # It is convenient to create an initial view of the data. The FocalPoint
    # and Position form a vector direction. Later on (ResetCamera() method)
    # this vector is used to position the camera to look at the data in
    # this direction.
    aCamera = vtk.vtkCamera()
    aCamera.SetViewUp(0, 0, -1)
    aCamera.SetPosition(0, -1, 0)
    aCamera.SetFocalPoint(0, 0, 0)
    aCamera.ComputeViewPlaneNormal()
    aCamera.Azimuth(30.0)
    aCamera.Elevation(30.0)

    # Actors are added to the renderer. An initial camera view is created.
    # The Dolly() method moves the camera towards the FocalPoint,
    # thereby enlarging the image.
    aRenderer.AddActor(outline)
    aRenderer.AddActor(surf)
    aRenderer.SetActiveCamera(aCamera)
    aRenderer.ResetCamera()
    aCamera.Dolly(1.5)

    # Set a background color for the renderer and set the size of the
    # render window (expressed in pixels).
    aRenderer.SetBackground(colors.GetColor3d("BkgColor"))
    renWin.SetSize(640, 480)

    # Note that when camera movement occurs (as it does in the Dolly()
    # method), the clipping planes often need adjusting. Clipping planes
    # consist of two planes: near and far along the view direction. The
    # near plane clips out objects in front of the plane the far plane
    # clips out objects behind the plane. This way only what is drawn
    # between the planes is actually rendered.
    aRenderer.ResetCameraClippingRange()

    # Initialize the event loop and then start it.
    iren.Initialize()
    iren.Start()
Beispiel #4
0
    def vtk_mhd(self):
        path = self.nii_path[0]  # segmentation volume
        # ds = sitk.ReadImage(path)  # 读取nii数据的第一个函数sitk.ReadImage
        # self.narry_3d = sitk.GetArrayFromImage(ds)  # 把itk.image转为array

        self.narry_3d = np.ascontiguousarray(self.narry_3d)
        self.narry_3d = np.where(self.narry_3d > -320, -1024, self.narry_3d)

        spacing = self.ds.GetSpacing()  # 三维数据的间隔
        srange = [np.min(self.narry_3d), np.max(self.narry_3d)]
        img_arr = vtkImageImportFromArray(
        )  # 创建一个空的vtk类-----vtkImageImportFromArray
        img_arr.SetArray(
            self.narry_3d)  # 把array_data塞到vtkImageImportFromArray(array_data)
        img_arr.SetDataSpacing(spacing)  # 设置spacing
        origin = (0, 0, 0)
        img_arr.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
        img_arr.Update()
        srange = img_arr.GetOutput().GetScalarRange()

        ren = vtk.vtkRenderer()
        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren)  # 把一个空的渲染器添加到一个空的窗口上
        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)  # 把上面那个窗口加入交互操作
        iren.SetInteractorStyle(
            KeyPressInteractorStyle(parent=iren))  # 在交互操作里面添加这个自定义的操作例如up,down

        min = srange[0]
        max = srange[1]
        diff = max - min  # 体数据极差
        inter = 1400 / diff
        shift = -min  # 可以加,不能减,人体内外分割处
        print(min, max, inter, shift)  # 这几个数据后面有用

        shifter = vtk.vtkImageShiftScale(
        )  # 对偏移和比例参数来对图像数据进行操作 数据转换,之后直接调用shifter
        shifter.SetShift(shift)
        shifter.SetScale(inter)
        shifter.SetOutputScalarTypeToUnsignedShort()
        shifter.SetInputData(img_arr.GetOutput())
        shifter.ReleaseDataFlagOff()
        shifter.Update()

        tfun = vtk.vtkPiecewiseFunction()  # 不透明度传输函数---放在tfun
        tfun.AddPoint(1129, 0)  # 不切片时配置
        tfun.AddPoint(1300.0, 0.1)
        tfun.AddPoint(1600.0, 0.12)
        tfun.AddPoint(2000.0, 0.14)
        tfun.AddPoint(2200.0, 0.16)
        tfun.AddPoint(2500.0, 0.18)
        tfun.AddPoint(2800.0, 0.20)
        tfun.AddPoint(3000.0, 0.22)

        gradtfun = vtk.vtkPiecewiseFunction()  # 梯度不透明度函数---放在gradtfun
        gradtfun.AddPoint(-1500, 1)
        gradtfun.AddPoint(-500, 1)
        gradtfun.AddPoint(0, 2)
        gradtfun.AddPoint(500, 1)
        gradtfun.AddPoint(1500, 2)

        ctfun = vtk.vtkColorTransferFunction()  # 颜色传输函数---放在ctfun
        ctfun.AddRGBPoint(0.0, 1.0, 1.0, 0.0)  # 绿色模型配置
        ctfun.AddRGBPoint(600.0, 0.5, 1.0, 0.5)
        ctfun.AddRGBPoint(1280.0, 0.2, 0.9, 0.3)
        ctfun.AddRGBPoint(1960.0, 0.27, 0.81, 0.1)
        ctfun.AddRGBPoint(2200.0, 0.2, 0.9, 0.3)
        ctfun.AddRGBPoint(2500.0, 0.5, 1.0, 0.5)
        ctfun.AddRGBPoint(3024.0, 0.5, 0.5, 0.5)

        volumeMapper = vtk.vtkGPUVolumeRayCastMapper(
        )  # 映射器volumnMapper使用vtk的管线投影算法
        volumeMapper.SetInputData(
            shifter.GetOutput())  # 向映射器中输入数据:shifter(预处理之后的数据)
        volumeProperty = vtk.vtkVolumeProperty()  # 创建vtk属性存放器,向属性存放器中存放颜色和透明度
        volumeProperty.SetColor(ctfun)
        volumeProperty.SetScalarOpacity(tfun)
        volumeProperty.SetInterpolationTypeToLinear()  # ???
        volumeProperty.ShadeOn()

        newvol = vtk.vtkVolume()  # 演员
        newvol.SetMapper(volumeMapper)
        newvol.SetProperty(volumeProperty)

        outline = vtk.vtkOutlineFilter()
        outline.SetInputConnection(shifter.GetOutputPort())

        outlineMapper = vtk.vtkPolyDataMapper()
        outlineMapper.SetInputConnection(outline.GetOutputPort())

        outlineActor = vtk.vtkActor()
        outlineActor.SetMapper(outlineMapper)  #######
        outlineActor.GetProperty().SetColor(1, 0, 0)

        ren.AddActor(outlineActor)
        ren.AddVolume(newvol)
        ren.SetBackground(1.0, 0.9, 0.9)  # 设置背景颜色,RGB
        ren.SetBackground2(1.0, 1.0, 1.0)  # 设置第二个背景颜色
        ren.SetGradientBackground(1)  # 背景颜色渐变
        renWin.SetSize(800, 700)

        planes = vtk.vtkPlanes()

        boxWidget = vtk.vtkBoxWidget()
        boxWidget.SetInteractor(iren)
        boxWidget.SetPlaceFactor(1.0)
        boxWidget.PlaceWidget(0, 0, 0, 0, 0, 0)
        boxWidget.InsideOutOn()
        '''boxWidget.AddObserver("StartInteractionEvent", StartInteraction)
        boxWidget.AddObserver("InteractionEvent",  ClipVolumeRender)
        boxWidget.AddObserver("EndInteractionEvent",  EndInteraction)'''

        outlineProperty = boxWidget.GetOutlineProperty()
        outlineProperty.SetRepresentationToWireframe()
        outlineProperty.SetAmbient(1.0)
        outlineProperty.SetAmbientColor(1.0, 1.0, 1.0)
        outlineProperty.SetLineWidth(9)

        selectedOutlineProperty = boxWidget.GetSelectedOutlineProperty()
        selectedOutlineProperty.SetRepresentationToWireframe()
        selectedOutlineProperty.SetAmbient(1.0)
        selectedOutlineProperty.SetAmbientColor(1, 0, 0)
        selectedOutlineProperty.SetLineWidth(3)

        ren.ResetCamera()
        iren.Initialize()
        renWin.Render()
        iren.SetInteractorStyle(MyEvent())
        renWin.SetWindowName("Medical Image Air V1.0")
        iren.Start()
Beispiel #5
0
    def vtk_test(self):
        global plane
        global m_pPlaneWidget
        global volumeMapper2
        global clippingVolume

        def my_call_back(pWidget, ev):
            # 表示当pWidget控件改变时,触发函数,监听函数
            if (pWidget):
                print(pWidget.GetClassName(), "Event Id:", ev)
            m_pPlaneWidget.GetPlane(plane)
            volumeMapper2.AddClippingPlane(plane)
            clippingVolume.SetMapper(volumeMapper2)
            print("Plane Normal = " + str(plane.GetNormal()))
            print("Plane Origin = " + str(plane.GetOrigin()))

        data = sitk.GetArrayFromImage(self.ds) + self.npz_data * 3000
        min5 = sitk.GetArrayFromImage(self.ds).min()
        max5 = sitk.GetArrayFromImage(self.ds).max()
        print(min5, max5)
        data = data[:, :, :]
        data = np.ascontiguousarray(data)

        spacing = self.ds.GetSpacing()  # 三维数据的间隔
        img_arr = vtkImageImportFromArray(
        )  # 创建一个空的vtk类-----vtkImageImportFromArray
        img_arr.SetArray(
            data)  # 把array_data塞到vtkImageImportFromArray(array_data)
        img_arr.SetDataSpacing(spacing)  # 设置spacing
        origin = (0, 0, 0)
        img_arr.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
        img_arr.Update()
        srange = img_arr.GetOutput().GetScalarRange()

        min = min5
        max = max5 + 300
        diff = max - min  # 体数据极差
        inter = 4000 / diff
        shift = -min  # 可以加,不能减,人体内外分割处

        ren1 = vtk.vtkRenderer()
        ren1.SetViewport(0, 0.5, 0.5, 1.0)  # 设置窗口大小
        ren1.SetBackground(1.0, 0.9, 0.9)  # 设置背景颜色,RGB
        ren1.SetBackground2(1.0, 1.0, 1.0)  # 设置第二个背景颜色
        ren1.SetGradientBackground(1)  # 背景颜色渐变
        ren1.ResetCameraClippingRange()

        renWin = vtk.vtkRenderWindow()
        renWin.AddRenderer(ren1)  # 把一个空的渲染器添加到一个空的窗口上
        renWin.SetSize(2800, 1680)

        iren = vtk.vtkRenderWindowInteractor()
        iren.SetRenderWindow(renWin)
        style = vtk.vtkInteractorStyleTrackballCamera()
        iren.SetInteractorStyle(style)

        shifter = vtk.vtkImageShiftScale(
        )  # 对偏移和比例参数来对图像数据进行操作 数据转换,之后直接调用shifter
        shifter.SetShift(shift)
        shifter.SetScale(inter)
        shifter.SetOutputScalarTypeToUnsignedShort()
        shifter.SetInputData(img_arr.GetOutput())
        shifter.ReleaseDataFlagOff()
        shifter.Update()

        tfun = vtk.vtkPiecewiseFunction()  # 不透明度传输函数---放在tfun
        tfun.AddPoint(1129, 0)  # 不切片时配置
        tfun.AddPoint(1300.0, 0.02)
        tfun.AddPoint(1600.0, 0.03)
        tfun.AddPoint(2000.0, 0.04)
        tfun.AddPoint(2200.0, 0.05)
        tfun.AddPoint(2500.0, 0.09)
        tfun.AddPoint(2800.0, 0.1)
        tfun.AddPoint(3000.0, 0.11)
        '''tfun.AddPoint(1129, 0)  # 不切片时配置
        tfun.AddPoint(1300.0, 0.02)
        tfun.AddPoint(1600.0, 0.03)
        tfun.AddPoint(2000.0, 0.04)
        tfun.AddPoint(2200.0, 0.05)
        tfun.AddPoint(2500.0, 0.2)
        tfun.AddPoint(2800.0, 0.3)
        tfun.AddPoint(3000.0, 0.4)'''

        gradtfun = vtk.vtkPiecewiseFunction(
        )  # 梯度不透明度函数---放在gradtfun,目前还没有加???
        gradtfun.AddPoint(-1000, 8)
        gradtfun.AddPoint(0.5, 9)
        gradtfun.AddPoint(1, 10)

        ctfun = vtk.vtkColorTransferFunction()  # 颜色传输函数---放在ctfun
        # ctfun.AddRGBPoint(0.0, 0.2, 1.0, 1.0)  # 蓝色模型配置
        # ctfun.AddRGBPoint(600.0, 0.4, 0.6, 1.0)
        # ctfun.AddRGBPoint(1280.0, 0.4, 0.3, 1.0)
        # ctfun.AddRGBPoint(1960.0, 0.2, 0.37, 0.91)
        # ctfun.AddRGBPoint(2200.0, 0.4, 0.3, 1.0)
        # ctfun.AddRGBPoint(2500.0, 0.4, 0.6, 1.0)
        # ctfun.AddRGBPoint(3024.0, 0.6, 0.6, 0.6)
        ctfun.AddRGBPoint(900.0, 0.8, 0.8, 0.8)
        ctfun.AddRGBPoint(1900.0, 0.8, 0.8, 0.8)
        ctfun.AddRGBPoint(2800.0, 0.8, 0.8, 0.8)
        ctfun.AddRGBPoint(3600.0, 1.0, 0.2, 0.2)

        volumeMapper = vtk.vtkGPUVolumeRayCastMapper(
        )  # 映射器volumnMapper使用vtk的管线投影算法
        volumeMapper.SetInputData(
            shifter.GetOutput())  # 向映射器中输入数据:shifter(预处理之后的数据)
        volumeProperty = vtk.vtkVolumeProperty()  # 创建vtk属性存放器,向属性存放器中存放颜色和透明度
        volumeProperty.SetColor(ctfun)
        volumeProperty.SetScalarOpacity(tfun)
        # volumeProperty.SetGradientOpacity(gradtfun)
        volumeProperty.SetInterpolationTypeToLinear()  # ???
        volumeProperty.ShadeOn()

        outline1 = vtk.vtkOutlineFilter()
        outline1.SetInputConnection(shifter.GetOutputPort())

        outlineMapper1 = vtk.vtkPolyDataMapper()
        outlineMapper1.SetInputConnection(outline1.GetOutputPort())
        outlineMapper1.ScalarVisibilityOff()

        outlineActor1 = vtk.vtkActor()
        outlineActor1.SetMapper(outlineMapper1)
        outlineActor1.GetProperty().SetColor(1, 0, 0)  ########第一个容器配置完成

        newvol = vtk.vtkVolume()  # 演员
        newvol.SetMapper(volumeMapper)
        newvol.SetProperty(volumeProperty)

        aCamera = vtk.vtkCamera()  # 设置相机,参数不是很懂
        aCamera.SetViewUp(0, 0, 1)
        aCamera.SetPosition(0, -1, 0)
        aCamera.SetFocalPoint(0, 0, 0)
        aCamera.ComputeViewPlaneNormal()
        aCamera.Azimuth(30.0)
        aCamera.Elevation(30.0)
        aCamera.Dolly(1.5)

        ren1.AddActor(outlineActor1)  # 添加演员和外壳
        ren1.AddVolume(newvol)
        ren1.SetActiveCamera(aCamera)
        ren1.ResetCamera()

        # 设置切割的模型
        volumeMapper2 = vtk.vtkGPUVolumeRayCastMapper()
        volumeMapper2.SetInputData(shifter.GetOutput())

        m_pPlaneWidget = vtk.vtkPlaneWidget()  # 设置隐平面
        m_pPlaneWidget.SetInteractor(iren)  # 与交互器关联
        m_pPlaneWidget.SetInputData(shifter.GetOutput())  # 设置数据集,用于初始化平面,可以不设置
        m_pPlaneWidget.SetResolution(80)  # 即:设置网格数
        m_pPlaneWidget.GetPlaneProperty().SetColor(.2, .8, 0.1)  # 设置颜色
        m_pPlaneWidget.GetPlaneProperty().SetOpacity(0.5)  # 设置透明度
        m_pPlaneWidget.GetHandleProperty().SetColor(0, .4, .7)  # 设置平面顶点颜色
        m_pPlaneWidget.GetHandleProperty().SetLineWidth(2)  # 设置平面线宽
        m_pPlaneWidget.NormalToZAxisOn()  # 初始法线方向平行于Z轴
        # m_pPlaneWidget.SetRepresentationToWireframe()  #平面显示为网格属性
        # m_pPlaneWidget.SetCenter(newvol.GetCenter())    #设置平面坐标
        # m_pPlaneWidget.SetInteractor(renWin.GetInteractor() )    #与交互器关联,感觉同上
        # m_pPlaneWidget.SetPlaceFactor(0.75)  # 设置控件大小
        m_pPlaneWidget.PlaceWidget()  # 放置平面
        m_pPlaneWidget.AddObserver("EndInteractionEvent", my_call_back)
        m_pPlaneWidget.On()  # 显示平面

        plane = vtk.vtkPlane()
        # plane.SetOrigin(90,0, 90) #设置原点位置
        # plane.SetNormal(1, 0, 1)   #设置法向量
        m_pPlaneWidget.GetPlane(plane)
        volumeMapper2.AddClippingPlane(plane)

        clippingVolume = vtk.vtkVolume()  # 设置参数同上
        clippingVolume.SetMapper(volumeMapper2)
        clippingVolume.SetProperty(volumeProperty)

        outline2 = vtk.vtkOutlineFilter()
        outline2.SetInputConnection(shifter.GetOutputPort())

        outlineMapper2 = vtk.vtkPolyDataMapper()
        outlineMapper2.SetInputConnection(outline2.GetOutputPort())
        outlineMapper2.ScalarVisibilityOff()

        outlineActor2 = vtk.vtkActor()
        outlineActor2.SetMapper(outlineMapper2)
        outlineActor2.GetProperty().SetColor(1, 0, 0)

        ren2 = vtk.vtkRenderer()
        ren2.SetBackground(0.9, 1.0, 0.9)  # 设置背景颜色,RGB
        ren2.SetBackground2(1.0, 1.0, 1.0)  # 设置第二个背景颜色
        ren2.SetGradientBackground(1)
        ren2.SetViewport(0.5, 0.5, 1.0, 1.0)

        ren2.AddVolume(clippingVolume)  # 添加演员和外壳
        ren2.AddActor(outlineActor2)

        renWin.AddRenderer(ren2)  # 第二个窗口完成

        ren3 = vtk.vtkRenderer()
        ren3.SetBackground(0.9, 1.0, 0.9)  # 设置背景颜色,RGB
        ren3.SetBackground2(1.0, 1.0, 1.0)  # 设置第二个背景颜色
        ren3.SetGradientBackground(1)
        ren3.SetViewport(0.0, 0.0, 0.5, 0.5)

        img_arr1 = vtkImageImportFromArray(
        )  # 创建一个空的vtk类-----vtkImageImportFromArray
        img_arr1.SetArray(sitk.GetArrayFromImage(
            self.ds))  # 把array_data塞到vtkImageImportFromArray(array_data)
        img_arr1.SetDataSpacing(spacing)  # 设置spacing
        img_arr1.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
        img_arr1.Update()
        srange = img_arr1.GetOutput().GetScalarRange()

        min1 = srange[0]
        max1 = srange[1]

        diff = max1 - min1  # 体数据极差
        inter = 5000 / diff
        shift = -min1  # 可以加,不能减,人体内外分割处

        shifter1 = vtk.vtkImageShiftScale(
        )  # 对偏移和比例参数来对图像数据进行操作 数据转换,之后直接调用shifter
        shifter1.SetShift(shift)
        shifter1.SetScale(inter)
        shifter1.SetOutputScalarTypeToUnsignedShort()
        shifter1.SetInputData(img_arr1.GetOutput())
        shifter1.ReleaseDataFlagOff()
        shifter1.Update()

        volumeMapper3 = vtk.vtkGPUVolumeRayCastMapper(
        )  # 映射器volumnMapper使用vtk的管线投影算法
        volumeMapper3.SetInputData(
            shifter1.GetOutput())  # 向映射器中输入数据:shifter(预处理之后的数据)

        volume3 = vtk.vtkVolume()  # 演员
        volume3.SetMapper(volumeMapper3)
        volume3.SetProperty(volumeProperty)

        ren3.AddVolume(volume3)  # 添加演员和外壳
        ren3.AddActor(outlineActor2)

        renWin.AddRenderer(ren3)  # 第三个窗口完成

        ren4 = vtk.vtkRenderer()
        ren4.SetBackground(1.0, 0.9, 0.9)  # 设置背景颜色,RGB
        ren4.SetBackground2(1.0, 1.0, 1.0)  # 设置第二个背景颜色
        ren4.SetGradientBackground(1)
        ren4.SetViewport(0.5, 0.0, 1.0, 0.5)

        img_arr2 = vtkImageImportFromArray(
        )  # 创建一个空的vtk类-----vtkImageImportFromArray
        img_arr2.SetArray(
            self.npz_data)  # 把array_data塞到vtkImageImportFromArray(array_data)
        img_arr2.SetDataSpacing(spacing)  # 设置spacing
        img_arr2.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
        img_arr2.Update()
        srange = img_arr2.GetOutput().GetScalarRange()

        min2 = srange[0]
        max2 = srange[1]

        diff2 = max2 - min2  # 体数据极差
        inter2 = 5000 / diff2
        shift2 = -min2  # 可以加,不能减,人体内外分割处

        shifter2 = vtk.vtkImageShiftScale(
        )  # 对偏移和比例参数来对图像数据进行操作 数据转换,之后直接调用shifter
        shifter2.SetShift(shift2)
        shifter2.SetScale(inter2)
        shifter2.SetOutputScalarTypeToUnsignedShort()
        shifter2.SetInputData(img_arr2.GetOutput())
        shifter2.ReleaseDataFlagOff()
        shifter2.Update()

        volumeMapper4 = vtk.vtkGPUVolumeRayCastMapper(
        )  # 映射器volumnMapper使用vtk的管线投影算法
        volumeMapper4.SetInputData(
            shifter2.GetOutput())  # 向映射器中输入数据:shifter(预处理之后的数据)

        volume4 = vtk.vtkVolume()  # 演员
        volume4.SetMapper(volumeMapper4)
        volume4.SetProperty(volumeProperty)

        ren4.AddVolume(volume4)  # 添加演员和外壳
        ren4.AddActor(outlineActor2)

        renWin.AddRenderer(ren4)  # 第四个窗口完成

        iren.Initialize()
        renWin.Render()
        renWin.SetWindowName("Medical Image Air V1.0")
        iren.Start()
Beispiel #6
0
    def test_3d_build_from_array(self, data, spacing, size, mode):
        if mode == 0:
            # 管线投影算法
            srange = [np.min(data), np.max(data)]
            img_arr = vtkImageImportFromArray()  # 创建一个空的vtk类-----vtkImageImportFromArray
            # 把array_data塞到vtkImageImportFromArray(array_data)
            img_arr.SetArray(data)
            img_arr.SetDataSpacing(spacing)  # 设置spacing
            origin = (0, 0, 0)
            img_arr.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
            img_arr.Update()
            # srange = img_arr.GetOutput().GetScalarRange()

            print('spacing: ', spacing)
            print('srange: ', srange)

            ren = vtk.vtkRenderer()
            min = srange[0]
            max = srange[1]
            diff = max - min  # 体数据极差

            inter = 4200 / diff
            shift = -min
            print(min, max, inter, shift)  # 这几个数据后面有用

            shifter = vtk.vtkImageShiftScale()  # 对偏移和比例参数来对图像数据进行操作 数据转换,之后直接调用shifter
            shifter.SetShift(shift)
            shifter.SetScale(inter)
            shifter.SetOutputScalarTypeToUnsignedShort()
            shifter.SetInputData(img_arr.GetOutput())
            shifter.ReleaseDataFlagOff()
            shifter.Update()
            # print(shifter.GetOutput())
            # self.GPU_volumeMapper = vtk.vtkOpenGLGPUVolumeRayCastMapper()
            # self.GPU_volumeMapper = vtk.vtkSmartVolumeMapper()
            # self.GPU_volumeMapper = vtk.vtkVolumeTextureMapper3D()
            # self.GPU_volumeMapper = vtk.vtkGPUVolumeRayCastMapper()
            self.GPU_volumeMapper = vtk.vtkFixedPointVolumeRayCastMapper()
            # self.GPU_volumeMapper.SetBlendModeToMaximumIntensity()
            # self.GPU_volumeMapper.SetBlendModeToMinimumIntensity()
            self.GPU_volumeMapper.SetBlendModeToComposite()
            # self.GPU_volumeMapper.SetBlendModeToAdditive()

            self.GPU_volumeMapper.SetSampleDistance(0.5)

            self.GPU_volumeProperty = vtk.vtkVolumeProperty()
            self.GPU_compositeOpacity = vtk.vtkPiecewiseFunction()
            self.GPU_gradientOpacity = vtk.vtkPiecewiseFunction()
            self.GPU_color = vtk.vtkColorTransferFunction()
            self.GPU_volume = vtk.vtkVolume()
            self.GPU_render = vtk.vtkRenderer()

            reader = shifter

            self.GPU_volumeMapper.SetInputData(reader.GetOutput())
            # print(reader.GetOutput())

            self.GPU_volumeProperty.SetInterpolationTypeToLinear()
            # self.GPU_volumeProperty.ShadeOn()
            self.GPU_volumeProperty.SetAmbient(1)
            self.GPU_volumeProperty.SetDiffuse(0.8)
            self.GPU_volumeProperty.SetSpecular(30)
            # self.GPU_volumeProperty.SetSpecularColor(1,1,1)

            # 下面两段是添加透明度函数和对应分段函数(可以不要的)\

            self.GPU_compositeOpacity.AddPoint(100, 0.0)

            self.GPU_compositeOpacity.AddPoint(140, 0.25)
            '''
            self.GPU_compositeOpacity.AddPoint(180, 0.6)
            self.GPU_compositeOpacity.AddPoint(1129, 0)
            self.GPU_compositeOpacity.AddPoint(1300.0, 0.1)
            self.GPU_compositeOpacity.AddPoint(1600.0, 0.12)
            self.GPU_compositeOpacity.AddPoint(2000.0, 0.13)
            self.GPU_compositeOpacity.AddPoint(2200.0, 0.14)
            self.GPU_compositeOpacity.AddPoint(2500.0, 0.16)
            self.GPU_compositeOpacity.AddPoint(2800.0, 0.17)
            self.GPU_compositeOpacity.AddPoint(3000.0, 0.18)
            '''
            self.GPU_compositeOpacity.AddPoint(4200.0, 0.25)

            self.GPU_volumeProperty.SetScalarOpacity(
                0, self.GPU_compositeOpacity)

            # self.GPU_gradientOpacity.AddPoint(-1000, 0.0)
            # self.GPU_gradientOpacity.AddPoint(0, 1)
            # self.GPU_gradientOpacity.AddPoint(0.5, 9.9)
            # self.GPU_gradientOpacity.AddPoint(100, 10)
            # self.GPU_gradientOpacity.AddPoint(4200, 1)
            # gradtfun.AddPoint(-1000, 9)
            # gradtfun.AddPoint(0.5, 9.9)
            # gradtfun.AddPoint(1, 10)
            # self.GPU_volumeProperty.SetGradientOpacity(0, self.GPU_gradientOpacity)

            # self.GPU_color.AddRGBPoint(0, 1, 1, 1) # 设置显示的体颜色
            # for i in range(int(max)+1):
            #    self.GPU_color.AddRGBPoint(i*inter,0,0,0)
            self.GPU_color.AddRGBPoint(0.0, 0, 0, 0.0)
            self.GPU_color.AddRGBPoint(600.0, 0, 0, 1)
            self.GPU_color.AddRGBPoint(1200.0, 0, 1, 0)
            self.GPU_color.AddRGBPoint(1800.0, 0, 1, 1)
            self.GPU_color.AddRGBPoint(2400.0, 1, 0, 0)
            self.GPU_color.AddRGBPoint(3000.0, 1, 0, 1)
            self.GPU_color.AddRGBPoint(3600.0, 1, 1, 0)
            self.GPU_color.AddRGBPoint(4200.0, 1, 1, 1)

            self.GPU_volumeProperty.SetColor(0, self.GPU_color)

            self.GPU_volume.SetProperty(self.GPU_volumeProperty)
            outline = vtk.vtkOutlineFilter()
            outline.SetInputConnection(shifter.GetOutputPort())
            self.GPU_volume.SetMapper(self.GPU_volumeMapper)
            outlineMapper = vtk.vtkPolyDataMapper()
            outlineMapper.SetInputConnection(outline.GetOutputPort())

            outlineActor = vtk.vtkActor()
            outlineActor.SetMapper(outlineMapper)

            self.GPU_render.AddActor(outlineActor)
            self.GPU_render.AddVolume(self.GPU_volume)  # 添加体数据
            self.GPU_render.SetBackground(0.4, 0.4, 0.4)  # 设置背景颜色(绿色代表健康)
            self.GPU_render.ResetCamera()   # 这一句是为了每次打开体数据以后设置体中心为交互中心

            self.vtkWidget.GetRenderWindow().Render()  # 添加Render
            self.vtkWidget.GetRenderWindow().AddRenderer(self.GPU_render)

        else:
            # 移动立方算法
            srange = [np.min(data), np.max(data)]
            big = int(srange[1])
            print(big)
            #spacing = (1,1,5)
            img_arr = vtkImageImportFromArray()  # 创建一个空的vtk类-----vtkImageImportFromArray
            # 把array_data塞到vtkImageImportFromArray(array_data)
            img_arr.SetArray(data)
            img_arr.SetDataSpacing(spacing)  # 设置spacing
            origin = (0, 0, 0)
            img_arr.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
            img_arr.Update()

            outfilterline = vtk.vtkOutlineFilter()
            outfilterline.SetInputConnection(img_arr.GetOutputPort())
            outmapper = vtk.vtkPolyDataMapper()
            outmapper.SetInputConnection(outfilterline.GetOutputPort())
            OutlineActor = vtk.vtkActor()
            OutlineActor.SetMapper(outmapper)
            self.GPU_render = vtk.vtkRenderer()
            mc = []
            Mapper = []
            actor = []
            color = [
                [1, 0, 0],
                [0, 1, 1],
                [1, 1, 0],
                [0, 1, 0],
                [1, 1, 1],
                [0, 0, 1],
                [1, 0, 1],
                [0.5, 1, 0.5],
                [1, .5, 0],
                [.5, .2, .1],
                [.2, .7, .2],
                [0.2, 1, 1],
                [0.5, 0.1, 1],
                [.2, 0.5, .7],
                [0.5, 0.3, 0.9],
                [0.3, .5, 0],
                [.23, .2, .1],
                [.4, .8, .2],
                [.1, .1, .4],
            ]
            #Stripper
            for i in range(big):
                img_arr = vtkImageImportFromArray()  # 创建一个空的vtk类-----vtkImageImportFromArray
                # 把array_data塞到vtkImageImportFromArray(array_data)
                img_arr.SetArray(data)
                img_arr.SetDataSpacing(spacing)  # 设置spacing
                origin = (0, 0, 0)
                img_arr.SetDataOrigin(origin)  # 设置vtk数据的坐标系原点
                img_arr.Update()
                mc.append(vtk.vtkMarchingCubes())
                mc[i].SetInputConnection(img_arr.GetOutputPort())
                mc[i].SetValue(0, big - i)
                data[data == big-i] = 0
                #mc.SetValue(1, 18)
                mc[i].ComputeNormalsOn()
                #Stripper.append(vtk.vtkStripper())
                #Stripper[i].SetInputConnection(mc[i].GetOutputPort())
                Mapper.append(vtk.vtkPolyDataMapper())
                Mapper[i].SetInputConnection(mc[i].GetOutputPort())
                Mapper[i].ScalarVisibilityOff()
                actor.append(vtk.vtkActor())  # Created a actor
                actor[i].SetMapper(Mapper[i])
                actor[i].GetProperty().SetDiffuseColor(1, .49, .25)  # 设置皮肤颜色;
                actor[i].GetProperty().SetSpecular(0.3)  # 反射率;
                actor[i].GetProperty().SetOpacity(1.0)  # 透明度;
                actor[i].GetProperty().SetSpecularPower(20)  # 反射光强度;
                actor[i].GetProperty().SetColor(color[i][0],color[i][1],color[i][2])  # 设置角的颜色;
                #actor.GetProperty().SetRepresentationToWireframe()  # 线框;
                self.GPU_render.AddActor(actor[i])
            '''
            //vtkSmartPointer<vtkCamera> camera = vtkSmartPointer<vtkCamera>::New();//Setting the Camera;
            //camera->SetViewUp(0, 0, -1);//设置相机向上方向;
            //camera->SetPosition(0, 1, 0);//位置:世界坐标系,相机位置;
            //camera->SetFocalPoint(0, 0, 0);//焦点,世界坐标系,控制相机方向;
            //camera->ComputeViewPlaneNormal();//重置视平面方向,基于当前的位置和焦点;
            
            
            
            actor = vtk.vtkActor()  # Created a actor
            actor.SetMapper(Mapper)
            actor.GetProperty().SetDiffuseColor(1, .49, .25)  # 设置皮肤颜色;
            actor.GetProperty().SetSpecular(0.3)  # 反射率;
            actor.GetProperty().SetOpacity(1.0)  # 透明度;
            actor.GetProperty().SetSpecularPower(20)  # 反射光强度;
            actor.GetProperty().SetColor(1, 0, 0)  # 设置角的颜色;
            '''
            #actor.GetProperty().SetRepresentationToWireframe()  # 线框;
            #self.GPU_render=vtk.vtkRenderer()
            #self.GPU_render.AddActor(actor)
            self.GPU_render.AddActor(OutlineActor)
            # //ren->SetActiveCamera(camera);//设置渲染器的相机;
            

            # //camera->Dolly(1.5);//使用Dolly()方法延伸着视平面法向移动相机;
            self.GPU_render.SetBackground(0.4, 0.4, 0.4)  # //设置背景颜色;
            self.GPU_render.ResetCamera()
            self.GPU_render.ResetCameraClippingRange()
            self.vtkWidget.GetRenderWindow().Render()  # 添加Render
            self.vtkWidget.GetRenderWindow().AddRenderer(self.GPU_render)
            '''
            vtkInteractorStyleTrackballCamera *style = vtkInteractorStyleTrackballCamera::New();
            iren->SetInteractorStyle(style);
            renWin->Render();
            iren->Initialize();
            iren->Start();
            vtkSmartPointer<vtkOBJExporter> porter = vtkSmartPointer<vtkOBJExporter>::New();
            porter->SetFilePrefix("E:/ceshi/aaa/regist_after/polywrite.obj");//重建图像输出
            porter->SetInput(renWin);
            porter->Write();
            '''
            print("ok")