颜色映射
对于目标不想显示的灰度值/标量值可以设置颜色映射的透明度为0,使它“消失”
vtkLookupTable 会自动线性映射
// 创建 LookupTable
auto lut = vtkSmartPointer<vtkLookupTable>::New();
lut->SetNumberOfTableValues(3);
lut->Build();
lut->setRange(humin, humax);
lut->SetTableValue(0, 1.0, 0.0, 0.0);
lut->SetTableValue(1, 0.0, 1.0, 0.0);
lut->SetTableValue(2, 0.0, 0.0, 1.0);
build–我理解类似于update,把颜色设置到lut的内部结构中 modifyed–通知相连的管线更新 对于这个颜色映射如果标量数小于lut颜色数,可能会不线性映射,直接一一对应。有点奇怪,也可能需要将mapper(SetScalarRange)设置范围?
vtkColorTransferFunction 一一对应的颜色映射
在polydata中使用
auto sphere = vtkSmartPointer<vtkSphereSource>::New();
sphere->SetThetaResolution(30);
sphere->SetPhiResolution(30);
sphere->Update();
auto polydata = sphere->GetOutput();
// 给每个点设置标量值 (这里用 Z 坐标作为标量)
auto scalars = vtkSmartPointer<vtkFloatArray>::New();
for(vtkIdType i = 0; i < polydata->GetNumberOfPoints(); i++)
{
double p[3];
polydata->GetPoint(i, p);
scalars->InsertNextValue(p[2]); // Z坐标
}
polydata->GetPointData()->SetScalars(scalars);
// 创建颜色映射函数
auto ctf = vtkSmartPointer<vtkColorTransferFunction>::New();
ctf->AddRGBPoint(-1.0, 0.0, 0.0, 1.0); // 蓝色
ctf->AddRGBPoint(0.0, 0.0, 1.0, 0.0); // 绿色
ctf->AddRGBPoint(1.0, 1.0, 0.0, 0.0); // 红色
// 创建 Mapper
auto mapper = vtkSmartPointer<vtkPolyDataMapper>::New();
mapper->SetInputData(polydata);
mapper->SetLookupTable(ctf);
mapper->SetColorModeToMapScalars();
mapper->SetScalarRange(polydata->GetScalarRange());
// 创建 Actor
auto actor = vtkSmartPointer<vtkActor>::New();
actor->SetMapper(mapper);
// 创建 Renderer 和 RenderWindow
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddActor(actor);
renderer->SetBackground(0.1, 0.1, 0.1);
在volume中使用
// 创建颜色传递函数
auto colorFunc = vtkSmartPointer<vtkColorTransferFunction>::New();
colorFunc->AddRGBPoint(0, 0.0, 0.0, 0.0); // 黑
colorFunc->AddRGBPoint(128, 1.0, 0.0, 0.0); // 红
colorFunc->AddRGBPoint(255, 1.0, 1.0, 1.0); // 白
// 创建不透明度传递函数
auto opacityFunc = vtkSmartPointer<vtkPiecewiseFunction>::New();
opacityFunc->AddPoint(0, 0.0);
opacityFunc->AddPoint(128, 0.2);
opacityFunc->AddPoint(255, 0.8);
// 设置体属性
auto volumeProperty = vtkSmartPointer<vtkVolumeProperty>::New();
volumeProperty->SetColor(colorFunc);
volumeProperty->SetScalarOpacity(opacityFunc);
volumeProperty->ShadeOn();
volumeProperty->SetInterpolationTypeToLinear();
// 创建 GPU Volume Mapper 或者使用通用的vtkSmartVolumeMapper
auto volumeMapper = vtkSmartPointer<vtkGPUVolumeRayCastMapper>::New();
volumeMapper->SetInputData(imageData);
// 创建体 Actor
auto volume = vtkSmartPointer<vtkVolume>::New();
volume->SetMapper(volumeMapper);
volume->SetProperty(volumeProperty);
// Renderer
auto renderer = vtkSmartPointer<vtkRenderer>::New();
renderer->AddVolume(volume);
renderer->SetBackground(0.1, 0.1, 0.1);
注意在做等值面提取时, 提取到的标量值是第二个参数,第一个参数等值面索引
auto contourFilter = vtkSmartPointer<vtkContourFilter>::New();
contourFilter->SetInputData(imageData);
contourFilter->SetValue(0, threshold);
contourFilter->Update();
auto polydata = contourFilter->GetOutput();
auto scalars = polydata->GetPointData()->GetScalars();
if (!scalars) {
std::cout << "No scalars found!" << std::endl;
} else {
std::cout << "Number of points: " << polydata->GetNumberOfPoints() << std::endl;
for (vtkIdType j = 0; j < polydata->GetNumberOfPoints(); ++j) {
double val = scalars->GetTuple1(j);
std::cout << "Point " << j << " scalar: " << val << std::endl;
}
}