DCMTK、ITK、VTK读取dicom影像数据的方法

直接上代码,调用不同的医学影像库读取dicom影像信息

1. DCMTK读取影像中的pixelData
//参数  list:为输入的图像文件名列表
bool DCMTKReadDicoms(QStringList list)
{DJDecoderRegistration::registerCodecs();DJEncoderRegistration::registerCodecs();DcmRLEEncoderRegistration::registerCodecs();DcmRLEDecoderRegistration::registerCodecs();DcmFileFormat dcmff_ ;DcmDataset *dset = dcmff_.getDataset();  DcmElement *element = nullptr;for (int i = 0; i < list.size(); i++){OFCondition result;result = dcmff_.loadFile(list.at(i).toStdString().data());    dset->chooseRepresentation(EXS_LittleEndianImplicit, nullptr);result = dset->findAndGetElement(DCM_PixelData,element);   DcmPixelData *dpix = NULL;dpix = OFstatic_cast(DcmPixelData *, element);/* 因为我们有压缩数据,所以必须利用DcmPixelSequence以便以原始格式访问,例如解压缩使用外部库*/DcmPixelSequence *dseq = NULL;E_TransferSyntax xferSyntax = EXS_Unknown;const DcmRepresentationParameter *rep = NULL;// 查找访问DCMTK中数据的正确表示所需的键 dpix->getOriginalRepresentationKey(xferSyntax, rep);// 访问原始数据表示并在像素序列内获得结果result = dpix->getEncapsulatedRepresentation(dset->getCurrentXfer(), rep, dseq);if ( result == EC_Normal )    //针对压缩数据的访问遍历{DcmPixelItem *pixitem = NULL;// 访问第一帧(跳过偏移表)dseq->getItem(pixitem, 1);if (pixitem == NULL)return 1;Uint8 *pixData = NULL;// 获取此像素项的长度(即片段,即大部分时间,帧的长度)Uint32 length = pixitem->getLength();if (length == 0)return 1;// 最后,获取此像素项的压缩数据 result = pixitem->getUint8Array(pixData);// 使用pixData执行一些有用的操作。。。(下方遍历访问了这些值)cv::Mat dst2(512, 512, CV_8UC1, cv::Scalar::all(0));unsigned short *data = nullptr;for (int i = 0; i < 512; i++){data = dst2.ptr<unsigned short>(i);   //取得每一行的头指针 也可使用dst2.at<unsigned short>(i, j) = ?for (int j = 0; j < 512; j++){unsigned short temp = pixData[i * 512 + j];qDebug() << temp;}}}else             //针对没有压缩数据的访问遍历{Uint16 *pixData16 = NULL;result = element->getUint16Array(pixData16);int slope, intercept;const char *value = nullptr;dset->findAndGetString(DCM_RescaleIntercept, value);intercept = QString::fromLatin1(value).toInt();dset->findAndGetString(DCM_RescaleSlope, value);slope = QString::fromLatin1(value).toInt();qDebug() << "intercept" << intercept<< "slope" << slope;cv::Mat dst2(512, 512, CV_16UC1, cv::Scalar::all(0));unsigned short *data = nullptr;for (int i = 0; i < 512; i++){data = dst2.ptr<unsigned short>(i);   //取得每一行的头指针 也可使用dst2.at<unsigned short>(i, j) = ?for (int j = 0; j < 512; j++){unsigned short temp = pixData16[i * 512 + j];qDebug() << temp;}}}if (result.bad())return 1;elsereturn 0;}DJDecoderRegistration::cleanup();
}
是否存在压缩影像的判别:(具体的术语还不清楚,后续补上),可根据下方的两个示意图做初步了解

压缩影像tag信息:

未压缩影像tag信息:
通过影像浏览工具中的tagid(7FE0,0010),即tag描述信息为Pixel Data的value是否为空并可判断影像是否被压缩。

2.VTK读取影像信息
bool VtkReadDicoms(QStringList list)
{QFileInfo info(list.at(0));vtkSmartPointer<vtkDICOMReader> reader =vtkSmartPointer<vtkDICOMReader>::New();vtkSmartPointer<vtkImageData> sliceData = vtkSmartPointer<vtkImageData>::New();reader->SetFileName(list.at(0).toStdString().c_str());reader->Update();sliceData = reader->GetOutput();qDebug() << "显示点的Dimensions" << sliceData->GetDimensions()[0] << ","<< sliceData->GetDimensions()[1] << "," << sliceData->GetDimensions()[2];qDebug() << "显示点的个数" << sliceData->GetNumberOfPoints();int nbOfComp = sliceData->GetNumberOfScalarComponents();qDebug() << "通道" << nbOfComp;for (int i = 0; i < 512; i++){data = dst2.ptr<signed short>(i);   //取得每一行的头指针 也可使用dst2.at<unsigned short>(i, j) = ?for (int j = 0; j < 512; j++){for (int k = 0; k < 1; k++){signed short *pixel =(signed short *) (sliceData->GetScalarPointer(i, j, k));qDebug() << *(pixel);}}}
}
3.ITK读取dicom图像
bool ReadDicom(const std::string &file_name,InputImageType::Pointer &image)
{typedef itk::ImageFileReader<InputImageType> ReaderType;ReaderType::Pointer reader = ReaderType::New();typedef itk::GDCMImageIO  ImageIOType;ImageIOType::Pointer gdcmImageIO = ImageIOType::New();reader->SetFileName(file_name);reader->SetImageIO( gdcmImageIO );try{reader->Update();}catch (itk::ExceptionObject &){return false;}image = reader->GetOutput();return true;
}

DCMTK、ITK、VTK读取dicom信息相关推荐

  1. VTK读取dicom序列,并保存成vtk和obj格式的3D格式文件

    在vs中配置好vtk之后,新建项目,然后加入如下代码. #include "stdafx.h" #include <vtkAutoInit.h> VTK_MODULE_ ...

  2. ITK VTK 读取显示mhd文件(c++)

    找了好多博客,也没有找到读取显示mhd文件的教程,然后自己就瞎试试了几次,没想到成了.实现了滑动鼠标显示各层切片. #include <vtkSmartPointer.h> #includ ...

  3. 【WPF学习手记】利用fo-dicom读取DICOM文件

    利用开源库 fo-dicom 读取 DICOM 文件基本操作. 读取DICOM信息 原始数据经过窗宽.窗位校正后显示成图. private void Button_Click1(object send ...

  4. DCMTK读取dicom图像

    背景,使用VTK.ITK读取dicom图像,出现中文路径,无法读取的情况,才找到了DCMTK作为替换方案 #include <dcmtk/dcmdata/dctk.h> #include ...

  5. ITK:读取DICOM系列并写入3D图像

    ITK:读取DICOM系列并写入3D图像 内容提要 C++实现代码 内容提要 本示例读取给定文件夹argv [1]中的所有DICOM系列,并将它们写入具有以下文件模式的同一文件夹中:seriesIde ...

  6. DCMTK:读取DICOM图像并创建匹配的演示状态

    DCMTK:读取DICOM图像并创建匹配的演示状态 读取DICOM图像并创建匹配的演示状态 读取DICOM图像并创建匹配的演示状态 #include "dcmtk/config/osconf ...

  7. DCMTK:读取DICOM图像,并使用设置创建PGM位图

    DCMTK:读取DICOM图像,并使用设置创建PGM位图 读取DICOM图像,并使用设置创建PGM位图 读取DICOM图像,并使用设置创建PGM位图 #include "dcmtk/conf ...

  8. DCMTK:读取DICOM图像,添加模态LUT并将其写回

    DCMTK:读取DICOM图像,添加模态LUT并将其写回 读取DICOM图像,添加模态LUT并将其写回 读取DICOM图像,添加模态LUT并将其写回 #include "dcmtk/conf ...

  9. DCMTK:读取DICOM图像,添加一个Curve并将其写回

    DCMTK:读取DICOM图像,添加一个Curve并将其写回 读取DICOM图像,添加一个Curve并将其写回 读取DICOM图像,添加一个Curve并将其写回 #include "dcmt ...

最新文章

  1. Mybatis入门之动态sql
  2. 阿里巴巴开源容器镜像加速技术
  3. Windows10下的AlphaPose配置,人体摔倒姿态识别
  4. java类结构图_java 集合类结构图
  5. Linux系统编程27:进程间通信之管道的基本概念和匿名管道与命名管道及管道特性
  6. 经验与教训:测试员的偏向
  7. libvirt热迁移报Connection refused错误解决办法
  8. mysql 错误编码_【分享】MySQl操作系统提示错误编码
  9. 键盘里的电脑:树莓派400正式发布,售价70美元
  10. 如何用 Python 从 0 开始创建一个区块链?
  11. C++ 数据类型转换详解之终极无惑
  12. Word VBA:MathType公式与Latex公式切换
  13. 加密Python源代码笔记
  14. 结构体定义 typedef struct LNode 用法说明
  15. Transformer 综合讲解15-20章
  16. 计算机基础知识考什么,我想请问下,计算机初级考试考些什么东西?
  17. html5鼠标悬停图片放大的原理,jQuery当鼠标悬停时放大图片的效果实例
  18. 使用超声波测距模块控制LED灯
  19. 语音识别 公司_语音识别公司_语音识别公司排名 - 云+社区 - 腾讯云
  20. 在深圳转户口这件小事

热门文章

  1. Oracle数据库文件
  2. python enumerate_Python enumerate() 函数
  3. 算力寻租或将终结中本聪的POW机制?深度解析BCH“司机补贴战”
  4. 获取发表论文期刊的封面和目录页
  5. Python-冒泡排序函数
  6. web单页面应用与多页面应用区别
  7. mysql 怎么设置ip地址_Mysql如何设置用户指定ip地址操作数据库
  8. 大学“电路分析基础”试题合集第六章(文末附PDF文档与Word文档)
  9. 论文画图——eps格式的图
  10. 大数据分析职业规划指南