VTK图像处理颜色映射(二)

在VTK中,颜色映射的过程是由映射器mapper完成的。最终该标量值映射为何种颜色,还需要看颜色查询表中颜色的分配情况。如果不手动创建一个查询表,则映射器会使用一个默认的映射表。
我们可以手动创建一个颜色查找表,颜色查找表中允许我们自由设定颜色值。vtkLookupTable可以帮助我们来完成这个工作。

//定义一个颜色查找表
vtkLookupTable *lut=vtkLookupTable::New();
//设置需要映射的颜色的数目
lut->SetNumberOfTableValues(static_cast(vtkCells.size()/*cellIds->GetNumberOfIds()*/));
//设置颜色值的映射范围,如,我需要把0-100范围的数值通过颜色查
//找表获取一个标量值
lut->SetTableRange(0,100);
lut->Build();

……

//定义一个颜色标量
vtkUnsignedCharArray *cellData = vtkUnsignedCharArray::New();
cellData->SetNumberOfComponents(3);

	for (auto it = vtkCells.begin(); it != vtkCells.end(); it++)
	{
		//cout << "id: " << it->first << " " << "distance: " << it->second<< endl;
	
		distance = it->second;
		//get the rgb value from lut table according to the distance value
		
		lut->GetColor(static_cast(distance), rgb);
	
	
		//convert the distance value to rgb value 
		for (size_t j = 0; j < 3; j++)
		{
			ucrgb[j] = static_cast(rgb[j] * 255);
		
		}
		cellData->InsertTuple(it->first, ucrgb);


	}
	boneSurfG->GetOutput()->GetCellData()->SetScalars(cellData);
	
	//将数据可视化
	//Mapper,Actor,Render
	vtkSmartPointer boneMapper =
		vtkSmartPointer::New();
	boneMapper->SetInputData(boneSurf);
	vtkSmartPointer boneActor =
		vtkSmartPointer::New();
	boneMapper->SetScalarModeToUseCellData();
	
	boneMapper->Update();
	//delete original color
	//boneMapper->ScalarVisibilityOff();
	boneActor->SetMapper(boneMapper);
	……
	renderer->AddActor(boneActor);
	……
	renderWindowInteractor->Start();

以上介绍的是lookupTable的用法
下面是颜色映射在可视化的时候根据不同需要会使用到的映射方法

有时候,标量数据就是颜色值,并不需要通过查询表进行映射。对此,映射器提供了以下一些方法来进行控制。
● SetColorModeToDefault()该方法执行默认的映射器行为,即把unsigned char类型的标量属性数据当作颜色值,不执行隐式。对于其他类型的标量数据,将通过查询表映射。
● SetColorModeToMapScalars()无论变量数据是何种类型,该方法都通过查询表对标量数据进行映射。如果标量数据的每个元组有多个分量,则对第0个分量进行映射。

注意事项:

  1. 如果没有标量数据,则映射器将不能使用查询表控制对象的颜色。这时可以使用演员对象来控制颜色。
  2. 如果想阻止颜色映射,可调用映射器的ScalarVisibilityOff()方法。

调用ScalarVisibilityOn()方法后,可以控制映射器的颜色映射行为:
● SetScalarModeToDefault()执行默认的映射行为:如果有点标量属性数据,则用其进行映射,如果没有点标量属性数据但有单元标量属性数据,则用单元标量属性数据进行映射,否则不映射。
● SetScalarModeToUsePointData()总是使用点标量属性数据进行映射的。如果没有嗲按标量属性数据,就不进行映射。
● SetScalarModeToUseCellData()总是使用单元标量属性数据进行映射的。如果没有单元标量属性数据,就不进行映射。
● SetScalarModeToUsePointFieldData()不使用点或单元标量属性数据,而是使用点属性数据中的一般属性数据来进行映射的。该方法应该与ColorByArrayComponent()结合使用,以用来指定用于颜色映射的数据。
● SetScalarModeToUseCellFieldData()不使用点或单元标量属性数据,而是使用单元属性数据中的一般属性数据来进行映射的。该方法应该与ColorByArrayComponent()结合使用,以用来指定用于颜色映射的数据。

你可能感兴趣的:(C++,VTK)