VTK读取DICOM图像


1.用vtkDICOMImageReader
  #include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteracto r.h"
#include "vtkImageActor.h"
#include "vtkDICOMImageReader.h"
#include "vtkImageShiftScale.h"
int main ()
{
        vtkDICOMImageReader *dcmReader = vtkDICOMImageReader::New();
        dcmReader->SetDirectoryName("E:\medicalimages\vhm");
        dcmReader->SetDataByteOrderToLittle Endian();
  double x,y,z;
  dcmReader->GetDataSpacing(x,y,z);
  dcmReader->SetDataSpacing(x,y,z);
  vtkImageShiftScale *shifter = vtkImageShiftScale::New();
  shifter->SetInputConnection(dcmReader->GetOutputPort());
  shifter->SetShift(70);
  shifter->SetScale(0.5);
  shifter->SetOutputScalarTypeToUns ignedChar();
  vtkImageActor *actor = vtkImageActor::New();
  actor->SetInput(shifter->GetOutput());
  vtkRenderer *aRender = vtkRenderer::New(); //设置绘制类
  aRender->AddActor(actor);
  vtkRenderWindow*renWin=vtkRenderWindow::New();//设置绘制窗口
  renWin->SetSize(500, 500); //设置背景颜色和绘制窗口大小
  renWin->AddRenderer(aRender); //装载绘制类
  vtkRenderWindowInteracto r*iRen=vtkRenderWindowInteracto r::New();//设置绘制窗口的交互
  iRen->SetRenderWindow(renWin); //装载绘制窗口
    renWin->Render(); //窗口进行绘制
  iRen->Initialize(); 
  iRen->Start(); //初始化并进行交互绘制
 

2.用vtkVolume16Reader,不限定DCM文件,不过文件后缀要以.1 .2 .3...来命名,工作有得做,而且不能读太多图片,vtkArray承载不了太多数据.而且图片会错位
                        vtkVolume16Reader v16 = new vtkVolume16Reader();
                        v16.SetDataDimensions(512, 512);
                        v16.SetDataByteOrderToLittle Endian();
                        v16.SetFilePrefix("F:\LiverGUI\SE4\IM");
                        v16.SetImageRange(1, 100);
                        v16.SetDataSpacing(1.0, 1.0, 1.0); 

3.读raw da ta...用vtkImageData,读取用vtkImageReader更快!具体查vtk 手册吧!
              private void volumeRendering(String filePath, int[] dims, int []shrinkFactor,vtkRenderWindow renWin)
                {
                        //接口说明
                        //1.filePath:dat文件名
                        //2.dims:体数据的三个维度所构成的数组
                        //3.shrinkFactor:三个元素的数组,代表长宽 高 的缩放比例
                        //4.vtkRenderWindow,窗口中添加的vtkFormsWindowControl通过GetRenderWindow方法获得的变量
                        //Read dat da ta
                        FileStream fs = null;
                        byte[] point = new byte[2];
                        if (!File.Exists(filePath))
                        {
                                MessageBox.Show("Raw Da ta doesn't exist!");
                                return;
                        }
                        fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
                        int i, j, k;
                        short[,,]rawData = new short[dims[0], dims[1], dims[2]];
                        for (i = 0; i < dims[0]; i++)
                        {
                                for (j = 0; j < dims[1]; j++)
                                {
                                        for (k = 0; k < dims[2]; k++)
                                        {
                                                point[0] = (byte)fs.ReadByte();
                                                point[1] = (byte)fs.ReadByte();
                                                rawData   = BitConverter.ToInt16(point, 0);
                                        }
                                }
                        }
                        //Volume Rendeing
                        vtkImageData id = new vtkImageData();
                        id.SetDimensions(dims[0], dims[1], dims[2]);
                        id.SetScalarTypeToShort();
                        id.SetNumberOfScalarCompone nts(1);
                        id.AllocateScalars();
                        vtkImageShrink3D mask = new vtkImageShrink3D();
                        mask.SetInput(id);
                        mask.SetShrinkFactors(shrinkFactor[0], shrinkFactor[1], shrinkFactor[2]);
                        unsafe
                        {
                                short* a = (short*)(id.GetScalarPointer().ToPointer());
                                for (i = 0; i < dims[0]; i++)
                                {
                                        for (j = 0; j < dims[1]; j++)
                                        {
                                                for (k = 0; k < dims[2]; k++)
                                                {
                                                        *a++ = rawData ;
                                                }
                                        }
                                }
                        }
                        vtkContourFilter cf = new vtkContourFilter();
                        cf.SetInputConnection(mask.GetOutputPort());
                        vtkPolyDataMapper mapper = new vtkPolyDataMapper();
                        mapper.SetInputConnection(cf.GetOutputPort());
                        mapper.SetScalarRange(-2048, 2047);
                        vtkActor actor = new vtkActor();
                        actor.SetMapper(mapper);
                        vtkCamera aCamera = new vtkCamera();
                        aCamera.SetViewUp(0, 5, 0);
                        aCamera.SetPosition(5, 0, 0);
                        aCamera.SetFocalPoint(0, 0, 0);
                        aCamera.ComputeViewPlaneNormal();
                        vtkRenderer ren = new vtkRenderer();
                        ren.AddActor(actor);
                        ren.ResetCamera();
                        aCamera.Dolly(1.5);
                        ren.ResetCameraClippingRange ();
                        renWin.AddRenderer(ren);
                        ren.SetBackground(0.0f, 0.0f, 0.0f);
                }
       

}
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值