9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析

  本篇文章介绍如何

  1. 基于dcmtk实现Radiant软件的提供的窗宽窗位操作。
  2. dcmtk的其他高级窗宽窗位操作
    样例图像默认窗宽窗位如下:
    在这里插入图片描述
    一. 基于dcmtk实现Radiant软件的提供的窗宽窗位操作。
    radiant的窗宽窗位操作有如下几种:
      Default window是dicom文件中默认的窗宽窗位
      Full dynamic是根据dicom文件中的最大CT值和最小CT值计算的窗宽窗位
      Negative是反片,即CT值越小,越亮
      CT Adbomen等条目根据不同设备类型,显示不同。
      CT设备图像则显示预设的各个器官的标准窗宽窗位,比如腹部CT,wl=60,ww=400,能更好的显示腹部组织。

CT图像窗宽窗位相关操作:
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第1张图片
各个器官对应的窗宽窗位值
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第2张图片
MR图像窗宽窗位相关操作:
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第3张图片
US图像窗宽窗位相关操作
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第4张图片
  前面讲过,窗宽窗位调整属于Voi lut。dcmtk通过DicomImage类的getOutputData方法获Voi lut转换后的灰度值。
  以下代码只展示dcmtk相关,图像显示部分见前面文章。

  1. 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默认窗宽窗位显示
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第5张图片

radiant默认窗宽窗位显示
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第6张图片
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 全动态窗宽窗位显示
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第7张图片

radiant全动态窗宽窗位显示
9. DICOM图像显示-DCMTK-窗宽窗位调整和源码分析_第8张图片
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 腹部窗宽窗位显示

你可能感兴趣的:(DICOM图像高级应用,dicom,c++,vtk)