日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

VTK修炼之道20:图像基本操作_图像类型转换

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道20:图像基本操作_图像类型转换 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.vtkImageCast

圖像數(shù)據(jù)類型轉(zhuǎn)換在數(shù)字圖像處理中會(huì)被頻繁地用到。一些常用到的圖像算子(例如梯度算子)在計(jì)算時(shí)出于精度的考慮,會(huì)將結(jié)果存儲(chǔ)為float或者double類型。但是在圖像顯示時(shí),一般需要圖像為unsigned char類型。

VTK中最常用到的是VTKImageCast類型。其使用方法如下:

vtkSmartPointer<vtkImageCast> imgCast = vtkSmartPointer<vtkImageCast>::New(); imgCast->SetInput( (vtkDataObject*)reader->GetOutput() ); imgCast->SetOutputScalarTypeToFloat(); imgCast->Update();當(dāng)我們需要把圖像轉(zhuǎn)換成不同的類型進(jìn)行計(jì)算時(shí),只需要把SetOutputScalarTypeToXXX()設(shè)置成相應(yīng)的輸出類型即可。

需要注意的是,這個(gè)類中還有一個(gè)變量是ClampQverflow,用來標(biāo)識(shí)是否組要截?cái)鄶?shù)據(jù)。默認(rèn)情況下,該變量值為0;當(dāng)設(shè)置為1時(shí),輸出的像素值不能超過輸出類型的最大值。超過時(shí)會(huì)自動(dòng)截?cái)嗟阶畲笾怠?/span>

此外還需要知道的就是,這個(gè)類進(jìn)行類型轉(zhuǎn)換時(shí),只是將類型進(jìn)行強(qiáng)制轉(zhuǎn)換,而沒有進(jìn)行比例的縮放,因此使用起來會(huì)比較受限,因此VTK中時(shí)不推薦使用這個(gè)類的,例如一副double類型的圖像,圖像值的范圍[-1,1]。如果需要將圖像轉(zhuǎn)化為unsigned char類型,這種方法是不可行的!

2.vtkImageShiftScale

這個(gè)類時(shí)用起來要比上一類更加的靈活。他可以指定偏移和比例參數(shù)來對輸入圖像數(shù)據(jù)進(jìn)行操作,例如一副double類型的圖像,其數(shù)值范圍為[-1,1],如果將其轉(zhuǎn)換為unsigned char類型,需要設(shè)置shift=+1,Scale=127.5;那么輸入圖像的數(shù)據(jù)-1可以被映射為(-1+1)*127.5=0;+1可以被映射為(1+1)*127.5=255。具體使用方法如下所示:


vtkSmartPointer<vtkImageShiftScale> ShiftScale = vtkSmartPointer<vtkImageShiftScale>::New(); ShiftScale->SetInputConnection(img->GetOProducerPort()); ShiftScale->SetOutputScalarTypeToUnsignedChar(); ShiftScale->SetShift(1); ShiftScale->SetScale(127.5); ShiftScale->Update();

3.實(shí)驗(yàn)源碼


#include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkImageCast.h> #include <vtkImageShiftScale.h> #include <vtkBMPReader.h> #include <vtkMetaImageReader.h> #include <vtkImageViewer2.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h>int main() {vtkSmartPointer<vtkMetaImageReader> reader =vtkSmartPointer<vtkMetaImageReader>::New(); //讀*.mhd文件reader->SetFileName("brain.mhd");reader->Update();//第一種類型轉(zhuǎn)換方案vtkSmartPointer<vtkImageCast> imgCast =vtkSmartPointer<vtkImageCast>::New();imgCast->SetInputData( (vtkDataObject *) reader->GetOutput() );imgCast->SetOutputScalarTypeToFloat();//第二種類型轉(zhuǎn)換方案vtkSmartPointer<vtkImageShiftScale> imgShiftScale =vtkSmartPointer<vtkImageShiftScale>::New();imgShiftScale->SetInputData((vtkDataObject*)reader->GetOutput());imgShiftScale->SetOutputScalarTypeToFloat();vtkSmartPointer<vtkImageViewer2> imgViewer =vtkSmartPointer<vtkImageViewer2>::New();imgViewer->SetInputConnection(imgCast->GetOutputPort());vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();imgViewer->SetupInteractor(rwi);imgViewer->SetColorLevel(500);imgViewer->SetColorWindow(2000);imgViewer->SetSlice(20);imgViewer->SetSliceOrientationToXY();imgViewer->Render();/*imgViewer->GetRenderer()->ResetCamera();imgViewer->Render();*/imgViewer->GetRenderer()->SetBackground(1.0, 1.0, 1.0);imgViewer->SetSize(640, 480);imgViewer->GetRenderWindow()->SetWindowName("ImageTypeTrans");rwi->Start();return 0; }

4.參考資料

1.《C++ primer》
2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.

總結(jié)

以上是生活随笔為你收集整理的VTK修炼之道20:图像基本操作_图像类型转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。