medimage 发表于 2015-12-4 22:08:08

VTK例子1-实现DICOM格式图片的批量读取和切片显示

本帖最后由 medimage 于 2015-12-4 22:17 编辑

实现DICOM格式图片的批量读取和切片显示#include "stdafx.h"#include "vtkRenderer.h"#include "vtkRenderWindow.h"#include "vtkRenderWindowInteractor.h"#include "vtkVolume16Reader.h"#include "vtkPolyDataMapper.h"#include "vtkActor.h"#include "vtkOutlineFilter.h"#include "vtkCamera.h"#include "vtkStripper.h"#include "vtkLookupTable.h"#include "vtkImageDataGeometryFilter.h"#include "vtkMarchingCubes.h"#include "vtkImageShrink3D.h"#include "vtkProperty.h"#include "vtkDICOMImageReader.h"
void main( int argc, char *argv[] ){      // create the renderer stuff         vtkRenderer *aRenderer = vtkRenderer::New();      vtkRenderWindow *renWin = vtkRenderWindow::New();      renWin->AddRenderer(aRenderer);      vtkRenderWindowInteractor *iren =vtkRenderWindowInteractor::New();      iren->SetRenderWindow(renWin);      // read the volume读取函数       vtkDICOMImageReader   *reader =vtkDICOMImageReader::New();      reader->SetDataByteOrderToLittleEndian();      //reader->SetDirectoryName("e://ct/head40/");         reader->SetDirectoryName("E://VC_Project/DATA");//设置读取的文件的目录路径
         //      reader->SetDataOrigin(0.0, 0.0, 0.0);      reader->Update();      int extent;      reader->GetDataExtent(extent);          //FOV:210*189MAT:256*161    383*344      double spacing ;      reader->GetDataSpacing(spacing);       int xx,yy,zz;      xx=(int)((extent+1)*spacing);   //左右方向      yy=(int)((extent+1)*spacing);   //前后方向      zz=(int)((extent+1)*spacing);   //上下方向 (-1.6)*70         cout<<xx<<""<<yy<<""<<zz<<"";   vtkImageShrink3D *shrink=vtkImageShrink3D::New();         shrink->SetInput((vtkDataObject *)reader->GetOutput());      shrink->SetShrinkFactors(4,4,1);      //Set/Get the shrink factors
      // extract the skin   提取表面      vtkMarchingCubes *skinExtractor = vtkMarchingCubes::New();      skinExtractor->SetInputConnection(shrink->GetOutputPort());      skinExtractor->SetValue(0, 900);      vtkStripper *skinStripper = vtkStripper::New();      skinStripper->SetInput(skinExtractor->GetOutput());      vtkPolyDataMapper *skinMapper = vtkPolyDataMapper::New();      skinMapper->SetInput(skinStripper->GetOutput());      skinMapper->ScalarVisibilityOff();      vtkActor *skin = vtkActor::New();      skin->SetMapper(skinMapper);      skin->GetProperty()->SetDiffuseColor(1, .49, .25);      skin->GetProperty()->SetSpecular(.3);      skin->GetProperty()->SetSpecularPower(20);      // extract the bone      vtkMarchingCubes *boneExtractor = vtkMarchingCubes::New();      boneExtractor->SetInputConnection(shrink->GetOutputPort());      boneExtractor->SetValue(0, 500);      vtkStripper *boneStripper = vtkStripper::New();      boneStripper->SetInput(boneExtractor->GetOutput());      vtkPolyDataMapper *boneMapper = vtkPolyDataMapper::New();      boneMapper->SetInput(boneStripper->GetOutput());      boneMapper->ScalarVisibilityOff();      vtkActor *bone = vtkActor::New();      bone->SetMapper(boneMapper);      bone->GetProperty()->SetDiffuseColor(1, 1, .9412);      // get an outline      vtkOutlineFilter *outlineData = vtkOutlineFilter::New();      outlineData->SetInputConnection(shrink->GetOutputPort());      vtkPolyDataMapper *mapOutline = vtkPolyDataMapper::New();      mapOutline->SetInput(outlineData->GetOutput());      vtkActor *outline = vtkActor::New();      outline->SetMapper(mapOutline);      outline->GetProperty()->SetColor(0,0,0);      // create a b/w lookup table      vtkLookupTable *bwLut = vtkLookupTable::New();      bwLut->SetTableRange (0, 2000);      bwLut->SetSaturationRange (0, 0);      bwLut->SetHueRange (0, 0);      bwLut->SetValueRange (0, 1);      // create a hue lookup table      vtkLookupTable *hueLut = vtkLookupTable::New();      hueLut->SetTableRange (0, 2000);      hueLut->SetHueRange (0, 1);      hueLut->SetSaturationRange (1, 1);      hueLut->SetValueRange (1, 1);      // create a saturation lookup table      vtkLookupTable *satLut = vtkLookupTable::New();      satLut->SetTableRange (0, 2000);      satLut->SetHueRange (.6, .6);      satLut->SetSaturationRange (0, 1);      satLut->SetValueRange (1, 1);      // sagittal      vtkImageDataGeometryFilter *saggitalSection =      vtkImageDataGeometryFilter::New();      saggitalSection->SetExtent (65,65, 0,yy, 0, zz);      saggitalSection->SetInputConnection(shrink->GetOutputPort());      vtkPolyDataMapper *saggitalMapper = vtkPolyDataMapper::New();      saggitalMapper->SetInput(saggitalSection->GetOutput());      saggitalMapper->ScalarVisibilityOn();      saggitalMapper->SetScalarRange (-1024, 2000);      saggitalMapper->SetLookupTable (bwLut);      vtkActor *sagittal = vtkActor::New();      sagittal->SetMapper(saggitalMapper);      // axial      vtkImageDataGeometryFilter *axialSection =      vtkImageDataGeometryFilter::New();      axialSection->SetExtent (0,xx, 0,yy, 22, 22);      axialSection->SetInputConnection(shrink->GetOutputPort());      vtkPolyDataMapper *axialMapper = vtkPolyDataMapper::New();      axialMapper->SetInput(axialSection->GetOutput());      axialMapper->ScalarVisibilityOn();      axialMapper->SetScalarRange (-1024, 2000);      axialMapper->SetLookupTable (hueLut);      vtkActor *axial = vtkActor::New();      axial->SetMapper(axialMapper);      // coronal      vtkImageDataGeometryFilter *coronalSection =      vtkImageDataGeometryFilter::New();      coronalSection->SetExtent (0,xx, 65, 65, 0, zz);      coronalSection->SetInputConnection(shrink->GetOutputPort());      vtkPolyDataMapper *coronalMapper =      vtkPolyDataMapper::New();      coronalMapper->SetInput(coronalSection->GetOutput());      coronalMapper->ScalarVisibilityOn();      coronalMapper->SetScalarRange (-1024, 2000);      coronalMapper->SetLookupTable (satLut);      vtkActor *coronal = vtkActor::New();      coronal->SetMapper(coronalMapper);      // create a camera with the correct view up      vtkCamera *aCamera = vtkCamera::New();      aCamera->SetViewUp (0, 0, -1);      aCamera->SetPosition (0, 1, 0);      aCamera->SetFocalPoint (0, 0, 0);      // now, tell the renderer our actors      aRenderer->AddActor(outline);      aRenderer->AddActor(sagittal);      aRenderer->AddActor(axial);      aRenderer->AddActor(coronal);      aRenderer->AddActor(skin);      aRenderer->AddActor(bone);      // turn off bone for this examples//      bone->VisibilityOff();      // set skin to semi-transparent      skin->GetProperty()->SetOpacity(0.5);      bone->GetProperty()->SetOpacity(0.3);      aRenderer->SetActiveCamera(aCamera);      aRenderer->ResetCamera ();      aCamera->Dolly(1.5);      aRenderer->SetBackground(1,1,1);      aRenderer->ResetCameraClippingRange();      // interact with data      renWin->SetSize(600, 600);      renWin->Render();//      SAVEIMAGE( renWin );      iren->Start();

biomed 发表于 2016-5-13 21:31:38

谢谢你的辛苦劳动了!!!

江西丁工 发表于 2016-5-14 17:59:13

谢谢你的辛苦劳动了!!!

medphysics 发表于 2016-5-23 01:37:13

学习了!!!!!!!!!

EdwardMa 发表于 2016-7-3 10:32:12

您好,这个例子的图片来源是公开的吗?

EdwardMa 发表于 2016-7-3 10:33:17

您好,这个例子的图片来源是公开的吗?

EdwardMa 发表于 2016-7-3 10:33:40

您好,这个例子的图片来源是公开的吗?
还有CMakeLists文件里面代码怎么写呢?
谢谢您啦
页: [1]
查看完整版本: VTK例子1-实现DICOM格式图片的批量读取和切片显示