日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

java读取dcm影像文件_使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像

發(fā)布時(shí)間:2025/4/5 88 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java读取dcm影像文件_使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

借助VS2013和OpenCV的繪圖功能,在工程DICOMReader.sln中實(shí)現(xiàn)了對(duì)單張.dcm圖像的讀取與顯示,以下是詳細(xì)步驟。

前期準(zhǔn)備工作

編譯器:VS2013

庫:dcmtk-3.6.0(已編譯)、OpenCV

配置方法:

【項(xiàng)目屬性頁】-【VC++ 目錄】-【包含目錄】&【庫目錄】,加入如下文件夾

庫目錄

包含目錄

對(duì)于OpenCV的配置,還需要在【我的電腦】-【屬性】-【高級(jí)系統(tǒng)設(shè)置】-【環(huán)境變量】中的“path”中添加OpenCV的“bin”文件夾(如果沒有path,可以手動(dòng)添加,至于系統(tǒng)變量還是用戶變量,沒有太大關(guān)系)

:…\opencv\build\x86\vc12\bin;

(在win7的系統(tǒng)上配置過的環(huán)境變量似乎不能立刻生效,運(yùn)行程序的時(shí)候還是會(huì)提示“未能正確安裝xxx.dll鏈接庫”之類的話,重啟后可解決該問題)

最后,在【鏈接器】-【輸入】-【附加依賴項(xiàng)】添加如下鏈接庫:

netapi32.lib

wsock32.lib

ofstd.lib

oflog.lib

dcmimgle.lib

ijg8.lib

ijg12.lib

ijg16.lib

dcmdata.lib

dcmimage.lib

dcmnet.lib

opencv_core2413d.lib

opencv_features2d2413d.lib

opencv_flann2413d.lib

opencv_highgui2413d.lib

頭文件寫法:

#include "dcmtk/dcmdata/dctk.h"

#include "dcmtk/dcmimgle/dcmimage.h"

#include "dcmtk/dcmdata/dcfilefo.h"

#include

using namespace std;

讀取文件并獲取相關(guān)信息

在dcmtk庫中,包含了一個(gè)DcmFileFormat類,用來對(duì)原始.dcm文件進(jìn)行操作,具體用法如下:

加載文件

DcmFileFormat dfile;

//文件路徑

string afile = "...\\**.dcm";

OFCondition result = dfile.loadFile(path.c_str()); // 加載文件

if (result.bad())

return ERROR;

// 功能函數(shù)如上方的loadFile,調(diào)用后會(huì)返回一個(gè)OFCondition類型的數(shù)據(jù)

// 可以過該類的成員函數(shù)bad()函數(shù)檢測(cè)是否調(diào)用成功

獲取文件相關(guān)信息

.dcm文件里面的數(shù)據(jù)結(jié)構(gòu)大致如下:

簡單來說,一個(gè).dcm格式的文件中,包含了一個(gè)數(shù)據(jù)集(Data set),由如下代碼獲取這個(gè)數(shù)據(jù)集:

DcmDataset *data = dfile.getDataset();

而DcmFileFormat類的構(gòu)造函數(shù),也允許由一個(gè)數(shù)據(jù)集(Data set)創(chuàng)建一個(gè)對(duì)象:

DcmFileFormat(); // default constructor

DcmFileFormat(DcmDataset *dataset); // using dataset

DcmFileFormat(const DcmFileFormat &old); // copy constructor

.dcm文件就像一個(gè)容器,而數(shù)據(jù)集才是真正的內(nèi)容。

在數(shù)據(jù)集(Data set)中,包含了文件的元信息(Meta Information,存儲(chǔ)了被封裝數(shù)據(jù)集的標(biāo)識(shí)信息)以及數(shù)據(jù)元素(Data Element);通過調(diào)用相應(yīng)的函數(shù)來獲取文件的元信息以及數(shù)據(jù)集,代碼如下:

DcmMetaInfo *Metalnfo = dfile.getMetaInfo(); // 文件元信息

DcmTag Tag = Metalnfo->getTag(); // 從元信息中獲取標(biāo)簽

DcmDataset *data = dfile.getDataset(); // 數(shù)據(jù)集

DcmElement *element = NULL;

result = data->findAndGetElement(DCM_PixelData, element);

if (result.bad())

return ERROR;

需要特別注意的是:

創(chuàng)建數(shù)據(jù)元素對(duì)象的時(shí)候,最好給其賦值為NULL,以免初始值指向未知的地址;

findAndGetElement(DCM_PixelData, element);該函數(shù)用來獲取數(shù)據(jù)元素,函數(shù)中的第一個(gè)參數(shù)“DCM_PixelData”為用戶想要從數(shù)據(jù)集中獲取的數(shù)據(jù)元素類型,具體的元素類型可以參考頭文件“dcdeftag.h”。(共有3250種參數(shù)類型)

數(shù)據(jù)元素(Data Element)從邏輯上說就是數(shù)據(jù)集(Data set)的一個(gè)子集,因此,通常來說,通過“findAndGetElement()”函數(shù)獲得的數(shù)據(jù)元素會(huì)比數(shù)據(jù)集的長度來的小,可以通過如下方式進(jìn)行檢測(cè):

Uint32 data_len = data->getLength();

Uint32 element_len = element->getLength();

cout << "data_len " << data_len << endl;

cout << "elemetn_len " << element_len << endl;

獲取數(shù)據(jù)元素(Data Element)只是將數(shù)據(jù)集(Data set)中的我們感興趣的部分存儲(chǔ)到了由類DcmElement創(chuàng)建的對(duì)象里面,那么自然地,我們會(huì)想到數(shù)據(jù)的可視化,這將采取另一種處理方式:

dcmtk庫中包含了類“OFString”,這只是一個(gè)簡單的字符串類,它實(shí)現(xiàn)了std的一個(gè)子集::string;我們通過函數(shù)“findAndGetOFString()”來獲取我們要的數(shù)據(jù)項(xiàng),并將其保存在類OFString創(chuàng)建的對(duì)象中,以此來實(shí)現(xiàn)數(shù)據(jù)可視化。具體代碼如下:

OFString PatientName;

data->findAndGetOFString(DCM_PatientName, PatientName);

cout << "PatientName: " << PatientName<< endl;

圖像的顯示

由之前的代碼:

DcmElement *element = NULL;

result = data->findAndGetElement(DCM_PixelData, element);

if (result.bad())

return ERROR;

獲取了圖像的像素?cái)?shù)據(jù),進(jìn)行進(jìn)一步的操作:

Uint16* pixData16;

result = element->getUint16Array(pixData16);

if (result.bad())

return ERROR;

由數(shù)據(jù)元素(Data Element)的成員函數(shù)getUint16Array()將對(duì)應(yīng)的像素?cái)?shù)據(jù)存儲(chǔ)到無符號(hào)整型(unsigned short,即Uint16,又稱無符號(hào)16位整型)數(shù)組中,獲得一個(gè)向量;再借助OpenCV的創(chuàng)建矩陣和顯示圖像的功能,進(jìn)行圖像的顯示:

for (int i = 0; i < 512*512; i++)

*(pixData16 + i) *= 20; // 灰度拉伸

cv::Mat imag = cv::Mat(512, 512, CV_16U, pixData16);

cv::imshow("image", imag);

cv::waitKey();

在創(chuàng)建矩陣之前,進(jìn)行了灰度拉伸,以提升顯示的亮度。

最終效果如上。現(xiàn)在有個(gè)問題,在進(jìn)行數(shù)據(jù)拉伸的時(shí)候,預(yù)先已經(jīng)知道了CT圖像的行列值的大小,而應(yīng)該利用哪個(gè)參數(shù)或者函數(shù)來獲取圖像的size呢?

總結(jié)

以上是生活随笔為你收集整理的java读取dcm影像文件_使用dcmtk库读取.dcm文件并获取信息+使用OpenCV显示图像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。