【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试
轉(zhuǎn)自:https://blog.csdn.net/zssureqh/article/details/8785132
DCMTK官網(wǎng)給出了JPEG格式壓縮的DCM文件解壓縮的方法(http://support.dcmtk.org/docs/mod_dcmjpeg.html),代碼摘錄如下:
?
DJDecoderRegistration::registerCodecs(); // register JPEG codecs DcmFileFormat fileformat; if (fileformat.loadFile("test_jpeg.dcm").good()) {DcmDataset *dataset = fileformat.getDataset();// decompress data set if compresseddataset->chooseRepresentation(EXS_LittleEndianExplicit, NULL);// check if everything went wellif (dataset->canWriteXfer(EXS_LittleEndianExplicit)){fileformat.saveFile("test_decompressed.dcm", EXS_LittleEndianExplicit);} } DJDecoderRegistration::cleanup(); // deregister JPEG codecs
通過嘗試,生成的test_decompressed.dcm的傳輸語義TransferSyntex發(fā)生了改變,且像素數(shù)據(jù)區(qū)中的數(shù)據(jù)就代表了dcm圖像中的真實像素值。利用UltraEdit等二進制編輯軟件打開后一目了然:
?
原本壓縮的像素數(shù)據(jù)區(qū),被解壓了出來:30 F8 30 F8 30 F8……,dcm文件中每個像素用16位來表示,采用的小端存儲模式,30 F8就是十進制的-2000,即測試圖像的填充背景的CT值。
博文(http://support.dcmtk.org/wiki/dcmtk/howto/accessing-compressed-data)給出了獲取解壓后的真實像素數(shù)據(jù)內(nèi)存指針的方法,主要是的語句是:
?
DcmElement* element = NULL;result = data->findAndGetElement(DCM_PixelData, element);if (result.bad() || element == NULL)return 1; short* pixData;result = element->getUint8Array(pixData);此時pixData就指向了上圖中的30 F8 30 F8 30 F8像素數(shù)據(jù)區(qū)的首地址。至此可以直接對dcm的像素進行操作,如下圖是對其進行二值化的結(jié)果:
?
此處有一個問題未能解決:如果在對pixData指向的區(qū)域進行操作后,調(diào)用保存函數(shù)saveFile時未選擇EXS_LittleEndianExplicit格式,生成的結(jié)果依然是原始圖像。
總結(jié)
以上是生活随笔為你收集整理的【转】DCMTK 开源库的学习笔记2:直接操作dcm文件中像素数据的尝试的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: winform 判断控件有没有被遮挡_编
- 下一篇: 【转】extern “C“和__decl