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()結合使用,以用來指定用於顏色映射的數據

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM