vtkLookupTable 颜色映射 设置 vtkPolydata 颜色

Part1 .查表法 vtkLookUpTable

灰度图像映射成伪彩色图像

图像彩色映射的原理是首先生成一个颜色查找表,然后根据图像的一个标量值向颜色查找表中查找对应的颜色,并用新颜色值替代原来的像素值。VTK中vtkImageMapToColors负责图像彩色映射,vtkLookUpTable负责生成颜色查找表
 

Part2 官方样例:

vtkLookupTable 颜色映射 设置 vtkPolydata 颜色_第1张图片

 

this polydata add color;

#include 
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
 

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "vtkPointData.h"
#include "vtkPoints.h"
#include "vtkPolyData.h"
#include "vtkPolyDataMapper.h"
#include 
#include 
#include 
#include //定义颜色映射表

#include //用于创建面
#include //用于将定义的多个面集成到一个组里面
#include //用于创建一个裁剪器
#include 
#include 
using namespace std;

int main(int, char* [])
{

    std::string inputFilename = "E:/project/leftlumen.STL";//stl文件路径

    //读取stl文件
    vtkSmartPointer reader = vtkSmartPointer::New();
    reader->SetFileName(inputFilename.c_str());
    reader->Update();

    //创建对象
    vtkPolyData* cube = vtkPolyData::New();//立方体
    vtkPoints* points = vtkPoints::New();//顶点坐标
    vtkCellArray* polys = vtkCellArray::New();//单元数组

    //存储标量值
    vtkFloatArray* scalars = vtkFloatArray::New();

    vtkPolyData* polydata = reader->GetOutput();

    double* center = polydata->GetCenter();//获取模型的中心
    vtkSmartPointer plane1 = vtkSmartPointer::New();//创建一个平面
    plane1->SetOrigin(center[0], center[1], center[2]);//设置面的中心
    plane1->SetNormal(0.0, 1.0, 1.0);//设置面的法向量

    vtkSmartPointer planes = vtkSmartPointer::New();//创建一个面组的对象
    planes->AddItem(plane1);

    //用于动态创建二维数组,用于存储顶点的索引
    vtkIdType(*y)[3] = new vtkIdType[polydata->GetNumberOfCells()][3];

    //读取细胞单元,并将坐标的索引赋值给二维数组y
    for (int i = 0; i < polydata->GetNumberOfCells(); i++)
    {
        //l1=polydata->GetCell(i)->GetPointIds();
        y[i][0] = polydata->GetCell(i)->GetPointIds()->GetId(0);

        y[i][1] = polydata->GetCell(i)->GetPointIds()->GetId(1);

        y[i][2] = polydata->GetCell(i)->GetPointIds()->GetId(2);

    }

    //存储顶点
    for (int i = 0; i < polydata->GetNumberOfPoints(); i++)
    {
        double x[] = { 0,0,0 };
        polydata->GetPoint(i, x);//获取顶点坐标
        points->InsertPoint(i, x);//将顶点坐标插入到vtkPoints定义的points
    }

    //设定单元
    for (int i = 0; i < polydata->GetNumberOfCells(); i++)
    {
        polys->InsertNextCell(3, y[i]);
    }
    //存储每个顶点的标量值,也就是颜色的索引值,这里暂时是以顶点的先后顺序来设定的
    for (int i = 0; i < polydata->GetNumberOfPoints(); i++)
    {
        scalars->InsertTuple1(i, i);
    }

    //创建多边形数据
    cube->SetPoints(points);
    //设定单元类型为多边形
    cube->SetPolys(polys);
    //设定每个顶点的标量值
    cube->GetPointData()->SetScalars(scalars);

    points->Delete();
    polys->Delete();
    scalars->Delete();

    //定义颜色映射表
    vtkLookupTable* pColorTable = vtkLookupTable::New();

    //设置颜色表中的颜色,下列两种方式都可以
    /*
    pColorTable->SetNumberOfColors(4);
    pColorTable->SetTableValue(0,1.0,0.0,0.0,1.0);
    pColorTable->SetTableValue(0,1.0,0.0,0.0,1.0);
    pColorTable->SetTableValue(1,0.0,1.0,0.0,1.0);
    pColorTable->SetTableValue(2,1.0,1.0,0.0,1.0);
    pColorTable->SetTableValue(3,0.0,0.0,1.0,1.0);
    */
    //设置颜色表中的颜色
    pColorTable->SetNumberOfColors(256);
    pColorTable->SetHueRange(0.67, 0.0);        //色调范围从红色到蓝色

    pColorTable->Build();

    //  vtkSmartPointer clipper = vtkSmartPointer::New();//创建一个裁剪器
    //  clipper->SetInputData(polydata);//设置需要裁剪的数据
    //  clipper->SetClippingPlanes(planes);//设置裁剪的面
      /*
      *设置活动平面,以便从该平面进行裁剪
      *以不同颜色显示。如果没有活动,则将其设置为-1,*默认值是-1。
      */
      //  clipper->SetActivePlaneId(0);
      //  clipper->SetScalarModeToColors();//设置颜色
        //如果要设置颜色,可以用下面的代码。三种状态,对应三种颜色
        /*
        clipper->SetScalarModeToColors();
         clipper->SetClipColor(0.8900, 0.8100, 0.3400); // banana
         clipper->SetBaseColor(1.0000, 0.3882, 0.2784); // tomato
         clipper->SetActivePlaneColor(0.6400, 0.5800, 0.5000); // beige
      */

    //vtkSmartPointerclipper = vtkSmartPointer::New();
    //clipper->SetInputData(cube);//设置切割源
    //clipper->SetClipFunction(plane1);//设置切割函数
    //clipper->GenerateClippedOutputOn();//如果没有这一行,那么切割完后将不会产生polydata数据
    //clipper->Update();//更新切割操作
   //数据映射
    vtkSmartPointer cubeMapper = vtkSmartPointer::New();
    cubeMapper->SetInputData(cube);//获取切割后的数据,作为颜色映射的数据输入源
    cubeMapper->SetScalarRange(0, polydata->GetNumberOfPoints() - 1);
    cubeMapper->SetLookupTable(pColorTable);

    //cubeMapper->SetInputConnection(clipper->GetOutputPort());

        //cubeMapper->SetInputConnection(clipper->GetOutputPort());//将裁剪器与mapper连接起来

    vtkActor* cubeActor = vtkActor::New();
    cubeActor->SetMapper(cubeMapper);
    //cubeActor->GetProperty()->SetInterpolationToFlat();//不会在边缘周围平滑vtkActor的像素。

  // Create a renderer(渲染器), render window and interactor(渲染窗口)
    vtkSmartPointer renderer = vtkSmartPointer::New();
    vtkSmartPointer renderWindow = vtkSmartPointer::New();
    renderWindow->AddRenderer(renderer);
    renderWindow->SetSize(800, 600);//设置窗口大小
    vtkSmartPointer renderWindowInteractor = vtkSmartPointer::New();
    renderWindowInteractor->SetRenderWindow(renderWindow);

    // Add the actors to the scene
    renderer->AddActor(cubeActor);
    renderer->SetBackground(.1, .2, .3); // Background color dark blue

    // Render and interact
    renderWindow->Render();
    renderWindowInteractor->Start();

    return EXIT_SUCCESS;
}

set red to blue;

Result

vtkLookupTable 颜色映射 设置 vtkPolydata 颜色_第2张图片

 

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