1.顏色傳輸函數
顏色傳輸函數與不透明度傳輸函數的使用類似,二者的不同之處在於顏色傳輸函數是將一個標量值映射為顏色值。這個顏色值可以是RGB值,也可以是HSV值。VTK顏色傳輸函數采用VTKColorTransferFunction類實現,其函數為:1 int AddRGBPoint(double x,double r,double g, double b); 2 int AddHSVPoint(double x,double h,double s,double v);這樣就可以實現一個RGB斷點或者HSV斷點的添加,其中x表示像素灰度值,r,g,b為映射的RGB分量,h,s,v為映射的HSV顏色分量。當然,顏色傳輸函數也支持添加線段的方法。1 void AddRGBSegment(double x1, double r1,double g1,double b1, double x2,double r2,double g2,double b2); 2 void AddHSVSegment(double x1, double h1,double s1,double v1, double x2,double h2,double s2,double v2);顏色傳輸函數標准代碼片如下:
1 vtkSmartPointer<vtkColorTransferFunction> color = 2 vtkSmartPointer<vtkColorTransferFunction>::New(); 3 color->AddRGBPoint(0, 0, 0, 0); 4 color->AddRGBPoint(64, 1.0, 0.52, 0.3); 5 color->AddRGBPoint(190.0, 1.00, 1.00, 1.00); 6 color->AddRGBPoint(220.0, 0.20, 0.20, 0.20);由於VTKVolumeProperty接受兩種形式的顏色傳輸函數(灰度或者RGB),一次在獲取相應的顏色傳輸函數時,需要首先判斷VTKVolumeProperty已經設置的顏色傳輸類型,其函數為:
int GetColorChannels();如果返回為1,則說明設置的是灰度傳輸函數;如果返回為3,則說明設置的是彩色RGB傳輸函數。根據不同的類型既可通過如下函數獲取有效的傳輸函數:1 VTKColorTransferFunction* GetRGBTransferFunction(); 2 vtkPiecewiseFunction* GetGrayTransferFunction();
2.多元數據體繪制渲染
前面只要討論了設置標量圖像體繪制的不透明度傳輸函數、梯度不透明度傳輸函數和顏色傳輸函數。而多元數據體繪制渲染時需要根據數據區別對待。如果多元數據的各個組分是相互獨立的,則可以為每個組分單獨設置相應的不透明度、梯度不透明度、顏色傳輸函數。在位VTKVolumeProperty設置相應傳輸函數時,應為多元數據組分較多,所以需要在函數中指定一個索引號,表示當前為那個組分設置,標准代碼片如下:1 void SetScalarOpacity(int index, vtkPiecewiseFunction* function); 2 void SetGradientOpacity(int index, vtkPiecewiseFunction* function); 3 void SetColor(int index, vtkPiecewiseFunction* function); 4 void SetColor(int index, vtkColorTransferFunction* function);多元數據的組分可能是非獨立的,例如,RGB圖像中每個像素的顏色值是由R.G.B三個顏色組分共同定義的。vtkVolumeMapper支持兩種類型的非獨立多元數據。
需要注意的是,兩種方式都是利用最后一元數據來計算梯度,並決定梯度不透明度傳輸函數。
- 第一種是二元數據。第一元數據用於定義顏色傳輸函數,第二元數據用於定義不透明度傳輸函數;
- 第二種是四元數據。前三元數據作為一個R.G.B顏色定義顏色傳輸函數,第四元數據用於定義不同明度傳輸函數。
