關於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