想必看这篇文章的读者都对vtk有或多或少的认识,vtk中的vtkDICOMImageReader是用来读取DICOM文件的类,但是其只能读取未压缩格式的DICOM文件,本人手头上需要显示和处理的DICOM均为压缩格式的DICOM文件(1.2.840.10008.1.2.4.70 [JPEG Lossless, Non-Hierarchical, First-Order Prediction (Process 14 [Selection Value 1]): Default Transfer Syntax for Lossless JPEG Image Compression]),直接使用该类读取会报如下错误

ERROR: In E:\SourceCode\VTK-8.2.0\IO\Image\vtkDICOMImageReader.cxx, line 270

vtkDICOMImageReader (000001D37701A6D0): There was a problem retrieving data from: E://DICOM//2021071009//0200.dcm

这时候就需要借助其他库来读取这种格式的DICOM文件,通过网上冲浪得知,以下库可以完成读取:GDCM、ITK(读取也是gdcm实现的)、DCMTK等,这里作者选择使用dcmtk进行读取。

1-下载、编译

和vtk一样,这里就不作详细介绍了,dcmtk官方地址:dicom.offis.de - Home,如果编译不成功可以和我联系,这里是在windows 10操作系统中编译,使用cmake+VS2017。

2-Demo

IDE工具用的是Qt 5.14.1 + VS2017。创建项目,配置pro文件,为了方便就把所有文件都添加了进来,后期项目上可以按需求添加。

INCLUDEPATH += \D:/ThridPartyLibrary/gdcm/debug/include/gdcm-3.0 \D:/ThridPartyLibrary/vtk/debug/include/vtk-8.2 \D:/ThridPartyLibrary/dcmtk/debug/include \LIBS += \-LD:/ThridPartyLibrary/gdcm/debug/lib/ \-LD:/ThridPartyLibrary/vtk/debug/lib \-LD:/ThridPartyLibrary/dcmtk/debug/lib \-lgdcmcharls \-lgdcmCommon \-lgdcmDICT \-lgdcmDSED \-lgdcmexpat \-lgdcmgetopt \-lgdcmIOD \-lgdcmjpeg12 \-lgdcmjpeg16 \-lgdcmjpeg8 \-lgdcmMEXD \-lgdcmMSFF \-lgdcmopenjp2 \-lgdcmzlib \-lsocketxx \-lvtkgdcm \-lvtkChartsCore-8.2 \-lvtkCommonColor-8.2 \-lvtkCommonComputationalGeometry-8.2 \-lvtkCommonCore-8.2 \-lvtkCommonDataModel-8.2 \-lvtkCommonExecutionModel-8.2 \-lvtkCommonMath-8.2 \-lvtkCommonMisc-8.2 \-lvtkCommonSystem-8.2 \-lvtkCommonTransforms-8.2 \-lvtkDICOMParser-8.2 \-lvtkDomainsChemistry-8.2 \-lvtkDomainsChemistryOpenGL2-8.2 \-lvtkdoubleconversion-8.2 \-lvtkexodusII-8.2 \-lvtkexpat-8.2 \-lvtkFiltersAMR-8.2 \-lvtkFiltersCore-8.2 \-lvtkFiltersExtraction-8.2 \-lvtkFiltersFlowPaths-8.2 \-lvtkFiltersGeneral-8.2 \-lvtkFiltersGeneric-8.2 \-lvtkFiltersGeometry-8.2 \-lvtkFiltersHybrid-8.2 \-lvtkFiltersHyperTree-8.2 \-lvtkFiltersImaging-8.2 \-lvtkFiltersModeling-8.2 \-lvtkFiltersParallel-8.2 \-lvtkFiltersParallelImaging-8.2 \-lvtkFiltersPoints-8.2 \-lvtkFiltersProgrammable-8.2 \-lvtkFiltersSelection-8.2 \-lvtkFiltersSMP-8.2 \-lvtkFiltersSources-8.2 \-lvtkFiltersStatistics-8.2 \-lvtkFiltersTexture-8.2 \-lvtkFiltersTopology-8.2 \-lvtkFiltersVerdict-8.2 \-lvtkfreetype-8.2 \-lvtkGeovisCore-8.2 \-lvtkgl2ps-8.2 \-lvtkglew-8.2 \-lvtkGUISupportMFC-8.2 \-lvtkGUISupportQt-8.2 \-lvtkGUISupportQtOpenGL-8.2 \-lvtkGUISupportQtSQL-8.2 \-lvtkhdf5-8.2 \-lvtkhdf5_hl-8.2 \-lvtkImagingColor-8.2 \-lvtkImagingCore-8.2 \-lvtkImagingFourier-8.2 \-lvtkImagingGeneral-8.2 \-lvtkImagingHybrid-8.2 \-lvtkImagingMath-8.2 \-lvtkImagingMorphological-8.2 \-lvtkImagingSources-8.2 \-lvtkImagingStatistics-8.2 \-lvtkImagingStencil-8.2 \-lvtkInfovisCore-8.2 \-lvtkInfovisLayout-8.2 \-lvtkInteractionImage-8.2 \-lvtkInteractionStyle-8.2 \-lvtkInteractionWidgets-8.2 \-lvtkIOAMR-8.2 \-lvtkIOAsynchronous-8.2 \-lvtkIOCityGML-8.2 \-lvtkIOCore-8.2 \-lvtkIOEnSight-8.2 \-lvtkIOExodus-8.2 \-lvtkIOExport-8.2 \-lvtkIOExportOpenGL2-8.2 \-lvtkIOExportPDF-8.2 \-lvtkIOGeometry-8.2 \-lvtkIOImage-8.2 \-lvtkIOImport-8.2 \-lvtkIOInfovis-8.2 \-lvtkIOLegacy-8.2 \-lvtkIOLSDyna-8.2 \-lvtkIOMINC-8.2 \-lvtkIOMovie-8.2 \-lvtkIONetCDF-8.2 \-lvtkIOParallel-8.2 \-lvtkIOParallelXML-8.2 \-lvtkIOPLY-8.2 \-lvtkIOSegY-8.2 \-lvtkIOSQL-8.2 \-lvtkIOTecplotTable-8.2 \-lvtkIOVeraOut-8.2 \-lvtkIOVideo-8.2 \-lvtkIOXML-8.2 \-lvtkIOXMLParser-8.2 \-lvtkjpeg-8.2 \-lvtkjsoncpp-8.2 \-lvtklibharu-8.2 \-lvtklibxml2-8.2 \-lvtkLocalExample-8.2 \-lvtklz4-8.2 \-lvtklzma-8.2 \-lvtkmetaio-8.2 \-lvtkNetCDF-8.2 \-lvtkogg-8.2 \-lvtkParallelCore-8.2 \-lvtkpng-8.2 \-lvtkproj-8.2 \-lvtkpugixml-8.2 \-lvtkRenderingAnnotation-8.2 \-lvtkRenderingContext2D-8.2 \-lvtkRenderingContextOpenGL2-8.2 \-lvtkRenderingCore-8.2 \-lvtkRenderingFreeType-8.2 \-lvtkRenderingGL2PSOpenGL2-8.2 \-lvtkRenderingImage-8.2 \-lvtkRenderingLabel-8.2 \-lvtkRenderingLOD-8.2 \-lvtkRenderingOpenGL2-8.2 \-lvtkRenderingQt-8.2 \-lvtkRenderingVolume-8.2 \-lvtkRenderingVolumeOpenGL2-8.2 \-lvtksqlite-8.2 \-lvtksys-8.2 \-lvtkTestingGenericBridge-8.2 \-lvtkTestingIOSQL-8.2 \-lvtkTestingRendering-8.2 \-lvtktheora-8.2 \-lvtktiff-8.2 \-lvtkverdict-8.2 \-lvtkViewsContext2D-8.2 \-lvtkViewsCore-8.2 \-lvtkViewsInfovis-8.2 \-lvtkViewsQt-8.2 \-lvtkzlib-8.2 \-lcmr \-ldcmdata \-ldcmdsig \-ldcmect \-ldcmfg \-ldcmimage \-ldcmimgle \-ldcmiod \-ldcmjpeg \-ldcmjpls \-ldcmnet \-ldcmpmap \-ldcmpstat \-ldcmqrdb \-ldcmrt \-ldcmseg \-ldcmsr \-ldcmtkcharls \-ldcmtls \-ldcmtract \-ldcmwlm \-li2d \-lijg12 \-lijg16 \-lijg8 \-loflog \-lofstd \

引入头文件,初始化vtk

#include <dcmtk/dcmdata/dctk.h>
#include <dcmtk/dcmdata/dcfilefo.h>
#include <dcmtk/dcmimgle/dcmimage.h>
#include <dcmtk/dcmimage/diregist.h>
#include <dcmtk/dcmjpeg/djdecode.h>
#include <dcmtk/ofstd/ofstring.h>
#include <dcmtk/dcmdata/dcostrmb.h>#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2) ;
VTK_MODULE_INIT(vtkInteractionStyle) ;
VTK_MODULE_INIT(vtkRenderingFreeType);#include <vtkImageImport.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkSmartPointer.h>
#include <vtkImageViewer2.h>

读取、解压缩并显示dicom文件

DJDecoderRegistration::registerCodecs(); // register JPEG codecsDcmFileFormat fileformat;if (fileformat.loadFile("E://DICOM//2021071009//0200.dcm").good()){DcmDataset *dataset = fileformat.getDataset();// decompress data set if compressedif (dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL).good() &&dataset->canWriteXfer(EXS_LittleEndianExplicit)){//fileformat.saveFile("0200_decompressed.dcm", EXS_LittleEndianExplicit);DicomImage* image = new DicomImage(dataset, EXS_LittleEndianExplicit); //生成DicomImageif (image != NULL && image->getStatus() == EIS_Normal){IntType *SliceData = (IntType *)(image->getOutputData(BIT /* bits per sample */));cout << SliceData << endl;if(SliceData != NULL){vtkSmartPointer<vtkImageImport> import = vtkImageImport::New();import->SetImportVoidPointer(SliceData);import->SetDataScalarTypeToShort();import->SetDataExtent(0,775,0,775,0,0);import->SetWholeExtent(0,775,0,775,0,0);import->Update();vtkSmartPointer<vtkImageViewer2> viewer = vtkImageViewer2::New();vtkSmartPointer<vtkRenderWindowInteractor> interactor = vtkRenderWindowInteractor::New();viewer->SetupInteractor(interactor);viewer->SetInputConnection(import->GetOutputPort());viewer->SetColorLevel(600);viewer->SetColorWindow(3200);viewer->Render();interactor->Start();}}else{cerr << "Error: cannot load DICOM image ("<< DicomImage::getString(image->getStatus())<< ").\nError code: 3" << endl;return 3;}delete image;}}DJDecoderRegistration::cleanup();

显示效果图:

以上仅为简易版本demo,如有错误请指出,谢谢!

不要去做一个成功的人,要去做一个有价值的人。

DCMTK读取压缩格式的DICOM文件并使用Vtk显示相关推荐

  1. pydicom读取头文件_pydicom读取压缩格式的DICOM图像报错的解决方案

    本文由Markdown语法编辑器编辑完成. 前言: 已知用pydicom读取一类Dicom图像时会报错,报错信息大致如下: OSError: cannot identify image file &l ...

  2. python 读取excel格式xml,读取xml格式的xls文件、解析其中数据

    1.python 读取excel格式xml,解析其中数据 当excel文件的格式是xml的时候,window系统是可以正常打开的,但是使用pandas直接读取则会报错,原因就是现在已经是xml文件了, ...

  3. 解码和读取GRB2格式的气象文件

    解码和读取GRB2格式的气象文件 使用pygrib WINDOWS下的wgrib2 使用pygrib 这里使用的GRB2格式文件是国家气象信息中心的CMPAS降水融合资料.HRCLDAS陆面融合实况资 ...

  4. 读取服务器端的一个json文件info.json,显示到客户端,再从客户端输入两个变量contry和city,传到服务器,改变服务器info.json文件的这两个值

    读取服务器端的一个json文件info.json,显示到客户端,再从客户端输入两个变量contry和city,传到服务器,改变服务器info.json文件的这两个值. j son的文件名info.js ...

  5. pdmreader支持读取xml格式的pdm文件,无法读取二进制格式的pdm文件。

    您的Pdm数据字典文件可能不被PDMReader读取,可能是因为pdm文件版本的问题.但 您可以通过PowerDesigner12(下载PowerDesigner12)进行转换 后进行读取. 您要做的 ...

  6. pandas 读取/保存压缩格式的csv文件.csv.gz

    保存 data.to_csv('data.csv.gz', compression='gzip', index=False) 读取 pd.read_csv('data.csv.gz', compres ...

  7. python读取ods格式的表格文件

    1.安装odfpy模块 pip install odfpy 2.操作代码 from odf import text, teletype from odf.opendocument import loa ...

  8. POI读取excel。读取MultipartFile格式的excel文件

    POI读取excel文件 package com.learn;import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.user ...

  9. opencv 读取NV12格式(.yuv)文件,并转为RGB格式保存为JPG

    实测代码如下: #include <iostream> #include <stdio.h> #include <string.h> #include <op ...

最新文章

  1. 贝叶斯网络之父Judea Pearl推荐:迈向可解释的知识驱动系统
  2. 轻松理解https,So easy!
  3. Pocket Hacking: NetHunter实战指南
  4. oracle过率乱码,oracle中文乱码问题处理
  5. Splunk集成Kafka配置方法
  6. python基础-PyCharm设置作者信息模板_修改解释器_设置软件UTF-8编码
  7. Python实现一键打开/关闭防火墙
  8. 给git命令设置别名
  9. 与网络计算机相比,和通信网络相比,计算机网络最本质的功能是什么
  10. 【算法笔记】求长度为n的序列的全排列包含的总逆序对数目(树状数组求解)
  11. 黑马程序员JS学习第一天
  12. VS2015编辑图片
  13. KingbaseES 中的xmin,xmax等系统字段说明
  14. 软件 购 买 优 惠 券及使用说明
  15. NaN == NaN 的结果是什么?
  16. unicode编码转gb2312编码并显示中文(cjava)
  17. java 给word加水印,Java 实现在线给word 文档添加水印
  18. eclipse 2021-09版本汉化--英化
  19. 共享wifi到底应该怎么样去运营呢?
  20. 新浪云 股票实时筛选系统 设计

热门文章

  1. Windows复制文件提示指定的文件名无效或太长
  2. B树,B+树,B*树以及R树的介绍
  3. 【转】强悍的搞笑语录,老衲再也忍…
  4. HashMap、哈希表、哈希函数
  5. 【龙芯文化】龙芯的持久战
  6. Linux svn checkout命令使用示例
  7. 基于SpringBoot的AOP记录日志
  8. 古诺模型里的纳什均衡
  9. HTTP content-type
  10. 二手房数据的分析与挖掘(七)-- 预测房价