VTK读取三维Mhd文件,并把数据存放在三维数组里

全部VTK程序设计系列博客 见 VTK程序设计系列

mhd文件包含一个.mhd用来存放信息,和一个.raw文件来存放数据。

我们用记事本随便打开一个三维的Mhd文件:

ObjectType = Image
NDims = 3
BinaryData = True
BinaryDataByteOrderMSB = False
CompressedData = True
CompressedDataSize = 6193601
TransformMatrix = 1 0 0 0 1 0 0 0 1
Offset = -125 -858 -63
CenterOfRotation = 0 0 0
ElementSpacing = 0.976562 1.4 0.976562
DimSize = 256 230 256
AnatomicalOrientation = ???
ElementType = MET_SHORT
ElementDataFile = manix_small.raw

可以看到维数是3,二进制数据,并且是压缩过的数据。三维的每个数据在实际空间中的距离分别为: 0.976562 1.4 0.976562 。

数据的大小是256*230*256的。

我们记住这些数据,然后开始写程序:

注意因为我们使用的是VTK7.1,所以说老的VTK5的一些类中的GetOutput或者setInput需要进行更改,例如需要改为SetInputData,两种方法可以看我的其他博客:VTK7.1版本显示图像的两种方法

现在我们先敲入如下程序:

#include<vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2)
VTK_MODULE_INIT(vtkInteractionStyle);
VTK_MODULE_INIT(vtkRenderingFreeType);
VTK_MODULE_INIT(vtkRenderingVolumeOpenGL2);
// first include the required header files for the vtk classes we are using
#include <vtkSmartPointer.h>
#include <vtkMetaImageReader.h>
#include <vtkImageViewer2.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include "vtkRenderWindowInteractor.h"
#include <vtkImageCast.h>
#include <vtkImageData.h>
#include <iostream>
using namespace std;

int main(int argc, char* argv[])

{

	vtkSmartPointer<vtkMetaImageReader> reader =
		vtkSmartPointer<vtkMetaImageReader>::New();

	reader->SetFileName("C:\\Developer\\VTK_code\\mhdfile\\manix_small.mhd");
	reader->Update();

	vtkSmartPointer<vtkImageCast> ImageCast = vtkImageCast::New();

	ImageCast->SetInputData((vtkImageData*)reader->GetOutput());
	ImageCast->SetOutputScalarTypeToShort();
	ImageCast->Update();

	int * volumeData = ImageCast->GetOutput()->GetExtent();
	ImageCast->GetOutput()->GetScalarPointer();

	cout << "volumeData[1] = " << volumeData[1]+1 << endl;
	cout << "volumeData[3] = " << volumeData[3]+1 << endl;
	cout << "volumeData[5] = " << volumeData[5]+1 << endl;

	system("pause");
	return 0;

}

然后运行,得到:

volumeData[1] = 256
volumeData[3] = 230
volumeData[5] = 256

说明数据读取的是对的。

注意我们的数据的指针在 ImageCast->GetOutput()->GetScalarPointer();这里。

所以我们可以通过新建一个short形指针,然后分配内存,并用memcpy函数复制过去。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dezeming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值