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

歡迎訪問(wèn) 生活随笔!

生活随笔

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

编程问答

VTK修炼之道30:图像重采样_降采样和升采样技术

發(fā)布時(shí)間:2025/3/15 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 VTK修炼之道30:图像重采样_降采样和升采样技术 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1.VTK中的圖像重采樣實(shí)現(xiàn)

圖像重采樣是指對(duì)采樣后形成的由離散數(shù)據(jù)組成的數(shù)字圖像按所需的像元位置或像元問(wèn)距重新采樣,以構(gòu)成幾何變換后的新圖像。重采樣過(guò)程本質(zhì)上是圖像恢復(fù)過(guò)程,它用輸入的離散數(shù)字圖像重建代表原始圖像二維連續(xù)函數(shù),再按新的像元間距和像元位置進(jìn)行采樣。其數(shù)學(xué)過(guò)程是根據(jù)重建的連續(xù)函數(shù)(曲面),用周圍若干像元點(diǎn)的值估計(jì)或內(nèi)插出新采樣點(diǎn)的值。圖像重采樣在圖像處理中應(yīng)用非常廣泛,如SIFT特征提取
圖像重采樣后圖像的維數(shù)會(huì)發(fā)生改變。當(dāng)重采樣圖像小于原圖像維數(shù)時(shí),稱為降采樣;當(dāng)重采樣圖像維數(shù)大于原圖像時(shí),稱為升采樣。VTK中可以方便的對(duì)圖像進(jìn)行重采樣。vtkImageShrink3D類實(shí)現(xiàn)圖像降采樣。降采樣需要設(shè)置每個(gè)方向的采樣率,降采樣率越大,圖像越模糊。升采樣的原理與降采樣原理一致,只是增加采樣點(diǎn)數(shù)來(lái)增加圖像的維數(shù)。VTK中vtkImageMagnify來(lái)實(shí)現(xiàn)圖像的升采樣。
實(shí)驗(yàn)代碼如下所示: #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);//設(shè)置降采樣率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通過(guò)SetShrinkFactors()設(shè)置X、Y和Z方向的采樣率,參數(shù)為三個(gè)int類型數(shù)據(jù)。vtkImageMagnify通過(guò)SetMagnificationFactors設(shè)置相應(yīng)的放大采樣率。上 面例子中分別對(duì)原圖像維數(shù)縮小原來(lái)的1/16和放大為原來(lái)的10倍,執(zhí)行結(jié)果如下: 從圖中可以看成,重采樣圖像已經(jīng)變得十分模糊了。而升采樣圖像則變化不大。程序中輸出了原圖和重采樣圖像的維數(shù)和像素間隔,從輸出來(lái)看,原圖像的維數(shù)為512x512,縮小16倍后,圖像維數(shù)變?yōu)?2x32。需要注意的是,原圖的像素間隔為(1,1,1),而重采樣后像素間隔變?yōu)?16, 16, 1),這是因?yàn)?strong>采樣是在世界坐標(biāo)系下進(jìn)行的,當(dāng)采樣圖像的維數(shù)減小時(shí),采樣的像素間隔也相應(yīng)的變大,這樣保持圖像的區(qū)域不會(huì)發(fā)生改變。同樣的道理,當(dāng)升采樣后圖像的維數(shù)變?yōu)樵瓉?lái)的10倍,而像素間隔變?yōu)樵瓉?lái)的十分之一。
另外,圖像的重采樣類有: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圖形圖像開(kāi)發(fā)進(jìn)階[M]. 機(jī)械工業(yè)出版社, 2015.
與50位技術(shù)專家面對(duì)面20年技術(shù)見(jiàn)證,附贈(zèng)技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的VTK修炼之道30:图像重采样_降采样和升采样技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

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