c++使用itk得到三维数据某个维度的某张切片

直接上代码记录:

#include<iostream>
#include<opencv2/opencv.hpp>
#include<itkImageFileReader.h>
#include<itkNiftiImageIO.h>
#include<itkImageFileWriter.h>
#include<itkExtractImageFilter.h>
#include<itkOpenCVImageBridge.h>
#include<itkRegionOfInterestImageFilter.h>
using namespace cv;
using namespace std;


itk::Image<unsigned int, 3>::Pointer read_gu_bone_image(const char* file_path) {
	using ImageType = itk::Image<unsigned int, 3>;
	using ImageIOType = itk::NiftiImageIO;
	using ReaderType = itk::ImageFileReader<ImageType>;

	ReaderType::Pointer reader = ReaderType::New(); // 定义reader
	ImageIOType::Pointer niftiIO = ImageIOType::New(); // 定义文件IO
	reader->SetImageIO(niftiIO); // 设置reader的文件IO

	reader->SetFileName(file_path);
	reader->Update(); // 读取文件结束

	return reader->GetOutput();
}

void write_nii_image(itk::Image<unsigned int, 3>::Pointer image) {
	using ImageType = itk::Image<unsigned int, 3>;
	using ImageIOType = itk::NiftiImageIO;
	using WriterType = itk::ImageFileWriter<ImageType>;

	WriterType::Pointer writer = WriterType::New();
	ImageIOType::Pointer niftiIO = ImageIOType::New();
	writer->SetImageIO(niftiIO);

	writer->SetInput(image);
	writer->SetFileName("slice.nii.gz");
	writer->Update();

}

int main() {
	itk::Image<unsigned int, 3>::Pointer input_image = read_gu_bone_image("../gu_bone.nii.gz");
	itk::Image<unsigned int, 3>::RegionType input_region = input_image->GetLargestPossibleRegion();
	itk::Image<int, 3>::SizeType size = input_region.GetSize();
	cout << "原始数据大小: " << size << endl;

	itk::Image<int, 3>::IndexType start_3d;
	start_3d[0] = 0;
	start_3d[1] = 383; // y轴
	start_3d[2] = 0;
	itk::Image<int, 3>::SizeType size_3d;
	size_3d[0] = size[0];
	size_3d[1] = 1;
	size_3d[2] = size[2];

	itk::Image<unsigned int, 3>::RegionType desired_region_3d;
	desired_region_3d.SetSize(size_3d);
	desired_region_3d.SetIndex(start_3d);

	typedef itk::RegionOfInterestImageFilter<itk::Image<unsigned int, 3>, itk::Image<unsigned int, 3>> interestImageFilterType;
	interestImageFilterType::Pointer region_filter = interestImageFilterType::New();
	region_filter->SetInput(input_image);
	region_filter->SetRegionOfInterest(desired_region_3d);
	region_filter->Update();

	itk::Image<unsigned int, 3>::Pointer output_data = region_filter->GetOutput();
	//write_nii_image(output_data);
	using IteratorType = itk::ImageRegionIterator<itk::Image<unsigned int, 3>>;
	IteratorType it(output_data, output_data->GetLargestPossibleRegion());
	it.GoToBegin();
	// 计算像素和
	int sumt = 0;
	while (!it.IsAtEnd()) {
		//std::cout << it.Get() << std::endl;
		sumt += it.Get();
		++it;
	}
	cout << sumt << endl;
	
	return 0;
}

在这里插入图片描述

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值