您的位置:首页 > 其它

DCMTK开源库:程序包简介+支持的一些信息

2015-07-28 16:40 1156 查看
关于DCMTK开源库的知识:

一、dcmtk程序包简介:http://blog.csdn.net/diqiucun666/article/details/2866908(dcmtk开源库很好的中文说明手册)

二、编译DCMTK:http://blog.csdn.net/jackmacro/article/details/5332665

三、DCMTK所支持的一些信息:http://bbs.hc3i.cn/thread-10147-1-1.html

学到的是:

一、dcmtk程序包简介

        该文简单列出了dcmtk程序包的简介,包括主要接口类的简单说明,可用工具以及一些例子。下一步工作准备详细分析每个程序包中的接口类功能,并结合源码和dicom文档分析其实现过程。

1、dcmdata程序包

        -dcmdata:一个数据编码/解码库和可用的工具

        这个模块包含了一些类来管理Dicom数据结构和文件。同时它也提供了对DICOMDIR文件的支持以满足Dicom
storage media(存储介质)的需要。

        主要的接口类有:

        --DcmFileFormat:a class
handling the DICOM file format (with meta header) 。头文件在dcfilefo.h。***详情在单独的文档中分析***

        --DcmDataset:a class handling the DICOM dataset format (files without meta header) 。头文件在dcdatset.h。***详情在单独的文档中分析***

        --DcmItem:a class representing a collection of DICOM elements。头文件在dcitem.h。**详情在单独的文档中分析**

        --DcmElement:abstract base class for all DICOM elements。头文件在dcelem.h。*详情在单独的文档中分析*。它的派生类包括:DcmAttributeTag\DcmByteString\DcmFloatingPointDouble\DcmFloatingPointSingle\DcmOtherByteOtherWord\DcmSequenceOfItems\DcmSignedLong\DcmSignedShort\DcmUnsignedLong\DcmUnsignedShort

        工具:这个模块包含了下面的命令行工具:

        dcm2xml: Convert DICOM file and data set to XML

        dcmconv: Convert DICOM file encoding

        dcmcrle: Encode DICOM file to RLE transfer syntax

        dcmdrle: Decode RLE-compressed DICOM file

        dcmdump: Dump DICOM file and data set

        dcmftest: Test if file uses DICOM part 10 format

        dcmgpdir: Create a general purpose DICOMDIR

        dcmodify: Modify DICOM files

        dump2dcm: Convert ASCII dump to DICOM file

        xml2dcm: Convert XML document to DICOM file or data set

***暂时不对命令行工具进行详细的分析***

举例:

        --调入一个DICOM文件,输出病人姓名

DcmFileFormat fileformat;

OFCondition status = fileformat.loadFile("test.dcm");

if (status.good())

{OFString patientsName;

If (fileformat.getDataset()->findAndGetOFString(DCM_PatientsName, patientsName).good())

{    cout << "Patient's Name: " << patientsName << endl;

} else

    cerr << "Error: cannot access Patient's Name!" << endl;

} else

cerr << "Error: cannot read DICOM file (" << status.text() << ")" << endl;

        --创建一个DICOM
dataset数据集,并保存为文件


char uid[100];

DcmFileFormat fileformat;

DcmDataset *dataset = fileformat.getDataset();

dataset->putAndInsertString(DCM_SOPClassUID, UID_SecondaryCaptureImageStorage);

dataset->putAndInsertString(DCM_SOPInstanceUID, dcmGenerateUniqueIdentifier(uid, SITE_INSTANCE_UID_ROOT));

dataset->putAndInsertString(DCM_PatientsName, "Doe^John");

 

dataset->putAndInsertUint8Array(DCM_PixelData, pixelData, pixelLength);

OFCondition status = fileformat.saveFile("test.dcm", EXS_LittleEndianExplicit);

if (status.bad())

cerr << "Error: cannot write DICOM file (" << status.text() << ")" << endl;

2、dcmimgle程序包

        dcmimgle是一个图像处理库和可用的工具模块,它包括了对DICOM单色图像的访问和显示。对颜色图像的支持由dcmimage模块提供,对JPEG压缩图像的支持由dcmjpeg模块支持。

        主要接口类:

        --DicomImage: 为dcmimgle/dcmimage模块提供接口类。主要目的是图像显示。在dcmimage.h中定义。

        --DiDisplayFunction: Class to handle hardcopy and softcopy device characteristics file and manage display LUTs (for calibration). 在didispfn.h中定义。

        可用工具:

        --dcmdspfn: Export standard display curves to a text file

        --dcod2lum: Convert hardcopy characteristic curve file to softcopy format

        --dconvlum: Convert VeriLUM files to DCMTK display files

举例:

        --载入一幅DICOM单帧单色图像,并显示其像素数据

DicomImage *image = new DicomImage("test.dcm");

if (image != NULL)

{if (image->getStatus() == EIS_Normal)

{  

 if (image->isMonochrome())

    {

      image->setMinMaxWindow();

      Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 ));

      if (pixelData != NULL)

      {

        /* do something useful with the pixel data */

      }

    }

} else

    cerr << "Error: cannot load DICOM image (" << DicomImage::getString(image->getStatus()) << ")" << endl;

}

delete image;

3、dcmimage程序包

        dcmimage模块为dcmimgle模块提供对彩色图像的支持。对单色图像的支持由dcmimgle提供,对JPEG压缩图像的支持由dcmjpeg模块支持。

        主要接口类:

        --DicomImage: 在dcmimgle中已介绍。

        工具:

        --dcm2pnm: Convert DICOM images to PPM/PGM, PNG, TIFF or BMP

        --dcmquant: Convert DICOM color images to palette color

        --dcmscale: Scale DICOM images

举例:

        --载入一幅DICOM单帧图像(单色或彩色),并显示其像素数据。

#include "diregist.h"  

 

DicomImage *image = new DicomImage("test.dcm");

if (image != NULL)

{

if (image->getStatus() == EIS_Normal)

{

    Uint8 *pixelData = (Uint8 *)(image->getOutputData(8 ));

    if (pixelData != NULL)

    {

      /* do something useful with the pixel data */

    }

} else

    cerr << "Error: cannot load DICOM image (" << DicomImage::getString(image->getStatus()) << ")" << endl;

}

delete image;

4、dcmjpeg程序包

        dcmjpeg提供了一个压缩/解压缩库以及可用工具。该模块包含一些类,可将DICOM图像对象在非压缩和JPEG压缩表示(传输协议)之间转换。无失真和有失真JPEG处理都被支持。这个模块实现了一族codec(编码解码器,由DcmCodec类派生而来),可以将这些codec在codec
list中注册,codec list是由dcmdata模块保存的。

        主要接口类:

        --DJEncoderRegistration: 一个singleton(孤立)类,为所有支持的JPEG处理注册编码器。在djencode.h中定义。

        --DJDecoderRegistration: 一个singleton(孤立)类,为所有支持的JPEG处理注册解码器。在djdecode.h中定义。

        --DJCodecEncoder: JPEG编码器的一个抽象codec类。This
abstract class contains most of the application logic needed for a dcmdata codec object that implements a JPEG encoder using the DJEncoder interface to the underlying JPEG implementation. This class only supports compression, it neither implements decoding
nor transcoding. 在djcodece.h中定义。

        --DJCodecDecoder: JPEG解码器的一个抽象codec类。This
abstract class contains most of the application logic needed for a dcmdata codec object that implements a JPEG decoder using the DJDecoder interface to the underlying JPEG implementation. This class only supports decompression, it neither implements encoding
nor transcoding.

        工具:

        dcmcjpeg: Encode DICOM file to JPEG transfer syntax

        dcmdjpeg: Decode JPEG-compressed DICOM file

        dcmj2pnm: Convert DICOM images to PGM, PPM, BMP, TIFF or JPEG

        dcmmkdir: Create a DICOMDIR file

举例:

     
  --用无失真JPEG压缩一幅DICOM图像文件。

DJEncoderRegistration::registerCodecs(); // register JPEG codecs

DcmFileFormat fileformat;

if (fileformat.loadFile("test.dcm").good())

{

DcmDataset *dataset = fileformat.getDataset();

DcmItem *metaInfo = fileformat.getMetaInfo();

DJ_RPLossless params; // codec parameters, we use the defaults

// this causes the lossless JPEG version of the dataset to be created

dataset->chooseRepresentation(EXS_JPEGProcess14SV1TransferSyntax, ¶ms);

// check if everything went well

if (dataset->canWriteXfer(EXS_JPEGProcess14SV1TransferSyntax))

{    // force the meta-header UIDs to be re-generated when storing the file

    // since the UIDs in the data set may have changed

    delete metaInfo->remove(DCM_MediaStorageSOPClassUID);

    delete metaInfo->remove(DCM_MediaStorageSOPInstanceUID);

    // store in lossless JPEG format

    fileformat.saveFile("test_jpeg.dcm", EXS_JPEGProcess14SV1TransferSyntax);

}

}  DJEncoderRegistration::cleanup(); // deregister JPEG codecs

        --解压缩一幅JPEG压缩的DICOM图像文件。

DJDecoderRegistration::registerCodecs(); // register JPEG codecs

DcmFileFormat fileformat;

if (fileformat.loadFile("test_jpeg.dcm").good())

{

DcmDataset *dataset = fileformat.getDataset();

// decompress data set if compressed

dataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL);

// check if everything went well

if (dataset->canWriteXfer(EXS_LittleEndianExplicit))

{

    fileformat.saveFile("test_decompressed.dcm", EXS_LittleEndianExplicit);

}

}   DJDecoderRegistration::cleanup(); // deregister JPEG codecs
二、/MTd
        C语言运行库的引如方式有两种。与MFC的用法一样,有动态链接的方式和静态链接的方式。也就是编译参数/MT
/MTd /MD /MDd负责控制啦。
         /MT负责链接发行版的C语言运行库(静态链接)。
         /MTd负责链接调试版的C语言运行库(静态链接)
         /MD负责链接发行版的C语言运行库(动态链接)。
         /MDd负责链接调试版的C语言运行库(动态链接)。

三、DCMKT所支持的信息

        由于我主要是用DCMTK进行研究,所以说明一下它现在所支持的一些信息:
        在请求中,它支持以下字段(我用数据库来理解DICOM的,所以我习惯叫它们字段)

(0008,0050) AccessionNumber 工作流号

(0008,0090) ReferringPhysiciansName 提交人(医师)名字

(0010,0010) PatientsName 病人姓名

(0010,0020) PatientID 病人ID

(0010,0040) PatientsSex 病人性别

(0032,1032) RequestingPhysician 请求医师

(0038,0010) AdmissionID 允许进入ID

(0040,0100) ScheduledProcedureStepSequence 安排程序序列

(0008,0060) > Modality 设备样式(设备名:如CT,CR等)

(0040,0001) > ScheduledStationAETitle 预定工作站的应用实体名

(0040,0002) > ScheduledProcedureStepStartDate 预定的操作日期

(0040,0003) > ScheduledProcedureStepStartTime 预定的操作时间

(0040,0006) > ScheduledPerformingPhysiciansName 检查医生姓名

(0040,1001) RequestedProcedureID 被请求的程序ID

(0040,1003) RequestedProcedurePriority 被请求过程的优先权

支持以下返回信息:

(0008,0005) SpecificCharacterSet

(0008,0050) AccessionNumber

(0008,0080) InstitutionName

(0008,0081) InstitutionAddress

(0008,0090) ReferringPhysiciansName

(0008,1080) AdmittingDiagnosesDescription

(0008,1110) ReferencedStudySequence

(0008,1150) > ReferencedSOPClassUID

(0008,1155) > ReferencedSOPInstanceUID

(0008,1120) ReferencedPatientSequence

(0008,1150) > ReferencedSOPClassUID

(0008,1155) > ReferencedSOPInstanceUID

(0010,0010) PatientsName

(0010,0020) PatientID

(0010,0030) PatientsBirthDate

(0010,0040) PatientsSex

(0010,1000) OtherPatientIDs

(0010,1001) OtherPatientNames

(0010,1020) PatientsSize

(0010,1030) PatientsWeight

(0010,1040) PatientsAddress

(0010,1080) MilitaryRank

(0010,2000) MedicalAlerts

(0010,2110) ContrastAllergies

(0010,2160) EthnicGroup

(0010,21a0) SmokingStatus

(0010,21b0) AdditionalPatientHistory

(0010,21c0) PregnancyStatus

(0010,21d0) LastMenstrualDate

(0010,4000) PatientComments

(0020,000d) StudyInstanceUID

(0032,1032) RequestingPhysician

(0032,1033) RequestingService

(0032,1060) RequestedProcedureDescription

(0032,1064) RequestedProcedureCodeSequence

(0008,0100) > CodeValue

(0008,0102) > CodingSchemeDesignator

(0008,0103) > CodingSchemeVersion

(0008,0104) > CodeMeaning

(0038,0010) AdmissionID

(0038,0011) IssuerOfAdmissionID

(0038,0050) SpecialNeeds

(0038,0300) CurrentPatientLocation

(0038,0500) PatientState

(0040,0100) ScheduledProcedureStepSequence

(0008,0060) > Modality

(0032,1070) > RequestedContrastAgent

(0040,0001) > ScheduledStationAETitle

(0040,0002) > ScheduledProcedureStepStartDate

(0040,0003) > ScheduledProcedureStepStartTime

(0040,0004) > ScheduledProcedureStepEndDate

(0040,0005) > ScheduledProcedureStepEndTime

(0040,0006) > ScheduledPerformingPhysiciansName

(0040,0007) > ScheduledProcedureStepDescription

(0040,0008) > ScheduledProtocolCodeSequence

(0008,0100) > > CodeValue

(0008,0102) > > CodingSchemeDesignator

(0008,0103) > > CodingSchemeVersion

(0008,0104) > > CodeMeaning

(0040,0009) > ScheduledProcedureStepID

(0040,0010) > ScheduledStationName

(0040,0011) > ScheduledProcedureStepLocation

(0040,0012) > PreMedication

(0040,0020) > ScheduledProcedureStepStatus

(0040,0400) > CommentsOnTheScheduledProcedureStep

(0040,1001) RequestedProcedureID

(0040,1002) ReasonForTheRequestedProcedure

(0040,1003) RequestedProcedurePriority

(0040,1004) PatientTransportArrangements

(0040,1005) RequestedProcedureLocation

(0040,1008) ConfidentialityCode

(0040,1009) ReportingPriority

(0040,1010) NamesOfIntendedRecipientsOfResults

(0040,1400) RequestedProcedureComments

(0040,2001) ReasonForTheImagingServiceRequest

(0040,2004) IssueDateOfImagingServiceRequest

(0040,2005) IssueTimeOfImagingServiceRequest

(0040,2008) OrderEnteredBy

(0040,2009) OrderEnterersLocation

(0040,2010) OrderCallbackPhoneNumber

(0040,2016) PlacerOrderNumberImagingServiceRequest

(0040,2017) FillerOrderNumberImagingServiceRequest

(0040,2400) ImagingServiceRequestComments

(0040,3001) ConfidentialityConstraintOnPatientDataDescription
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: