最近在帮老师写项目,需要获取CT图像的各个像素位置的HU值,于此记录一下~
还是使用C++配合VTK来实现。
#include <vtkSmartPointer.h>
#include <vtkDICOMImageReader.h>
#include <vtkImageData.h>
#include <vtkDataArray.h>
#include <vtkPointData.h>
#include <iostream>
#include <fstream>
int main(int argc, char* argv[]) {
using namespace std;
// 读取DICOM CT文件
vtkSmartPointer<vtkDICOMImageReader> reader =
vtkSmartPointer<vtkDICOMImageReader>::New();
reader->SetFileName("D:\\DicomDisplay\\Dicomdisplay\\Data\\dicom1\\I0000453942");
reader->Update();
// 获取图像数据
vtkSmartPointer<vtkImageData> imageData = reader->GetOutput();
// 获取点数据
vtkSmartPointer<vtkPointData> pointData = imageData->GetPointData();
// 获取CT值数组
vtkSmartPointer<vtkDataArray> ctValues = pointData->GetArray("DICOMImage");
// 获取数组尺寸
int* dims = imageData->GetDimensions();
int Rows = dims[0]; // 512
int Cols = dims[1]; // 512
int Slices = dims[2]; // 1
// 输出CT值矩阵 -- 输出成为一个 512 * 512的方阵
ofstream outFile;
outFile.open("getvalue17_2.txt");
for (int slice = 0; slice < Slices; slice++) {
for (int row = 0; row < Rows; row++) {
for (int col = 0; col < Cols; col++) {
int index = col + row * Cols + slice * Rows * Cols;
double ctValue = ctValues->GetComponent(index, 0);
outFile << ctValue << " ";
}
}
}
outFile.close();
return 0;
}
输出这些像素单位时,我将其用文件流进行了一个输出,保存在文件"getvalues17_2"中了。
期间发生过一次错误,就是在 ctValues = pointData->GetArray("DICOMImage"); 这里,参数是要一个存在的数组(你可以通过函数调用出有哪些数组存在)。