11. DICOM图像显示-DCMTK-overlay覆盖层处理和源码分析

本文介绍了如何使用DCMTK实现Radiant软件的图像overlay操作,包括显示和隐藏overlay数据,解析DICOM图像的overlay数据,添加自定义overlay层,并展示了如何在DICOM图像上显示"HELLO"。详细讨论了DCMTK的源码实现,如DiMonoImage的构造和getOutputData方法,以及如何通过addOverlay和showOverlay接口添加和管理overlay。
摘要由CSDN通过智能技术生成

  本篇文章介绍如何基于dcmtk实现Radiant软件图像overlay操作。并实现添加自定义overlay层,如何显示"HELLO"。
在这里插入图片描述
  dicom协议的overlay原理部分见文章1.9 DICOM带有overlay覆盖层图像显示(一层覆盖层)
Radiant有如下overlay操作:
隐藏和显示overlay数据
在这里插入图片描述
样例图像
在这里插入图片描述
在这里插入图片描述
一. 实现Radiant相同功能
  上图所示的DICOM图像有两层overlay,PixelData全为0。图像中显示的全是overlay数据。

  1. 显示overlay数据

  dcmtk默认显示图像原有的overlay数据,将overlay数据叠加到pixeldata数据上。

1.1 应用层代码实现

int size = dicomImg->getOutputDataSize(8);
unsigned char *pixelDataGrey = new unsigned char[size];
dicomImg->getOutputData(pixelDataGrey, size, 8);

  如果手动设置了隐藏overlay层,可以手动设置显示overlay层。
  可以单独显示某一层overlay,也可以显示全部overlay层

//判断第一层是否可见
int isVisible = dicomImg->isOverlayVisible(0);
if(isVisible == 0)
{
   
	//显示第一层overlay
	dicomImg->showOverlay(0);
	//显示所有层overlay
	dicomImg->showAllOverlays();
}

int size = dicomImg->getOutputDataSize(8);
unsigned char *pixelDataGrey = new unsigned char[size];
dicomImg->getOutputData(pixelDataGrey, size, 8);

  显示效果
  bit值为1则有意义像素(默认白色,可自定义颜色),bit为0表示没有意义像素(黑色)。
在这里插入图片描述
1.2 底层源码解析

(1)获取图像自带的overlay数据

  在DicomImage构造函数内部执行DiMonoImage::Init方法,获得图像自带的overlay数据,并设置默认显示数据

void DiMonoImage::Init(DiMonoModality *modality,
                       const OFBool reuse)
{
   
    if (modality != NULL)
    {
   
        /* only create new overlay object if none exists */
        if (Overlays[0] == NULL)
        {
   
            Overlays[0] = new DiOverlay(Document, BitsAllocated, BitsStored, HighBit);
            if ((Overlays[0] != NULL) && !(Document->getFlags() & CIF_UsePresentationState))
                Overlays[0]->showAllPlanes();               // default: show all overlays with stored modes

(2)将overlay数据叠加到pixeldata数据
  在DicomImage的getOutputData方法内调用DiMonoOutputPixelTemplate方法,进行Voi lut的窗宽窗位调整后,进行overlay数据叠加

{
   
     if (width < 1)                                  // no valid window according to supplement 33
         nowindow(pixel, frame * FrameSize, plut, disp, OFstatic_cast(T3, low), OFstatic_cast(T3, high));
     else if (vfunc == EFV_Sigmoid)
         sigmoid(pixel, frame * FrameSize, plut, disp, center, width, OFstatic_cast(T3, low), OFstatic_cast(T3, high));
     else // linear
         window(pixel, frame * FrameSize, plut, disp, center, width, OFstatic_cast(T3, low), OFstatic_cast(T3, high));
 }
 overlay(overlays, disp, columns, rows, frame);      // add (visible) overlay planes to output bitmap
  1. 隐藏overlay数据

  可以单独隐藏某一层overlay,也可以隐藏全部overlay层
2.1 应用层代码实现

//隐藏第一层overlay
//dicomImg->hideOverlay(0);
//隐藏第二层overlay
//dicomImg->hideOverlay(1);
//隐藏所有overlay层
dicomImg->hideAllOverlays();
int size = dicomImg->getOutputDataSize(8);
unsigned char *pixelDataGrey = new unsigned char[size];
dicomImg->getOutputData(pixelDataGrey, size, 8);

显示效果
在这里插入图片描述
  至此dcmtk实现Radiant相关的overlay操作。

二. 进行dcmtk一些其他操作:

  1. 获取overlay模块相关元素

dicom协议规定的overlay元素
在这里插入图片描述
dcmtk获取overlay相关元素的接口如下:

//获取overlay数量,最多16层
int count = dicomImg->getOverlayCount();
//获取某一层overlay组号
int groupNum = dicomImg->getOverlayGroupNumber(1);
//获取某一层overlay描述
const char *description = dicomImg->getOverlayDescription(1);
//获取某一层overlay标签
const char *lable = dicomImg->getOverlayLabel(1);
//获取overlay模式
EM_Overlay mode = dicomImg->getOverlayMode(10);

unsigned int left_pos;
unsigned int top_pos;
unsigned int width;
unsigned int height;
EM_Overlay mode1;
//获取overlay数据,同时获取overlay origin和rows,cloumn,mode
Uint8 * overlayData = (Uint8*)dicomImg->getOverlayData(1, left_pos, top_pos, width, height, mode1);

  overlay模式如下,G表示EMO_Graphic=EMO_Replace,overlay数据替换对应坐标点的pixeldata数据。R表示ROI感兴趣区域。

enum EM_Ove
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
要使用DCMTK 3.6.3的dcm2pnm.exe将多帧DICOM图像转换为单个PNG图像,您可以按照以下步骤操作: 1. 首先,确保已经正确安装DCMTK 3.6.3库。您可以从DCMTK的官方网站(https://dicom.offis.de/dcmtk.php.en)下载并按照说明进行安装。 2. 打开命令行提示符或终端窗口,并导航到包含DICOM图像文件的目录。 3. 运行以下命令以将多帧DICOM图像转换为单个PNG图像: ``` dcm2pnm +Fpng input.dcm output.png ``` 其中,`input.dcm`是您要转换的多帧DICOM图像文件的路径,`output.png`是生成的单个PNG图像文件的路径。 请确保在命令行中正确指定了dcm2pnm.exe的路径,或者将其添加到系统环境变量中,以便可以直接在任何目录下运行该命令。 4. 执行命令后,dcm2pnm将会解析输入的多帧DICOM图像,并将其转换为单个PNG图像。生成的PNG图像文件将保存在指定的输出路径中。 请注意,dcm2pnm是DCMTK提供的一个实用工具,可用于将DICOM图像转换为其他常见的图像格式。根据您的需求,您可以使用其他选项和参数来进一步控制转换过程。您可以通过运行 `dcm2pnm --help` 命令获取更多用法和选项的详细信息。 此外,如果您希望在自己的程序中实现DICOM图像转换,您可以使用DCMTK库提供的API来读取和处理DICOM图像,并将其保存为PNG格式。具体的实现方式将涉及更多的编程细节,可以参考DCMTK的文档和示例代码以获取更多信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DICOM医学影像

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值