Dicom多帧影像的单帧提取功能的实现
Posted farmer-d
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Dicom多帧影像的单帧提取功能的实现相关的知识,希望对你有一定的参考价值。
Dicom 多帧影像一般都比较大,全部读取的话对内存的要求很高,而且效率很低,所以在这种情况下需要一个单帧提取的方式。这里分别介绍DCMTK和GDCM的单帧提取的方式:
DCMTK:
#include "dcmtk/config/osconfig.h" #include "dcmtk/dcmimgle/dcmimage.h" int main(int argc, char *argv[]) { OFLog::configure(OFLogger::INFO_LOG_LEVEL); DicomImage *image = new DicomImage("mf_image.dcm", CIF_UsePartialAccessToPixelData, 0, 10 /* fcount */); if (image->getStatus() == EIS_Normal) { do { DCMIMGLE_INFO("processing frame " << image->getFirstFrame() + 1 << " to " << image->getFirstFrame() + image->getFrameCount()); } while (image->processNextFrames()); } delete image; return 0; }
GDCM:
gdcm::ImageRegionReader reader; reader.SetFileName(fileName); std::vector<unsigned int> dims = gdcm::ImageHelper::GetDimensionsValue(reader.GetFile()); gdcm::BoxRegion box; box.SetDomain(0, dims[0] - 1, 0, dims[1] - 1, i, i); reader.SetRegion(box); size_t bufferLength = reader.ComputeBufferLength(); char* buffer = new char[bufferLength]; memset(buffer, 0x0, bufferLength); if (!reader.ReadIntoBuffer(buffer, bufferLength)) { std::cout << "读取失败" << std::endl; return 0; }
GDCM 处理的时候有个问题需要注意,用ImageRegionReader读取出来后,再去调用 reader.GetImage().GetTransferSyntax() 去获取文件语法,会发现该语法和原始Dicom文件的语法不一致,所以如果需要获取文件语法,需要以下方法进行获取:
const FileMetaInformation &header = reader.GetFile().GetHeader(); const TransferSyntax &ts = header.GetDataSetTransferSyntax();
以上是关于Dicom多帧影像的单帧提取功能的实现的主要内容,如果未能解决你的问题,请参考以下文章
pydicom和SimpleITK分别解析医学影像中dicom文件
MATLAB 实现点云累计-坐标系转换-目标范围点云提取(附代码与代码注释)
3d Slicer-DICOM模块之Query/Retrieve功能介绍