VTK 體繪制討論_顏色傳輸函數


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顏色定義顏色傳輸函數,第四元數據用於定義不同明度傳輸函數。
需要注意的是,兩種方式都是利用最后一元數據來計算梯度,並決定梯度不透明度傳輸函數。


免責聲明!

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



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