VTK_Learning_图像重采样_降采样和升采样技术

本文介绍VTK中图像重采样技术,包括降采样和升采样的实现方法。通过vtkImageShrink3D和vtkImageMagnify类,调整图像尺寸,演示了图像在不同采样率下的变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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。
 

### 如何编译 VTK 生成 vtk_debug vtk_release 版本 为了分别构建调试版本 `vtk_debug` 发布版本 `vtk_release` 的 VTK 库,需要针对不同模式设置 CMake 参数并指定不同的安装前缀。 #### 设置 CMAKE_INSTALL_PREFIX 区分 Release Debug 在 VTK 源码根目录中的 `cmake_install.cmake` 脚本里调整 `CMAKE_INSTALL_PREFIX` 变量来区分两种构建设备。对于调试版本,可以定义一个特定于 debug 构建的路径;同样地,为 release 定义另一个独立的位置[^1]。 ```bash set(CMAKE_INSTALL_PREFIX "path/to/vtk_debug" CACHE PATH "Install path for debug build") ``` 而对于发布的版本,则应更改此参数指向其他位置: ```bash set(CMAKE_INSTALL_PREFIX "path/to/vtk_release" CACHE PATH "Install path for release build") ``` #### 使用 OpenGL2 渲染模块初始化 当通过 CMake 配置项目时,确保选择了 OpenGL2 作为渲染后端支持: ```cpp VTK_MODULE_INIT(vtkRenderingOpenGL2); ``` 这一步骤通常是在 C++ 文件中完成的,在这里提及是为了确认所使用的图形接口标准一致[^2]。 #### 执行 cmake 命令进行安装 利用命令行工具执行如下指令以生成所需的依赖库文件,并指明目标安装地点。注意这里的 `-DCMAKE_BUILD_TYPE=Debug|Release` 是用来切换构建类型的选项之一[^3]: 对于调试版本: ```bash cmake -S . -B ./build/debug -D CMAKE_BUILD_TYPE=Debug \ -D CMAKE_INSTALL_PREFIX=path/to/vtk_debug .. cmake --build ./build/debug --config Debug cmake --install ./build/debug --prefix path/to/vtk_debug ``` 对于发布版本: ```bash cmake -S . -B ./build/release -D CMAKE_BUILD_TYPE=Release \ -D CMAKE_INSTALL_PREFIX=path/to/vtk_release .. cmake --build ./build/release --config Release cmake --install ./build/release --prefix path/to/vtk_release ``` 如果遇到关于 `CMAKE_DEBUG_POSTFIX` 不生效的问题,可以通过显式设定该属性来解决问题,例如将其设为空字符串或其他自定义标记以便更好地控制输出名称[^4]: ```bash -D CMAKE_DEBUG_POSTFIX="_debug" ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值