使用c++版本的itk计算二值三维图像的表面

#include "itkImageFileReader.h"
#include "itkImageFileWriter.h"

#include "itkMesh.h"
#include "itkBinaryThresholdImageFilter.h"
#include "itkBinaryMask3DMeshSource.h"
#include "itkMeshFileWriter.h"
#include<itkNiftiImageIO.h>
#include <itkOBJMeshIO.h>


// 读取nii数据
template<typename image_type, typename image_pointer>
void readData(const std::string& file_path, image_pointer& out_image) {
   
    using imageIOType = itk::NiftiImageIO;
    using readerType = itk::ImageFileReader<image_type>;

    auto reader = readerType::New();
    auto nifitiIO = imageIOType::New();

    reader->SetImageIO(nifitiIO);
    reader->SetFileName(file_path);
    reader->Update();

    out_image = reader->GetOutput();
}


// 写入nii数据
template<typename image_type, typename image_pointer>
void writeData(const image_pointer& write_image, const std::string& write_path) {
   
    using writerType = itk::ImageFileWriter<image_type>;
    auto writer = writerType::New();

    using niiIOType = itk::NiftiImageIO;
    auto niiIO = niiIOType::New();
    writer->SetImageIO(niiIO);

    writer->SetInput(write_image);
    writer->SetFileName(write_path);
    writer->Update();
}



int main()
{
   
    std::string infilename("C:\\Users\\Administrator\\Downloads\\predict_vc_001\\p20220620_093308_254.nii.gz");
    std::string outfilename("surface.obj");

    constexpr unsigned int Dimension = 3;

    using PixelType = unsigned char;
    using ImageType = itk::Image<PixelType, Dimension>;


    ImageType::Pointer input;
    readData<ImageType, ImageType::Pointer>(infilename, input);

    using MeshType = itk::Mesh<double, Dimension>;

    using FilterType = itk::BinaryMask3DMeshSource<ImageType, MeshType>;
    auto filter = FilterType::New();
    filter->SetInput(input);
    filter->SetObjectValue(1);

    using WriterType = itk::MeshFileWriter<MeshType>;
    auto writer = WriterType::New();
    writer->SetMeshIO(itk::OBJMeshIO::New());
    writer->SetFileName(outfilename);

    writer->SetInput(filter->GetOutput());
    try
    {
   
        writer->Update();
    }
    catch (const itk::ExceptionObject& error)
    {
   
        std::cerr << "Error: " << error << std::endl;
        return EXIT_FAILURE;
    }

	return 0;
}

保存的.obj表面文件,可以通过para view打开查看

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-14 04:16:02       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-14 04:16:02       100 阅读
  3. 在Django里面运行非项目文件

    2023-12-14 04:16:02       82 阅读
  4. Python语言-面向对象

    2023-12-14 04:16:02       91 阅读

热门阅读

  1. 光伏发电技术的应用领域有哪些?

    2023-12-14 04:16:02       63 阅读
  2. 【js或momentJs获取当前月的起止日期】

    2023-12-14 04:16:02       64 阅读
  3. 智能查券机器人:导购APP的新趋势

    2023-12-14 04:16:02       59 阅读
  4. Linux中的磁盘挂载与取消

    2023-12-14 04:16:02       58 阅读
  5. 【FPGA】篮球比赛计分器

    2023-12-14 04:16:02       51 阅读
  6. RocketMQ的监控和管理工具有哪些❓

    2023-12-14 04:16:02       62 阅读
  7. python 多进程

    2023-12-14 04:16:02       48 阅读
  8. mysql select count 非常慢

    2023-12-14 04:16:02       53 阅读
  9. 项目优化过程

    2023-12-14 04:16:02       53 阅读
  10. ExecuteScalar()方法

    2023-12-14 04:16:02       58 阅读