zoukankan      html  css  js  c++  java
  • VTK 图形处理之颜色映射

    颜色映射

      颜色映射的操作对象是数据集中的标量属性。它是一种常用的 标量算法。它会根据数据集中各个部分不同的标量值,对各个部分上不同的颜色。与此相关的另一种上色方法是控制演员的颜色属性,但这样整个图形只有单一的颜色,这显然没有颜色映射方法灵活。
      创建多边形数据集程序运行 结果显示的彩色立方体就用到了颜色映射。由于对 立方体的6个顶点设置了不同的标量值(点id),所以这6个点的颜色不同。至于立方体其他部分的颜色,也是通过标量值映射来的,不过这些标量值并不是手动设置,而是根据邻近的顶点的标量值,运用某种内插算法计算出来的。

    颜色映射过程

      假设有一个共256种颜色的查询表,且颜色的索引号范围为0~255,那么颜色映射就是将数据集的标量值映射到这些索引号的过程。在渲染时,与索引号对应的颜色将作为数据中相应部分的颜色显示出来。映射的方法如下图所示。
      
    这里写图片描述

      上图中,scalar表示数据集中的标量值,index表示映射后的索引号。smin和smax表示的是标量值的映射范围(注意不是数据集中标量值的取值范围)。若一个标量值小于smin,则其映射的索引号为0;若一个标量值大于smax,其映射的索引号为255;若一个标量值在这个范围之间,则映射过程就是一个求一元一次函数值的过程,其对应的曲线是一条直线,不过需要对函数值取整。实际上,在范围外的标量值也可以被看作smin和smax,然后对其求函数值。
      在VTK中,颜色映射的过程是由映射器mapper完成的。可以通过调用映射器的方法SetScalarRange()来设置标量值的范围[smin, smax]。映射过程只是为每个标量值确定了一个索引号,最终该标量值映射为何种颜色,还需要看颜色查询表中颜色的分配情况。如果不手动创建一个查询表,则映射器会使用一个默认的映射表。

    示例演示

    CMakeLists.txt文件代码如下:

    1 CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
    2 PROJECT(LookupTableExample)
    3 FIND_PACKAGE(VTK REQUIRED)
    4 INCLUDE(${VTK_USE_FILE})
    5 ADD_EXECUTABLE(LookupTableExample lookuptable.cpp)
    6 TARGET_LINK_LIBRARIES(LookupTableExample ${VTK_LIBRARIES})

    C++代码:

     1 #include "vtkActor.h"
     2 #include "vtkCellArray.h"
     3 #include "vtkFloatArray.h"
     4 #include "vtkPointData.h"
     5 #include "vtkPoints.h"
     6 #include "vtkPolyData.h"
     7 #include "vtkPolyDataMapper.h"
     8 #include "vtkRenderWindow.h"
     9 #include "vtkRenderWindowInteractor.h"
    10 #include "vtkRenderer.h"
    11 #include <vtkLookupTable.h>
    12 #include "vtkSmartPointer.h"
    13 
    14 int main()
    15 {
    16     int i;
    17     //定义立方体的顶点坐标
    18     static float x[8][3] = { { 0, 0, 0 }, { 1, 0, 0 }, { 1, 1, 0 }, { 0, 1, 0 },
    19     { 0, 0, 1 }, { 1, 0, 1 }, { 1, 1, 1 }, { 0, 1, 1 } };
    20     //定义单元,每4个顶点建立一个四边形单元,共计6个单元
    21     static vtkIdType pts[6][4] = { { 0, 1, 2, 3 }, { 4, 5, 6, 7 }, { 0, 1, 5, 4 },
    22     { 1, 2, 6, 5 }, { 2, 3, 7, 6 }, { 3, 0, 4, 7 } };
    23     //创建对象
    24     vtkSmartPointer<vtkPolyData> cube = vtkSmartPointer<vtkPolyData>::New();
    25     vtkSmartPointer<vtkPoints> points = vtkSmartPointer<vtkPoints>::New();
    26     vtkSmartPointer<vtkCellArray> polys = vtkSmartPointer<vtkCellArray>::New();
    27     //存储顶点
    28     for (i = 0; i < 8; i++)
    29         points->InsertPoint(i, x[i]);
    30     //设定单元
    31     for (i = 0; i < 6; i++)
    32         polys->InsertNextCell(4, pts[i]);
    33 
    34     //存储标量值
    35     vtkSmartPointer<vtkFloatArray> scalars = vtkSmartPointer<vtkFloatArray>::New();
    36     //设定每个顶点的标量值
    37     for (i = 0; i < 8; i++)
    38         scalars->InsertTuple1(i,  i*4);
    39     //创建多边形数据
    40     cube->SetPoints(points);
    41     //设定单元类型为多边形
    42     cube->SetPolys(polys);
    43     //设定每个顶点的标量值
    44     cube->GetPointData()->SetScalars(scalars);
    45     //定义颜色映射表
    46     vtkSmartPointer<vtkLookupTable> pColorTable = vtkSmartPointer<vtkLookupTable>::New();
    47     //设置颜色表中的颜色
    48     pColorTable->SetNumberOfColors(256);
    49     pColorTable->SetHueRange(0.67, 0.0);        //色调范围从红色到蓝色
    50     pColorTable->Build();
    51     //数据映射
    52     vtkSmartPointer<vtkPolyDataMapper> cubeMapper = vtkSmartPointer<vtkPolyDataMapper>::New();
    53     cubeMapper->SetInputData(cube);
    54     cubeMapper->SetScalarRange(0, 7);
    55     cubeMapper->SetLookupTable(pColorTable);
    56     vtkSmartPointer<vtkActor> cubeActor = vtkSmartPointer<vtkActor>::New();
    57     cubeActor->SetMapper(cubeMapper);
    58 
    59     vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
    60     vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
    61     renWin->AddRenderer(renderer);
    62     vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
    63     iren->SetRenderWindow(renWin);
    64     renderer->AddActor(cubeActor);
    65     renderer->SetBackground(1, 1, 1);
    66     renWin->SetSize(500, 500);
    67     renWin->Render();
    68     iren->Start();
    69     return 0;
    70 }

    运行结果:

    这里写图片描述

    分析

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

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

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

    
    
  • 相关阅读:
    定义函数的三种形式
    函数的定义
    文件修改的两种方式
    文件的高级应用
    with管理文件操作上下文
    SQL Server 823,824 错误
    SQL Server 无法启动的 4 种原因
    SQL Server 查看正在运行的事务信息的 2 种方法。
    MySQL 指定数据库字符集的 3 种方法。
    MYSQL 注释的 3 方法
  • 原文地址:https://www.cnblogs.com/ybqjymy/p/13984752.html
Copyright © 2011-2022 走看看