本篇文章介绍如何
- 基于dcmtk实现Radiant软件的提供的窗宽窗位操作。
- dcmtk的其他高级窗宽窗位操作
样例图像默认窗宽窗位如下:
一. 基于dcmtk实现Radiant软件的提供的窗宽窗位操作。
radiant的窗宽窗位操作有如下几种:
Default window是dicom文件中默认的窗宽窗位
Full dynamic是根据dicom文件中的最大CT值和最小CT值计算的窗宽窗位
Negative是反片,即CT值越小,越亮
CT Adbomen等条目根据不同设备类型,显示不同。
CT设备图像则显示预设的各个器官的标准窗宽窗位,比如腹部CT,wl=60,ww=400,能更好的显示腹部组织。
CT图像窗宽窗位相关操作:
各个器官对应的窗宽窗位值
MR图像窗宽窗位相关操作:
US图像窗宽窗位相关操作
前面讲过,窗宽窗位调整属于Voi lut。dcmtk通过DicomImage类的getOutputData方法获Voi lut转换后的灰度值。
以下代码只展示dcmtk相关,图像显示部分见前面文章。
- Default window
//获取默认窗宽窗位
ww = dcmParse->GetElementValueFloat(DCM_WindowWidth);
wl = dcmParse->GetElementValueFloat(DCM_WindowCenter);
//设置默认窗宽窗位
dicomImg->setWindow(wl, ww);
//获取灰度值
int size = dicomImg->getOutputDataSize(8);
unsigned char *pixelDataGrey = new unsigned char[size];
dicomImg->getOutputData(pixelDataGrey, size, 8);
dcmtk和radiant显示效果一致:
dcmtk默认窗宽窗位显示
radiant默认窗宽窗位显示
2. Full dynamic
如果不主动设置窗宽窗位,dcmtk默认使用最大CT值和最小CT值计算的窗宽窗位,即显示dicom图像中的全部CT值。
int size = dicomImg->getOutputDataSize(8);
unsigned char *pixelDataGrey = new unsigned char[size];
dicomImg->getOutputData(pixelDataGrey, size, 8);
getOutputData的内部方法nowindow方法中的核心代码:
const double absmin = inter->getAbsMinimum();
const double absmax = inter->getAbsMaximum();
const double outrange = OFstatic_cast(double, high) - OFstatic_cast(double, low) + 1; // output range
const double gradient = outrange / (inter->getAbsMaxRange());
for (i = 0; i < ocnt; ++i) // calculating LUT entries
*(q++) = OFstatic_cast(T3, OFstatic_cast(double, low) + OFstatic_cast(double, i) * gradient);
显示效果一致:
dcmtk 全动态窗宽窗位显示
radiant全动态窗宽窗位显示
3. CT Adbomen
int ww = 400;
int wl = 60;
dicomImg->setWindow(wl, ww);
int size = dicomImg->getOutputDataSize(8);
unsigned char *pixelDataGrey = new unsigned char[size];
dicomImg->getOutputData(pixelDataGrey, size, 8);
显示效果一致:
dcmtk 腹部窗宽窗位显示
radiant腹部窗宽窗位显示
其他部位窗宽窗位调整同腹部
4. Negative
ww = dcmParse