← 返回所有博客文章

开发实际应用中的DICOM查看器

LEADTOOLS Medical Imaging SDK使用20余年的图像开发经验缓解了这个问题,提供了一个高级的、程序员友好和功能丰富的DICOM查看器控件。

简介

医学图像应用程序涉及DICOM图像的显示,这些图像比我们乍一看到的复杂很多。当然,有无数种方法可以简单地显示图像,但是你的专业医疗客户期望并需要你的应用程序中有一定的规范和功能,尤其是在查看DIOCM图像时。

LEADTOOLS Medical Imaging SDK使用20余年的图像开发经验缓解了这个问题,提供了一个高级的、程序员友好和功能丰富的DICOM查看器控件。LEAD科技接触了无数的客户,产品包含了所有的行业标准功能和大多数第三方SDK不提供的高级功能。经过全面测试和验证的综合功能不仅为程序员提供了内心的平静,易用性还为您节省了大量的开发时间和成本。

LEADTOOLS SDK的主要DICOM查看器功能

1. 全面可定制的单元格和子单元格布局

2. 查看多个系列时自动同步图像

3. 在图像上显示叠加信息

4. 支持病人定向、定位、MPR和参考线

5. 内置工具用于:

5.1. 测量(标尺、测量小工具、量角器、统计、探针)

5.2. 图像显示(窗位、缩放、平移、放大镜、空间定位、用户小望远镜)

5.3. 图像Alpha(S型、指数、对数)

5.4. 注释(文字、箭头、矩形、椭圆、cobb角、自定义等)

5.5. 感兴趣区域(魔棒、轻推、收缩等)

6. 专业诊断评估工具,如PET-CT融合

7. 与 LEADTOOLS Medical 3D SDK技术直接集成

8. 查看大型研究时内存使用设置的选项

9. 内置的标尺,可以基于图像的DPI调整,包含缩放、比例因子和自定义校准设置

10. 自定义和事件处理的低级编程访问

包含DICOM查看器技术的SDK产品

LEADTOOLS Medical Imaging SDK

LEADTOOLS PACS Imaging SDK

LEADTOOLS Medical Imaging Suite SDK

DICOM查看器代码

每一个DICOM图像查看器都必须包含标准功能,如窗位、滚动、放大、多框架布局等。LEADTOOLS MedicalViewer控件凭借易于使用和易于实现让自己与众不同。它包括了很多重载函数,您可以根据自己的意愿或多或少的控制流程。在下面的示例中,我们指定了一个文件名、一个布尔值让图像适应单元格,还指定了行列数来显示多框架图像的子单元格。

        // 创建单元格,设置选项,添加图像
        MedicalViewerMultiCell cell = new MedicalViewerMultiCell(   _codecs.Load(strFile),   true,   nRows,   nCols);
        // 在查看器中添加单元格
        _medicalViewer.Cells.Add(cell);

放射科医生和医疗专业人员在合作诊断时需要很多工具。基本的需求包括窗位、堆栈、缩放、注释等,包含了大量的事件处理、图像处理和图像显示操作。若想使用LEADTOOLS中的这些功能,你只需要两个方法:AddAction和SetAction。首先,AddAction告诉查看器哪些操作可用。然后,SetAction将添加的操作指定给一个鼠标事件,当用户切换工具时调用。

// 添加可用的操作
        cell.AddAction(MedicalViewerActionType.WindowLevel);
        cell.AddAction(MedicalViewerActionType.Scale);
        cell.AddAction(MedicalViewerActionType.Offset);
        cell.AddAction(MedicalViewerActionType.Stack);
        cell.AddAction(MedicalViewerActionType.AnnotationLine);
        cell.AddAction(MedicalViewerActionType.AnnotationRectangle);
        cell.AddAction(MedicalViewerActionType.AnnotationEllipse);
        cell.AddAction(MedicalViewerActionType.AnnotationText);
        // 为一个鼠标按钮指定操作
        cell.SetAction(MedicalViewerActionType.WindowLevel,   MedicalViewerMouseButtons.Left, MedicalViewerActionFlags.Active);
        cell.SetAction(MedicalViewerActionType.Offset,   MedicalViewerMouseButtons.Right, MedicalViewerActionFlags.Active);
        cell.SetAction(MedicalViewerActionType.Scale,   MedicalViewerMouseButtons.Middle, MedicalViewerActionFlags.Active);
        cell.SetAction(MedicalViewerActionType.Stack,   MedicalViewerMouseButtons.Wheel, MedicalViewerActionFlags.Active);

 

最后,几乎所有DICOM查看器应用程序都会使用某种形式的元数据覆盖。再次,LEADTOOLS非常程序员友好,可以使用单一函数,SetTag,为任意的单元格或子单元格添加元数据标签。它包含了静态标签和随查看器操作改变的动态标签,如窗位、缩放和帧数等操作。

// 添加标签,显示信息和元数据
        cell.SetTag(4, MedicalViewerTagAlignment.TopLeft,   MedicalViewerTagType.Frame);
        cell.SetTag(6, MedicalViewerTagAlignment.TopLeft,   MedicalViewerTagType.Scale);
        cell.SetTag(2, MedicalViewerTagAlignment.BottomLeft,   MedicalViewerTagType.WindowLevelData);
        cell.SetTag(1, MedicalViewerTagAlignment.BottomLeft,   MedicalViewerTagType.FieldOfView);

 

一些最重要的元数据来源于DICOM数据集本身的大量信息。LEADTOOLS是一个提取信息然后有意义的使用这些信息的不可或缺的工具。下面,我们使用DicomDataSet对象获取病人的姓名和图像定向信息。

// 从DICOM数据���中获取信息
DicomDataSet ds = new DicomDataSet();
ds.Load(strFile, DicomDataSetLoadFlags.LoadAndClose);
// 获取病人姓名
string strPatientName =
   ds.GetValue<string>(DicomTag.PatientName, string.Empty);
cell.SetTag(1, MedicalViewerTagAlignment.TopRight,
   MedicalViewerTagType.UserData, strPatientName);
// 获取病人定向,根据形态可能还有其他标签,但此示例中不需要
DicomElement element = ds.FindFirstElement(null,
   DicomTag.ImageOrientationPatient, true);if (element != null && element.Length > 0)
{
   double[] doubleArray; doubleArray = ds.GetDoubleValue(element,
      0, 6);
   cell.ImageOrientation = new float[] { 
      (float)doubleArray[0], 
      (float)doubleArray[1], 
      (float)doubleArray[2], 
      (float)doubleArray[3], 
      (float)doubleArray[4], 
      (float)doubleArray[5] };
 
   // 现在我们使用定向标签设置定向值
  cell.SetTag(0, MedicalViewerTagAlignment.TopCenter,
      MedicalViewerTagType.TopOrientation);
   cell.SetTag(0, MedicalViewerTagAlignment.BottomCenter,
      MedicalViewerTagType.BottomOrientation);
   cell.SetTag(0, MedicalViewerTagAlignment.LeftCenter, 
      MedicalViewerTagType.LeftOrientation);
   cell.SetTag(0, MedicalViewerTagAlignment.RightCenter,
      MedicalViewerTagType.RightOrientation);
}
 
 
 

现在你就拥有了它!只需50行代码,你就可以为应用程序添加一个功能完整的DICOM查看器,且任何医疗专业人员都会乐于使用它。

clip_image002[6]

融合:一个高级示例

LEADTOOLS DICOM查看器并未止步于基本功能。它包含许多高级功能,这些功能需要大量的自定义和与其他医学图像SDK的低级编程。LEAD科技在医学专业需求方面有广泛的研究和行业知识,使用短短几行代码就让这些功能变为可能。

一个这样的技术就是融合。最通常的使用是PET图像和CT图像,其实任意形态的DICOM图像都会用到融合。在下面的例子中,我们为您展示如何实现一个使用CT和MR的基本融合。

// 在查看器中添加两个单元格
AddCell(_strMRImage, 1, 1);
AddCell(_strCTImage, 1, 1);
 
// Get the cell on the right
MedicalViewerMultiCell cell =
   (MedicalViewerMultiCell)_medicalViewer.Cells[1];
 
// 创建一个新的fusion对象,这个对象会保存与原始图像融合的图像
MedicalViewerFusion fusion = new MedicalViewerFusion();
 
// 设置一些属性,控制融合工作的方式
fusion.FusedImage = _codecs.Load(_strMRImage);
fusion.FusionScale = 0.5f;
fusion.ColorPalette = MedicalViewerPaletteType.RedHot;
cell.SubCells[0].Fusion.Add(fusion);
 
// 调整单元格的一些标签
cell.SetTag(0, 1, MedicalViewerTagAlignment.BottomRight,
   MedicalViewerTagType.UserData, "FUSION EX. ID 230-36-5448");
 

clip_image004[6]

clip_image006[6]

总结

LEADTOOLS为开发者提供了全世界一流的稳定图像库,易于使用的高级编程接口让业务关键型应用程序的快速开发变为可能。

DICOM查看器只是LEADTOOLS提供的若干技术中的一个。若想了解我们产品的更多信息,欢迎访问我们的主页,下载功能完整的试用版SDK,在试用期间欢迎您使用我们的免费技术支持。