5.6 图像颜色映射
5.6 圖像顏色映射
5.6.1 圖像灰度映射
vtkImageLuminance負(fù)責(zé)將一個RGB彩色圖像轉(zhuǎn)換為一個單組分的灰度圖像。映射公式如下:
luminance = 0.3*R + 0.59*G + 0.11*B
該公式中,R為輸入圖像的第一分量(紅色),G為第二分量(綠色),B為第三分量(藍(lán)色)。這個計算結(jié)果計算一個RGB顏色的亮度。該類的使用也比較簡單,用戶無須設(shè)置參數(shù),代碼如下:
1: vtkSmartPointer<vtkBMPReader> reader = 2: vtkSmartPointer<vtkBMPReader>::New(); 3: reader->SetFileName ( "..\\lena.bmp" ); 4: 5: vtkSmartPointer<vtkImageLuminance> luminanceFilter = 6: vtkSmartPointer<vtkImageLuminance>::New(); 7: luminanceFilter->SetInput(reader->GetOutput()); 8: luminanceFilter->Update();上例中讀入一副RGB彩色Lena圖像,通過vtkImageLuminance轉(zhuǎn)換為灰度圖像,執(zhí)行結(jié)果如圖5.14下:
圖5.14 VTK圖像灰度映射
5.6.2 提取顏色分量
VTK中利用vtkImageExtractComponents可以方便的提取出彩色圖像的各個顏色分量,該類的使用比較簡單,只需要設(shè)置要提取的分量序號即可。下面代碼說明了怎樣提取彩色圖像的某個顏色分量。
1: vtkSmartPointer<vtkBMPReader> reader = 2: vtkSmartPointer<vtkBMPReader>::New(); 3: reader->SetFileName ( "..\\lena.bmp" ); 4: 5: vtkSmartPointer<vtkImageExtractComponents> extractRedFilter = 6: vtkSmartPointer<vtkImageExtractComponents>::New(); 7: extractRedFilter->SetInputConnection(reader->GetOutputPort()); 8: extractRedFilter->SetComponents(0); 9: extractRedFilter->Update(); 10: 11: vtkSmartPointer<vtkImageExtractComponents> extractGreenFilter = 12: vtkSmartPointer<vtkImageExtractComponents>::New(); 13: extractGreenFilter->SetInputConnection(reader->GetOutputPort()); 14: extractGreenFilter->SetComponents(1); 15: extractGreenFilter->Update(); 16: 17: vtkSmartPointer<vtkImageExtractComponents> extractBlueFilter = 18: vtkSmartPointer<vtkImageExtractComponents>::New(); 19: extractBlueFilter->SetInputConnection(reader->GetOutputPort()); 20: extractBlueFilter->SetComponents(2); 21: extractBlueFilter->Update();代碼中定義了三個vtkImageExtractComponents對象,分別用來提取紅、綠和藍(lán)色分量圖像,函數(shù)SetComponents用來設(shè)置要提取的分量號,紅綠藍(lán)分別對應(yīng)0,1和2。設(shè)置完畢后執(zhí)行Update()即可得到每個一個分量部分。其輸出為vtkImageData,每一個顏色分量數(shù)據(jù)即是一個灰度圖像。下圖為提取一個彩色圖像三個分量圖像的結(jié)果:
圖5.15 提取VTK彩色圖像分量
5.6.3 圖像彩色映射
圖像彩色映射的原理是首先生成一個顏色查找表,然后根據(jù)圖像的一個標(biāo)量值向顏色查找表中查找對應(yīng)的顏色,并用新顏色值替代原來的像素值。VTK中vtkImageMapToColors負(fù)責(zé)圖像彩色映射,vtkLookUpTable負(fù)責(zé)生成顏色查找表。下面代碼說明了怎樣進(jìn)行彩色映射。
1: vtkSmartPointer<vtkJPEGReader> reader = 2: vtkSmartPointer<vtkJPEGReader>::New(); 3: reader->SetFileName ( "G:\\Project\\VTK\\Examples\\source\\images\\lena2.jpg" ); 4: 5: vtkSmartPointer<vtkLookupTable> colorTable = 6: vtkSmartPointer<vtkLookupTable>::New(); 7: colorTable->SetRange( 0.0, 255.0 ); 8: colorTable->SetHueRange( 0.1, 0.5 ); 9: colorTable->SetValueRange( 0.6, 1.0 ); 10: colorTable->Build(); 11: 12: vtkSmartPointer<vtkImageMapToColors> colorMap = 13: vtkSmartPointer<vtkImageMapToColors>::New(); 14: colorMap->SetInputConnection( reader->GetOutputPort() ); 15: colorMap->SetLookupTable( colorTable ); 16: colorMap->Update();首先讀取了一個灰度圖像,然后生成vtkLookUpTable顏色查找表。構(gòu)造顏色查找表有兩種方法,一種是直接添加顏色,另一種是設(shè)置HSV顏色空間變化范圍(hue, saturation, value),然后自動生成顏色表。這里采用的是第二種方法,SetRange 設(shè)置要映射的標(biāo)量數(shù)據(jù)的范圍;SetHueRange設(shè)置HSV顏色空間的Hue值范圍,最大范圍為[0,1]; SetValueRange設(shè)置HSV顏色空間的Value范圍,最大范圍為[0, 1];設(shè)置完后,調(diào)用Build()來生成顏色查找表。接下來定義vtkImageMapToColors對象, SetLookupTable()設(shè)置相應(yīng)的顏色查找表,執(zhí)行Update()后,其輸出為一副彩色圖像。執(zhí)行結(jié)果如下:
圖5.16 圖像彩色映射
5.6.4 顏色合成
前面我們學(xué)習(xí)了可以提取彩色的圖像的各個顏色分量,那么我們同樣也可以將灰度圖像合并成為一個彩色圖像。VTK中提供vtkImageAppendComponents類來合成彩色圖像,其輸入需要提供三個灰度圖像。下面我們來看一個實例。
1: vtkSmartPointer<vtkImageCanvasSource2D> red = 2: vtkSmartPointer<vtkImageCanvasSource2D>::New(); 3: red->SetScalarTypeToUnsignedChar(); 4: red->SetNumberOfScalarComponents(1); 5: red->SetExtent(0, 100, 0, 100, 0, 0); 6: red->SetDrawColor(0, 0, 0, 0); 7: red->FillBox(0,100,0,100); 8: red->SetDrawColor(255, 0, 0, 0); 9: red->FillBox(20,40,20,40); 10: red->Update(); 11: 12: vtkSmartPointer<vtkImageCanvasSource2D> green = 13: vtkSmartPointer<vtkImageCanvasSource2D>::New(); 14: green->SetScalarTypeToUnsignedChar(); 15: green->SetNumberOfScalarComponents(1); 16: green->SetExtent(0, 100, 0, 100, 0, 0); 17: green->SetDrawColor(0, 0, 0, 0); 18: green->FillBox(0,100,0,100); 19: green->SetDrawColor(255, 0, 0, 0); 20: green->FillBox(30,50,30,50); 21: green->Update(); 22: 23: vtkSmartPointer<vtkImageCanvasSource2D> blue = 24: vtkSmartPointer<vtkImageCanvasSource2D>::New(); 25: blue->SetScalarTypeToUnsignedChar(); 26: blue->SetNumberOfScalarComponents(1); 27: blue->SetExtent(0, 100, 0, 100, 0, 0); 28: blue->SetDrawColor(0, 0, 0, 0); 29: blue->FillBox(0,100,0,100); 30: blue->SetDrawColor(255, 0, 0, 0); 31: blue->FillBox(40,60,40,60); 32: blue->Update(); 33: 34: vtkSmartPointer<vtkImageAppendComponents> appendFilter = 35: vtkSmartPointer<vtkImageAppendComponents>::New(); 36: appendFilter->SetInputConnection(0, red->GetOutputPort()); 37: appendFilter->AddInputConnection(0, green->GetOutputPort()); 38: appendFilter->AddInputConnection(0, blue->GetOutputPort()); 39: appendFilter->Update();上面代碼中利用vtkImageCanvasSource2D定義了3個二值圖像,每個圖像中繪制了一個白色矩形,并且三個矩形有部分重疊,然后定義vtkImageAppendComponents對象,并將三個圖像設(shè)置為vtkImageAppendComponents對象的輸入來合成圖像。合成的效果為三個圖像中對應(yīng)的三個像素點像素值合成為輸出圖像的RGB像素值,如三個圖像中第100個像素的像素值分別為,255,0和0,那么該點在輸出圖像中的像素值為(255, 0, 0),顯示為紅色。本例的執(zhí)行效果如下:
圖5.17 顏色合成
==========歡迎轉(zhuǎn)載,轉(zhuǎn)載時請保留該聲明信息==========
版權(quán)歸@東靈工作室所有,更多信息請訪問東靈工作室
教程系列導(dǎo)航:http://blog.csdn.net/www_doling_net/article/details/8763686
總結(jié)
以上是生活随笔為你收集整理的5.6 图像颜色映射的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Adobe illustrator 导出
- 下一篇: 看生物信息学如何聚焦特定表型,探索分子机