VTK学习笔记(四十)vtk提取单层数据

该文章介绍了如何使用VTK库中的vtkImageReslice和vtkExtractVOI过滤器从3D图像中提取单层数据。通过设置矩阵和坐标,可以提取特定轴上的中心切片。示例代码展示了提取Y轴、X轴和Z轴切片的过程。
摘要由CSDN通过智能技术生成

1. VTK学习笔记(四十)vtk提取单层数据

VTK实现单层图片的提取方法有很多,可以使用的filter有很多。

  1. 最底层的方法是获取图像指针,逐体素创建一个单层图像;
  2. vtkExtractVOI提取单层图像;
  3. vtkConstantPad提取单层图像;
  4. vtkImageReslice提取单层图像;

1.1 vtkImageReslice提取单层图像

#include <vtkExtractVOI.h>
#include <vtkImageCast.h>
#include <vtkImageData.h>
#include <vtkNew.h>
#include <vtkNIFTIImageReader.h>
#include <vtkNIFTIImageWriter.h>
#include <vtkImageReslice.h>
#include <string>
#include <vtkMatrix4x4.h>
#include <vtkSmartPointer.h>

using namespace std;

int main(int, char*[])
{
    string fileName = "test.nii.gz";
    vtkSmartPointer<vtkImageData> input;
    vtkSmartPointer <vtkNIFTIImageReader> niftireader = vtkSmartPointer<vtkNIFTIImageReader>::New();
    niftireader->SetFileName(fileName.c_str());
    niftireader->Update();
    input = niftireader->GetOutput();
    vtkMatrix4x4* qMatrix = niftireader->GetQFormMatrix();
    qMatrix->Print(std::cout);
    int inputDims[3] = { 0 };
    int extent[6] = {0};
    double origin[3] = { 0 };
    double spacing[3] = { 0 };
    vtkNew<vtkMatrix3x3> mat;
    input->GetDimensions(inputDims);
    input->GetExtent(extent);
    input->GetOrigin(origin);
    input->GetSpacing(spacing);
  vtkSmartPointer<vtkImageReslice> pReslice = vtkSmartPointer<vtkImageReslice>::New();
  //pReslice->SetOutputOrigin(origin);
  double center[3];
  center[0] = origin[0] /*+ spacing[0] * 0.5 * (extent[0] + extent[1])*/;
  center[1] = origin[1] + spacing[1] * 0.5 * (extent[2] + extent[3]);
  center[2] = origin[2] /*+ spacing[2] * 0.5 * (extent[4] + extent[5])*/;

  static double axialElements[16] = {
      0, 1, 0, 0,
      0, 0, 1, 0,
      1, 0, 0, 0,
      0, 0, 0, 1
  };

  vtkSmartPointer<vtkMatrix4x4> resliceAxes =
      vtkSmartPointer<vtkMatrix4x4>::New();
  resliceAxes->DeepCopy(axialElements);
  resliceAxes->SetElement(0, 3, center[0]);
  resliceAxes->SetElement(1, 3, center[1]);
  resliceAxes->SetElement(2, 3, center[2]);
  //pReslice->SetOutputExtent(ext);
  pReslice->SetOutputDimensionality(2);
  pReslice->SetResliceAxes(resliceAxes);
  pReslice->SetAutoCropOutput(1);//!!!一定要加这句话
  pReslice->SetInputData(input);
  pReslice->Update();

  vtkImageData* extracted = pReslice->GetOutput();
  //extracted->SetOrigin(origin);
  int* extractedDims = extracted->GetDimensions();
  std::cout << "Dims: "
            << " x: " << extractedDims[0] << " y: " << extractedDims[1]
            << " z: " << extractedDims[2] << std::endl;
  std::cout << "Number of points: " << extracted->GetNumberOfPoints()
            << std::endl;
  std::cout << "Number of cells: " << extracted->GetNumberOfCells()
            << std::endl;
  string dstfileName = "resliced.nii.gz";
  vtkSmartPointer<vtkNIFTIImageWriter> envImageWriter = vtkSmartPointer<vtkNIFTIImageWriter>::New();
  envImageWriter->SetInputData(extracted);
  //envImageWriter->SetQFormMatrix(qMatrix);
  envImageWriter->SetFileName(dstfileName.c_str());
  envImageWriter->Write();

  return EXIT_SUCCESS;
}

提取中心层片 y轴切片
在这里插入图片描述
提取中心层片,z轴切片

 double center[3];
  center[0] = origin[0] /*+ spacing[0] * 0.5 * (extent[0] + extent[1])*/;
  center[1] = origin[1] /*+ spacing[1] * 0.5 * (extent[2] + extent[3])*/;
  center[2] = origin[2] + spacing[2] * 0.5 * (extent[4] + extent[5]);

  static double axialElements[16] = {
      1, 0, 0, 0,
      0, 1, 0, 0,
      0, 0, 1, 0,
      0, 0, 0, 1
  };

在这里插入图片描述

提取中心层片,x轴切片

 double center[3];
  center[0] = origin[0] + spacing[0] * 0.5 * (extent[0] + extent[1]);
  center[1] = origin[1] /*+ spacing[1] * 0.5 * (extent[2] + extent[3])*/;
  center[2] = origin[2] /*+ spacing[2] * 0.5 * (extent[4] + extent[5])*/;

  static double axialElements[16] = {
      0, 0, 1, 0,
      1, 0, 0, 0,
      0, 1, 0, 0,
      0, 0, 0, 1
  };

在这里插入图片描述

1.2 vtkExtractVOI提取单层图像

#include <vtkExtractVOI.h>
#include <vtkImageActor.h>
#include <vtkImageCast.h>
#include <vtkImageData.h>
#include <vtkImageMandelbrotSource.h>
#include <vtkImageMapper3D.h>
#include <vtkInteractorStyleImage.h>
#include <vtkNamedColors.h>
#include <vtkNew.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkNew.h>
#include <vtkNIFTIImageReader.h>
#include <vtkNIFTIImageWriter.h>
#include <vtkMatrix3x3.h>
#include <string>
#include <vtkMatrix4x4.h>

using namespace std;

int main(int, char*[])
{
    string fileName = "D:/Dataset/Hip_Femur_Detection/Detect/BJ_02006.nii.gz";
    vtkSmartPointer<vtkImageData> input;
    vtkSmartPointer <vtkNIFTIImageReader> niftireader = vtkSmartPointer<vtkNIFTIImageReader>::New();
    niftireader->SetFileName(fileName.c_str());
    niftireader->Update();
    input = niftireader->GetOutput();
    vtkMatrix4x4* qMatrix = niftireader->GetQFormMatrix();
    qMatrix->Print(std::cout);
    int inputDims[3] = { 0 };
    int extent[6] = {0};
    double origin[3] = { 0 };
    double spacing[3] = { 0 };
    vtkNew<vtkMatrix3x3> mat;
    input->GetDimensions(inputDims);
    input->GetExtent(extent);
    input->GetOrigin(origin);
    input->GetSpacing(spacing);
  vtkNew<vtkExtractVOI> extractVOI;
  extractVOI->SetInputData(input);
  extractVOI->SetVOI(0, inputDims[0]-1,
                     0, inputDims[1]-1, inputDims[2] / 2, inputDims[2] / 2);
  extractVOI->Update();

  vtkImageData* extracted = extractVOI->GetOutput();
  //extracted->SetOrigin(origin);
  int* extractedDims = extracted->GetDimensions();
  std::cout << "Dims: "
            << " x: " << extractedDims[0] << " y: " << extractedDims[1]
            << " z: " << extractedDims[2] << std::endl;
  std::cout << "Number of points: " << extracted->GetNumberOfPoints()
            << std::endl;
  std::cout << "Number of cells: " << extracted->GetNumberOfCells()
            << std::endl;
  string dstfileName = "extractVOI.nii.gz";
  vtkSmartPointer<vtkNIFTIImageWriter> envImageWriter = vtkSmartPointer<vtkNIFTIImageWriter>::New();
  envImageWriter->SetInputData(extracted);
  envImageWriter->SetQFormMatrix(qMatrix);
  envImageWriter->SetFileName(dstfileName.c_str());
  envImageWriter->Write();

  return EXIT_SUCCESS;
}

提取中心层片,z轴切片
在这里插入图片描述
提取中心层片,x轴切片

 extractVOI->SetVOI(inputDims[0] / 2, inputDims[0]/2,
                     0, inputDims[1]-1, 0, inputDims[2]-1);

在这里插入图片描述

提取中心层片,y轴切片
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

落花逐流水

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

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

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

打赏作者

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

抵扣说明:

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

余额充值