1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面 冠状面 矢状面 3D)

三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面 冠状面 矢状面 3D)

时间:2019-08-09 14:57:31

相关推荐

三维重建 医学图像的可视化 PyQt Python VTK 四视图(横断面 冠状面 矢状面 3D)

本文实现了 Python C++ 版本 的 四视图,横断面,冠状面,矢状面,3D

主要功能:

1:可以通过进度条换层

2:鼠标双击放大/缩小窗口

3:按住鼠标中键拖动图像

4:鼠标右键滑动放大/缩小图像

效果:

视频:

small_python_vtk_4window

这里主要讲一下体绘制:

1.固定点光线投影算法

vtkFixedPointVolumeRayCastMapper

该类能够实现基于Alpha合成的体绘制方法和最大密度投影体绘制方法,能够支持任意类型或者独立多元数据。

例如,当输入为二元独立数据时,第一源数据用于颜色映射,而第二元作为不透明度映射。该类使用了空间跳跃技术来加速体绘制的渲染过程,而在内部计算时,统一使用了float数据类型。

vtkFixedPointVolumeRayCastMapper与vtkVolumeRayCastMapper对比两个类的使用方法基本一致,都支持设置光线采样步长、图像采样距离、自动调整图像采样距离等操作。

vtkFixedPointVolumeRayCastMapper

只支持基于Alpha合成的体绘制方法和最大密度体绘制方法,

光线投影+最大密度投影+等值面法

void SetBlendModeToComposite();void SetBlendModeToMaximumIntensity();void SetBlendModeToMinimumIntensity();void SetBlendModeToAddictive();

2、基于GPU加速的光线投射体会自算法

vtkGPUVolumeRayCastMapper类实现了基于GPU加速光线投影体绘制算法。该类的使用方法与上面各类基本一致。同样可以实现光线采样步长、图像采样距离、自动调整图像采样距离等。

vtkSmartPointer<vtkGPUVolumeRayCastMapper> volumeMapper =vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();volumeMapper->SetInputData(reader->GetOutput());;volumeMapper->SetSampleDistance(volumeMapper->GetSampleDistance() / 2);//设置光线采样距离

3.样例:

分别:

1.MIP

positeRamp

positeShadeRamp

4.CT_Skin

5.CT_Bone

6.CT_Muscle

7.RGB_Composite

// Create our volume and mappervtkNew<vtkVolume> volume;vtkNew<vtkFixedPointVolumeRayCastMapper> mapper;mapper->SetInputConnection(reader->GetOutputPort());vtkNew<vtkColorTransferFunction> colorFun;vtkNew<vtkPiecewiseFunction> opacityFun;// Create the property and attach the transfer functionsvtkNew<vtkVolumeProperty> property;property->SetIndependentComponents(independentComponents);property->SetColor(colorFun);property->SetScalarOpacity(opacityFun);property->SetInterpolationTypeToLinear();// connect up the volume to the property and the mappervolume->SetProperty(property);volume->SetMapper(mapper);// Depending on the blend type selected as a command line option,// adjust the transfer functionswitch (blendType){// MIP// Create an opacity ramp from the window and level values.// Color is white. Blending is MIP.case 0:colorFun->AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0);opacityFun->AddSegment(opacityLevel - 0.5 * opacityWindow, 0.0,opacityLevel + 0.5 * opacityWindow, 1.0);mapper->SetBlendModeToMaximumIntensity();break;// CompositeRamp// Create a ramp from the window and level values. Use compositing// without shading. Color is a ramp from black to white.case 1:colorFun->AddRGBSegment(opacityLevel - 0.5 * opacityWindow, 0.0, 0.0, 0.0,opacityLevel + 0.5 * opacityWindow, 1.0, 1.0, 1.0);opacityFun->AddSegment(opacityLevel - 0.5 * opacityWindow, 0.0,opacityLevel + 0.5 * opacityWindow, 1.0);mapper->SetBlendModeToComposite();property->ShadeOff();break;// CompositeShadeRamp// Create a ramp from the window and level values. Use compositing// with shading. Color is white.case 2:colorFun->AddRGBSegment(0.0, 1.0, 1.0, 1.0, 255.0, 1.0, 1.0, 1.0);opacityFun->AddSegment(opacityLevel - 0.5 * opacityWindow, 0.0,opacityLevel + 0.5 * opacityWindow, 1.0);mapper->SetBlendModeToComposite();property->ShadeOn();break;// CT_Skin// Use compositing and functions set to highlight skin in CT data// Not for use on RGB datacase 3:colorFun->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);colorFun->AddRGBPoint(-1000, .62, .36, .18, 0.5, 0.0);colorFun->AddRGBPoint(-500, .88, .60, .29, 0.33, 0.45);colorFun->AddRGBPoint(3071, .83, .66, 1, 0.5, 0.0);opacityFun->AddPoint(-3024, 0, 0.5, 0.0);opacityFun->AddPoint(-1000, 0, 0.5, 0.0);opacityFun->AddPoint(-500, 1.0, 0.33, 0.45);opacityFun->AddPoint(3071, 1.0, 0.5, 0.0);mapper->SetBlendModeToComposite();property->ShadeOn();property->SetAmbient(0.1);property->SetDiffuse(0.9);property->SetSpecular(0.2);property->SetSpecularPower(10.0);property->SetScalarOpacityUnitDistance(0.8919);break;// CT_Bone// Use compositing and functions set to highlight bone in CT data// Not for use on RGB datacase 4:colorFun->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);colorFun->AddRGBPoint(-16, 0.73, 0.25, 0.30, 0.49, .61);colorFun->AddRGBPoint(641, .90, .82, .56, .5, 0.0);colorFun->AddRGBPoint(3071, 1, 1, 1, .5, 0.0);opacityFun->AddPoint(-3024, 0, 0.5, 0.0);opacityFun->AddPoint(-16, 0, .49, .61);opacityFun->AddPoint(641, .72, .5, 0.0);opacityFun->AddPoint(3071, .71, 0.5, 0.0);mapper->SetBlendModeToComposite();property->ShadeOn();property->SetAmbient(0.1);property->SetDiffuse(0.9);property->SetSpecular(0.2);property->SetSpecularPower(10.0);property->SetScalarOpacityUnitDistance(0.8919);break;// CT_Muscle// Use compositing and functions set to highlight muscle in CT data// Not for use on RGB datacase 5:colorFun->AddRGBPoint(-3024, 0, 0, 0, 0.5, 0.0);colorFun->AddRGBPoint(-155, .55, .25, .15, 0.5, .92);colorFun->AddRGBPoint(217, .88, .60, .29, 0.33, 0.45);colorFun->AddRGBPoint(420, 1, .94, .95, 0.5, 0.0);colorFun->AddRGBPoint(3071, .83, .66, 1, 0.5, 0.0);opacityFun->AddPoint(-3024, 0, 0.5, 0.0);opacityFun->AddPoint(-155, 0, 0.5, 0.92);opacityFun->AddPoint(217, .68, 0.33, 0.45);opacityFun->AddPoint(420, .83, 0.5, 0.0);opacityFun->AddPoint(3071, .80, 0.5, 0.0);mapper->SetBlendModeToComposite();property->ShadeOn();property->SetAmbient(0.1);property->SetDiffuse(0.9);property->SetSpecular(0.2);property->SetSpecularPower(10.0);property->SetScalarOpacityUnitDistance(0.8919);break;// RGB_Composite// Use compositing and functions set to highlight red/green/blue regions// in RGB data. Not for use on single component datacase 6:opacityFun->AddPoint(0, 0.0);opacityFun->AddPoint(5.0, 0.0);opacityFun->AddPoint(30.0, 0.05);opacityFun->AddPoint(31.0, 0.0);opacityFun->AddPoint(90.0, 0.0);opacityFun->AddPoint(100.0, 0.3);opacityFun->AddPoint(110.0, 0.0);opacityFun->AddPoint(190.0, 0.0);opacityFun->AddPoint(200.0, 0.4);opacityFun->AddPoint(210.0, 0.0);opacityFun->AddPoint(245.0, 0.0);opacityFun->AddPoint(255.0, 0.5);mapper->SetBlendModeToComposite();property->ShadeOff();property->SetScalarOpacityUnitDistance(1.0);break;default:vtkGenericWarningMacro("Unknown blend type.");break;}// Set the default window sizerenWin->SetSize(600, 600);renWin->SetWindowName("FixedPointVolumeRayCastMapperCT");renWin->Render();// Add the volume to the scenerenderer->AddVolume(volume);renderer->ResetCamera();renderer->SetBackground(colors->GetColor3d("SlateGray").GetData());auto camera = renderer->GetActiveCamera();camera->SetPosition(56.8656, -297.084, 78.913);camera->SetFocalPoint(109.139, 120.604, 63.5486);camera->SetViewUp(-0.00782421, -0.0357807, -0.999329);camera->SetDistance(421.227);camera->SetClippingRange(146.564, 767.987);// interact with datarenWin->Render();iren->Start();

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。