DCMTK開源庫:程序包簡介+支持的一些信息

關於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(存儲介質)的需要。

        主要的接口類有:

        --DcmFileFormata class handling the DICOM file format (with meta header) 。頭文件在dcfilefo.h***詳情在單獨的文檔中分析***

        --DcmDataseta class handling the DICOM dataset format (files without meta header) 。頭文件在dcdatset.h***詳情在單獨的文檔中分析***

        --DcmItema class representing a collection of DICOM elements。頭文件在dcitem.h**詳情在單獨的文檔中分析**

        --DcmElementabstract 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類派生而來),可以將這些codeccodec 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, &params);

// 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
 設備樣式(設備名:如CTCR等)
(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



發佈了23 篇原創文章 · 獲贊 17 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章