读取一系列人体头部二维切片,抽取皮肤与骨骼
console下实现如下:
#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL2); VTK_MODULE_INIT(vtkInteractionStyle); VTK_MODULE_INIT(vtkRenderingFreeType); VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2); #include<vtkRenderer.h> #include<vtkRenderWindow.h> #include<vtkRenderWindowInteractor.h> #include<vtkInteractorStyleTrackballCamera.h> #include<vtkVolume16Reader.h> #include<vtkPolyDataMapper.h> #include<vtkActor.h> #include<vtkOutlineFilter.h> #include<vtkCamera.h> #include<vtkProperty.h> #include<vtkPolyDataNormals.h> #include<vtkContourFilter.h> #include<vtkSmartPointer.h> #include<vtkStripper.h> int main() { vtkSmartPointer<vtkRenderer>render = vtkSmartPointer<vtkRenderer>::New(); vtkSmartPointer<vtkRenderWindow>renWin = vtkSmartPointer<vtkRenderWindow>::New(); renWin->AddRenderer(render); vtkSmartPointer<vtkRenderWindowInteractor>iren = vtkSmartPointer<vtkRenderWindowInteractor>::New(); iren->SetRenderWindow(renWin); vtkSmartPointer<vtkVolume16Reader>v16 = vtkSmartPointer<vtkVolume16Reader>::New(); v16->SetDataDimensions(64, 64); v16->SetDataByteOrderToLittleEndian(); v16->SetFilePrefix("F:\\vtkshuju\\Data\\headsq\\quarter"); v16->SetImageRange(1, 93); v16->SetDataSpacing(3.2, 3.2, 1.5); vtkSmartPointer<vtkContourFilter>skinExtractor = vtkSmartPointer<vtkContourFilter>::New(); skinExtractor->SetInputConnection(v16->GetOutputPort()); skinExtractor->SetValue(0, 500); vtkSmartPointer<vtkPolyDataNormals>skinNorms = vtkSmartPointer<vtkPolyDataNormals>::New(); skinNorms->SetInputConnection(skinExtractor->GetOutputPort()); skinNorms->SetFeatureAngle(60.0); vtkSmartPointer<vtkStripper>skinStrip = vtkSmartPointer<vtkStripper>::New(); skinStrip->SetInputConnection(skinNorms->GetOutputPort()); vtkSmartPointer<vtkPolyDataMapper>skinMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); skinMapper->SetInputConnection(skinStrip->GetOutputPort()); skinMapper->ScalarVisibilityOff(); vtkSmartPointer<vtkActor>skinActor = vtkSmartPointer<vtkActor>::New(); skinActor->SetMapper(skinMapper); skinActor->GetProperty()->SetDiffuseColor(1, 0.49, 0.25); skinActor->GetProperty()->SetSpecular(0.3); skinActor->GetProperty()->SetSpecularPower(20); skinActor->GetProperty()->SetOpacity(0.5); vtkSmartPointer<vtkContourFilter>boneExtractor = vtkSmartPointer<vtkContourFilter>::New(); boneExtractor->SetInputConnection(v16->GetOutputPort()); boneExtractor->SetValue(0, 1150); vtkSmartPointer<vtkPolyDataNormals>boneNormals = vtkSmartPointer<vtkPolyDataNormals>::New(); boneNormals->SetInputConnection(boneExtractor->GetOutputPort()); boneNormals->SetFeatureAngle(60.0); vtkSmartPointer<vtkStripper>boneStrip = vtkSmartPointer<vtkStripper>::New(); boneStrip->SetInputConnection(boneNormals->GetOutputPort()); vtkSmartPointer<vtkPolyDataMapper>boneMapper = vtkSmartPointer<vtkPolyDataMapper>::New(); boneMapper->SetInputConnection(boneStrip->GetOutputPort()); boneMapper->ScalarVisibilityOff(); vtkSmartPointer<vtkActor>bone = vtkSmartPointer<vtkActor>::New(); bone->SetMapper(boneMapper); bone->GetProperty()->SetDiffuseColor(1, 1, 0.9412); vtkSmartPointer<vtkOutlineFilter>outLineData = vtkSmartPointer<vtkOutlineFilter>::New(); outLineData->SetInputConnection(v16->GetOutputPort()); vtkSmartPointer<vtkPolyDataMapper> mapOutline = vtkSmartPointer<vtkPolyDataMapper>::New(); mapOutline->SetInputConnection(outLineData->GetOutputPort()); vtkSmartPointer<vtkActor>outline = vtkSmartPointer<vtkActor>::New(); outline->SetMapper(mapOutline); outline->GetProperty()->SetColor(0, 0, 0); vtkSmartPointer<vtkCamera>camera = vtkSmartPointer<vtkCamera>::New(); camera->SetViewUp(0, 0, -1); camera->SetPosition(0, 1, 0); camera->SetFocalPoint(0, 0, 0); camera->ComputeViewPlaneNormal(); camera->Azimuth(30.0); camera->Elevation(30.0); render->AddActor(outline); render->AddActor(skinActor); render->AddActor(bone); render->SetActiveCamera(camera); render->ResetCamera(); render->SetBackground(0.2, 0.3, 0.4); camera->Dolly(1.5); render->ResetCameraClippingRange(); vtkSmartPointer<vtkInteractorStyleTrackballCamera>style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New(); iren->SetInteractorStyle(style); iren->Initialize(); iren->Start(); return 0; }