直接上代码记录:
#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;
}