VTK修炼之道30:图像重采样_降采样和升采样技术
生活随笔
收集整理的這篇文章主要介紹了
VTK修炼之道30:图像重采样_降采样和升采样技术
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.VTK中的圖像重采樣實現
圖像重采樣是指對采樣后形成的由離散數據組成的數字圖像按所需的像元位置或像元問距重新采樣,以構成幾何變換后的新圖像。重采樣過程本質上是圖像恢復過程,它用輸入的離散數字圖像重建代表原始圖像二維連續函數,再按新的像元間距和像元位置進行采樣。其數學過程是根據重建的連續函數(曲面),用周圍若干像元點的值估計或內插出新采樣點的值。圖像重采樣在圖像處理中應用非常廣泛,如SIFT特征提取。圖像重采樣后圖像的維數會發生改變。當重采樣圖像小于原圖像維數時,稱為降采樣;當重采樣圖像維數大于原圖像時,稱為升采樣。VTK中可以方便的對圖像進行重采樣。vtkImageShrink3D類實現圖像降采樣。降采樣需要設置每個方向的采樣率,降采樣率越大,圖像越模糊。升采樣的原理與降采樣原理一致,只是增加采樣點數來增加圖像的維數。VTK中vtkImageMagnify來實現圖像的升采樣。 實驗代碼如下所示: #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRenderingOpenGL);#include <vtkSmartPointer.h> #include <vtkBMPReader.h> #include <vtkImageData.h> #include <vtkImageShrink3D.h> //降采樣頭文件 #include <vtkImageMagnify.h> //升采樣頭文件 #include <vtkImageActor.h> #include <vtkRenderer.h> #include <vtkRenderWindow.h> #include <vtkRenderWindowInteractor.h> #include <vtkInteractorStyleImage.h> //交互樣式int main() {vtkSmartPointer<vtkBMPReader> reader =vtkSmartPointer<vtkBMPReader>::New();reader->SetFileName("lena.bmp");reader->Update();vtkSmartPointer<vtkImageShrink3D> shrinkFilter =vtkSmartPointer<vtkImageShrink3D>::New();shrinkFilter->SetInputConnection(reader->GetOutputPort());//建立管道shrinkFilter->SetShrinkFactors(16, 16, 1);//設置降采樣率shrinkFilter->Update();vtkSmartPointer<vtkImageMagnify> magnifyFilter =vtkSmartPointer<vtkImageMagnify>::New();magnifyFilter->SetInputConnection(reader->GetOutputPort());magnifyFilter->SetMagnificationFactors(10, 10, 1);magnifyFilter->Update();int originalDims[3];reader->GetOutput()->GetDimensions(originalDims);double originalSpacing[3];reader->GetOutput()->GetSpacing(originalSpacing);int shrinkDims[3];shrinkFilter->GetOutput()->GetDimensions(shrinkDims);double shrinkSpacing[3];shrinkFilter->GetOutput()->GetSpacing(shrinkSpacing);int magnifyDims[3];magnifyFilter->GetOutput()->GetDimensions(magnifyDims);double magnifuSpacing[3];magnifyFilter->GetOutput()->GetSpacing(magnifuSpacing);std::cout << "原始維度: " << originalDims[0] << "*" << originalDims[1] << "*" << originalDims[2] << std::endl;std::cout << "原始像素間距: " << originalSpacing[0] << " " << originalSpacing[1] << " " << originalSpacing[2] << std::endl;std::cout << "降采樣維度: " << shrinkDims[0] << "*" << shrinkDims[1] << "*" << shrinkDims[2] << std::endl;std::cout << "降采樣像素間距:" << shrinkSpacing[0] << " " << shrinkSpacing[1] << " " << shrinkSpacing[2] << std::endl;std::cout << "升采樣維度: " << magnifyDims[0] << "*" << magnifyDims[1] << "*" << magnifyDims[2] << std::endl;std::cout << "升采樣像素間距:" << magnifuSpacing[0] << " " << magnifuSpacing[1] << " " << magnifuSpacing[2] << std::endl;vtkSmartPointer<vtkImageActor> origActor =vtkSmartPointer<vtkImageActor>::New();origActor->SetInputData(reader->GetOutput());vtkSmartPointer<vtkImageActor> shrinkActor =vtkSmartPointer<vtkImageActor>::New();shrinkActor->SetInputData(shrinkFilter->GetOutput());vtkSmartPointer<vtkImageActor> magnifyActor =vtkSmartPointer<vtkImageActor>::New();magnifyActor->SetInputData(magnifyFilter->GetOutput());///double origView[4] = { 0, 0, 0.3, 1.0 };double shrinkView[4] = { 0.3, 0, 0.6, 1.0 };double magnifyView[4] = { 0.6, 0, 1, 1 };vtkSmartPointer<vtkRenderer> origRender =vtkSmartPointer<vtkRenderer>::New();origRender->SetViewport(origView);origRender->AddActor(origActor);origRender->ResetCamera();origRender->SetBackground(1, 0, 0);vtkSmartPointer<vtkRenderer> shrinkRender =vtkSmartPointer<vtkRenderer>::New();shrinkRender->SetViewport(shrinkView);shrinkRender->AddActor(shrinkActor);shrinkRender->ResetCamera();shrinkRender->SetBackground(0, 1, 0);vtkSmartPointer<vtkRenderer> magnifyRender =vtkSmartPointer<vtkRenderer>::New();magnifyRender->SetViewport(magnifyView);magnifyRender->AddActor(magnifyActor);magnifyRender->ResetCamera();magnifyRender->SetBackground(0, 0, 1);/vtkSmartPointer<vtkRenderWindow> rw =vtkSmartPointer<vtkRenderWindow>::New();rw->AddRenderer(origRender);rw->AddRenderer(shrinkRender);rw->AddRenderer(magnifyRender);rw->SetSize(720, 240);rw->SetWindowName("Image-Shrink-Magnify");rw->Render();vtkSmartPointer<vtkRenderWindowInteractor> rwi =vtkSmartPointer<vtkRenderWindowInteractor>::New();vtkSmartPointer<vtkInteractorStyleImage> style =vtkSmartPointer<vtkInteractorStyleImage>::New();rwi->SetInteractorStyle(style);rwi->SetRenderWindow(rw);rwi->Initialize();rwi->Start();return 0; }
vtkImageShrink3D通過SetShrinkFactors()設置X、Y和Z方向的采樣率,參數為三個int類型數據。vtkImageMagnify通過SetMagnificationFactors設置相應的放大采樣率。上 面例子中分別對原圖像維數縮小原來的1/16和放大為原來的10倍,執行結果如下: 從圖中可以看成,重采樣圖像已經變得十分模糊了。而升采樣圖像則變化不大。程序中輸出了原圖和重采樣圖像的維數和像素間隔,從輸出來看,原圖像的維數為512x512,縮小16倍后,圖像維數變為32x32。需要注意的是,原圖的像素間隔為(1,1,1),而重采樣后像素間隔變為(16, 16, 1),這是因為采樣是在世界坐標系下進行的,當采樣圖像的維數減小時,采樣的像素間隔也相應的變大,這樣保持圖像的區域不會發生改變。同樣的道理,當升采樣后圖像的維數變為原來的10倍,而像素間隔變為原來的十分之一。
另外,圖像的重采樣類有:vtkImageResample。
2.參看資料
1.《C++ primer》2.《The VTK User’s Guide – 11thEdition》
3.《The Visualization Toolkit – AnObject-Oriented Approach To 3D Graphics (4th Edition)》
4. ?張曉東, 羅火靈. VTK圖形圖像開發進階[M]. 機械工業出版社, 2015. 與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
以上是生活随笔為你收集整理的VTK修炼之道30:图像重采样_降采样和升采样技术的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 飞鸽传书详细说明
- 下一篇: VTK修炼之道31:图像二值化_阈值法