VTK笔记-结构化点集-vtkStructuredPoints类

结构化点集

结构化点数据集由线单元、像素单元或者体素单元组成;其中每个单元的大小、形状都是一致的,所以数据集中的点是非常规则的排列在一起的,并且排列的方向与模型的X-Y-Z坐标轴是平行的。
结构化点集需要要指定一个起始点坐标+三个坐标轴方向上相邻点间的距离(像素间隔),就可以算出所有点的坐标,不需要外部指定所有的点和所有单元的坐标信息。
起始点坐标通过SetOrigin设置;像素间隔通过SetSpacing设置。
由于结构化点数据集只由以上三种单元结构(线单元、像素单元或者体素单元),所以只需要通过设定三个方向上点集范围就能确定所有点的总数,也就是数据集的尺寸,使用SetDimensions设定;三个坐标轴方向的变量索引可以使用i-j-k,数据集中共有Nx*Ny*Nz个点,共有(Nx-1)*(Ny-1)*(Nz-1)个单元。可以通过i/j/k组合定位一个特定点(i,j,k)对应的标量数据值(像素值);
通vtkImageData类似,结构化点数据集常用于成像和计算机图像。体图形通常产生与医学成像技术(CT和MRI),体图形也可以用于数学函数或数值解的采样点。

vtkStructuredPoints

vtkStructuredPoints类继承自vtkImageData,是图像数据的一种,要求数据范围与更新范围完全匹配。矢量图数据允许数据范围大于更新范围。StructuredPoints类对原点的定义也与vtkImageData不同。对于结构化点(structured points),原点是第一个点的位置。而图像将原点定义为点(0,0,0)的位置。图像原点存储在ivar中,结构化点具有Set/GetOrigin/Extents的特殊方法。
在这里插入图片描述
从vtkStructuredPoints类的头文件中,可以看到它所有接口都是继承自vtkImageData类,应该是vtkImageData的方法中有根据VTK_STRUCTURED_POINTS类型做了判断处理;

 class VTKCOMMONDATAMODEL_EXPORT vtkStructuredPoints : public vtkImageData
 {
    
    
 public:
   static vtkStructuredPoints* New();
   vtkTypeMacro(vtkStructuredPoints, vtkImageData);
   void PrintSelf(ostream& os, vtkIndent indent) override;
  
   int GetDataObjectType() override {
    
     return VTK_STRUCTURED_POINTS; }
  
 protected:
   vtkStructuredPoints();
   ~vtkStructuredPoints() override = default;
  
 private:
   vtkStructuredPoints(const vtkStructuredPoints&) = delete;
   void operator=(const vtkStructuredPoints&) = delete;
 };

示例代码

圆球的等值面

创建一个262626的图像空间,使用圆球的公式定义距离球心不同距离的像素的值,获取一个等值面;
由于结构化点数据集不能直接显示,所以等值面的重建使用vtkContourFilter类,之前也用它做个等值面的重建;
这里虽然使用了vtkStructuredPoints类,其实使用vtkImageData类也可以实现这个功能;

int i, j, k;
int kOffset, jOffset, offset;
float s, sp, x, y, z;

vtkNew<vtkStructuredPoints> vol;
vol->SetDimensions(26, 26, 26);
vol->SetOrigin(-0.5, -0.5, -0.5);
sp = 1.0 / 25.0;
vol->SetSpacing(sp, sp, sp);

vtkNew<vtkFloatArray> scalars;
scalars->SetNumberOfTuples(26 * 26 * 26);

for (k = 0; k < 26; k++) {
    
    
	z = -0.5 + k * sp;
	kOffset = k * 26 * 26;
	for (j = 0; j < 26; j++) {
    
    
		y = -0.5 + j * sp;
		jOffset = j * 26;
		for (i = 0; i < 26; i++) {
    
    
			x = -0.5 + i * sp;
			s = x * x + y * y + z * z - (0.3*0.3);
			offset = i + jOffset + kOffset;
			scalars->InsertTuple1(offset, s);
		}
	}
}
vol->GetPointData()->SetScalars(scalars);
scalars->Delete();

vtkNew<vtkContourFilter> contour;
contour->SetInputData(vol);
contour->SetValue(10, 10);

vtkNew<vtkPolyDataMapper> volMapper;
volMapper->SetInputConnection(contour->GetOutputPort());
vtkNew<vtkActor> volActor;
volActor->SetMapper(volMapper);
volActor->GetProperty()->SetRepresentationToWireframe();
volActor->GetProperty()->SetColor(0, 0, 0);

vtkNew<vtkRenderer> renderer;
renderer->AddActor(volActor);
renderer->SetBackground(1, 1, 1);
renderer->ResetCamera();
vtkNew<vtkRenderWindow> renWin;
renWin->AddRenderer(renderer);
renWin->SetSize(300, 300);
renWin->Render();

vtkNew<vtkRenderWindowInteractor> iren;
iren->SetRenderWindow(renWin);
iren->Initialize();
iren->Start();

在这里插入图片描述

参考资料

1.《医学图像编程技术》
2.classvtkStructuredPoints

猜你喜欢

转载自blog.csdn.net/liushao1031177/article/details/120428106