5.6 图像颜色映射
5.6 圖像顏色映射
5.6.1 圖像灰度映射
vtkImageLuminance負(fù)責(zé)將一個(gè)RGB彩色圖像轉(zhuǎn)換為一個(gè)單組分的灰度圖像。映射公式如下:
luminance = 0.3*R + 0.59*G + 0.11*B
該公式中,R為輸入圖像的第一分量(紅色),G為第二分量(綠色),B為第三分量(藍(lán)色)。這個(gè)計(jì)算結(jié)果計(jì)算一個(gè)RGB顏色的亮度。該類的使用也比較簡(jiǎn)單,用戶無(wú)須設(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圖像,通過(guò)vtkImageLuminance轉(zhuǎn)換為灰度圖像,執(zhí)行結(jié)果如圖5.14下:
圖5.14 VTK圖像灰度映射
5.6.2 提取顏色分量
VTK中利用vtkImageExtractComponents可以方便的提取出彩色圖像的各個(gè)顏色分量,該類的使用比較簡(jiǎn)單,只需要設(shè)置要提取的分量序號(hào)即可。下面代碼說(shuō)明了怎樣提取彩色圖像的某個(gè)顏色分量。
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();代碼中定義了三個(gè)vtkImageExtractComponents對(duì)象,分別用來(lái)提取紅、綠和藍(lán)色分量圖像,函數(shù)SetComponents用來(lái)設(shè)置要提取的分量號(hào),紅綠藍(lán)分別對(duì)應(yīng)0,1和2。設(shè)置完畢后執(zhí)行Update()即可得到每個(gè)一個(gè)分量部分。其輸出為vtkImageData,每一個(gè)顏色分量數(shù)據(jù)即是一個(gè)灰度圖像。下圖為提取一個(gè)彩色圖像三個(gè)分量圖像的結(jié)果:
圖5.15 提取VTK彩色圖像分量
5.6.3 圖像彩色映射
圖像彩色映射的原理是首先生成一個(gè)顏色查找表,然后根據(jù)圖像的一個(gè)標(biāo)量值向顏色查找表中查找對(duì)應(yīng)的顏色,并用新顏色值替代原來(lái)的像素值。VTK中vtkImageMapToColors負(fù)責(zé)圖像彩色映射,vtkLookUpTable負(fù)責(zé)生成顏色查找表。下面代碼說(shuō)明了怎樣進(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();首先讀取了一個(gè)灰度圖像,然后生成vtkLookUpTable顏色查找表。構(gòu)造顏色查找表有兩種方法,一種是直接添加顏色,另一種是設(shè)置HSV顏色空間變化范圍(hue, saturation, value),然后自動(dòng)生成顏色表。這里采用的是第二種方法,SetRange 設(shè)置要映射的標(biāo)量數(shù)據(jù)的范圍;SetHueRange設(shè)置HSV顏色空間的Hue值范圍,最大范圍為[0,1]; SetValueRange設(shè)置HSV顏色空間的Value范圍,最大范圍為[0, 1];設(shè)置完后,調(diào)用Build()來(lái)生成顏色查找表。接下來(lái)定義vtkImageMapToColors對(duì)象, SetLookupTable()設(shè)置相應(yīng)的顏色查找表,執(zhí)行Update()后,其輸出為一副彩色圖像。執(zhí)行結(jié)果如下:
圖5.16 圖像彩色映射
5.6.4 顏色合成
前面我們學(xué)習(xí)了可以提取彩色的圖像的各個(gè)顏色分量,那么我們同樣也可以將灰度圖像合并成為一個(gè)彩色圖像。VTK中提供vtkImageAppendComponents類來(lái)合成彩色圖像,其輸入需要提供三個(gè)灰度圖像。下面我們來(lái)看一個(gè)實(shí)例。
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個(gè)二值圖像,每個(gè)圖像中繪制了一個(gè)白色矩形,并且三個(gè)矩形有部分重疊,然后定義vtkImageAppendComponents對(duì)象,并將三個(gè)圖像設(shè)置為vtkImageAppendComponents對(duì)象的輸入來(lái)合成圖像。合成的效果為三個(gè)圖像中對(duì)應(yīng)的三個(gè)像素點(diǎn)像素值合成為輸出圖像的RGB像素值,如三個(gè)圖像中第100個(gè)像素的像素值分別為,255,0和0,那么該點(diǎn)在輸出圖像中的像素值為(255, 0, 0),顯示為紅色。本例的執(zhí)行效果如下:
圖5.17 顏色合成
==========歡迎轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)保留該聲明信息==========
版權(quán)歸@東靈工作室所有,更多信息請(qǐng)?jiān)L問(wèn)東靈工作室
教程系列導(dǎo)航:http://blog.csdn.net/www_doling_net/article/details/8763686
總結(jié)
以上是生活随笔為你收集整理的5.6 图像颜色映射的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Adobe illustrator 导出
- 下一篇: 看生物信息学如何聚焦特定表型,探索分子机