当前位置:首页 > 科技  > 软件

Fo-dicom,第一个基于.NET Standard 2.0 开发的DICOM开源库

来源: 责编: 时间:2024-05-07 09:11:53 93观看
导读1. 简介:fo-dicom是一个基于C#开发的库,用于处理DICOM(Digital Imaging and Communications in Medicine)格式的数据。DICOM是一种用于医学影像和相关信息的标准格式,广泛应用于医学领域。fo-dicom提供了多平台支持,可在 Wi

5QT28资讯网——每日最新资讯28at.com

1. 简介:

fo-dicom是一个基于C#开发的库,用于处理DICOM(Digital Imaging and Communications in Medicine)格式的数据。DICOM是一种用于医学影像和相关信息的标准格式,广泛应用于医学领域。fo-dicom提供了多平台支持,可在 Windows、Linux 和 macOS 等操作系统上运行。5QT28资讯网——每日最新资讯28at.com

fo-dicom库的设计理念是提供一个方便、易用、功能强大的工具,用于处理、读取、写入和修改DICOM文件。该库提供了丰富的API,支持对DICOM文件的标签进行读取和设置,支持对DICOM文件的编码和解码,支持对DICOM文件的传输和存储。5QT28资讯网——每日最新资讯28at.com

fo-dicom库还提供了对DICOM消息流的封装,使得开发者可以方便地实现自定义的DICOM服务。该库还支持对网络底层的封装,使得开发者可以轻松地实现基于网络的DICOM通信。5QT28资讯网——每日最新资讯28at.com

开源库地址:https://github.com/fo-dicom/fo-dicom。5QT28资讯网——每日最新资讯28at.com

2. 开发的背景和目的:

fo-dicom库的产生是为了解决医学图像处理和DICOM数据交换的需求。在医学领域,DICOM(Digital Imaging and Communications in Medicine)是一种用于存储、传输和共享医学影像和相关信息的标准。由于医学影像数据的特殊性和复杂性,需要一个专门的库来处理DICOM数据,并提供方便的接口和工具。5QT28资讯网——每日最新资讯28at.com

背景上来说,DICOM标准的出现是为了解决各种医学设备之间的互操作性问题。在过去,不同厂商的医学设备使用自己的私有格式来存储和传输影像数据,这导致了数据共享和集成的困难。DICOM标准的制定使得不同设备可以使用统一的格式和通信协议,从而实现医学影像的无缝交流和协作。5QT28资讯网——每日最新资讯28at.com

fo-dicom作为一个开源的DICOM库,旨在提供一个易于使用且功能强大的工具,使得开发者能够处理医学图像和相关数据。它基于DICOM标准,提供了读取、创建、修改和存储DICOM数据的功能,同时支持医学图像的加载、处理和保存。此外,fo-dicom还具备与远程PACS(Picture Archiving and Communication System)或其他DICOM节点的网络通信能力,以及查询和检索功能,方便用户根据条件查询和获取DICOM实例。5QT28资讯网——每日最新资讯28at.com

3.主要特点和安装方式

阅读官方文档,即可获得安装方法:https://fo-dicom.github.io/stable/v5/index.html。5QT28资讯网——每日最新资讯28at.com

4. 主要功能:

  • DICOM 数据处理:fo-dicom 支持读取、创建、修改和存储 DICOM 数据。用户可以轻松访问和操作 DICOM 文件和数据集。
  • 图像处理:该库提供了对医学图像的加载、处理和保存功能。用户可以进行像素级别的操作、图像增强、格式转换等操作。
  • DICOM 网络通信:fo-dicom 具备与远程 PACS 或其他 DICOM 节点的网络通信能力,使用户可以发送和接收 DICOM 消息。
  • 查询和检索:fo-dicom 实现了查询和检索功能,用户可以根据条件进行 DICOM 实例的查询和获取。这有助于快速访问所需的医学图像和相关数据。

5. 使用说明:

图像渲染配置

开箱即用的 fo-dicom 默认为内部类FellowOakDicom.Imaging.IImage 样式的图像渲染。若要切换到桌面样式或 ImageSharp 样式的图像呈现,首先必须添加所需的 nuget 包,然后调用:5QT28资讯网——每日最新资讯28at.com

new DicomSetupBuilder()    .RegisterServices(s => s.AddFellowOakDicom().AddImageManager<WinFormsImageManager>()).Build();

或:5QT28资讯网——每日最新资讯28at.com

new DicomSetupBuilder()    .RegisterServices(s => s.AddFellowOakDicom().AddImageManager<ImageSharpImageManager>()).Build();

然后,在渲染时,可以通过以下方式将 IImage 强制转换为类型。5QT28资讯网——每日最新资讯28at.com

var image = new DicomImage("filename.dcm");var bitmap = image.RenderImage().As<Bitmap>();

或:5QT28资讯网——每日最新资讯28at.com

var image = new DicomImage("filename.dcm");var sharpimage = image.RenderImage().AsSharpImage();

日志记录配置

Fellow Oak DICOM 使用 ,因此如果您已经在使用它,则 Fellow Oak DICOM 日志记录将自动显示。
Microsoft.Extensions.Logging
5QT28资讯网——每日最新资讯28at.com

过去,Fellow Oak DICOM 有一个用于日志记录的自定义抽象:ILogger 和 ILogManager。 出于向后兼容性的目的,这仍然受支持,但不建议用于新应用程序。5QT28资讯网——每日最新资讯28at.com

services.AddLogManager<MyLogManager>();

其中 MyLogManager 如下所示:5QT28资讯网——每日最新资讯28at.com

using FellowOakDicom.Log;public class MyLogManager: ILogManager {    public ILogger GetLogger(string name) {        ...    }}

示例应用程序

这里有许多使用 fo-dicom 的简单示例应用程序,它们位于单独的存储库中。这些还包括示例 以前包含在 VS 解决方案的“示例”子文件夹中。5QT28资讯网——每日最新资讯28at.com

6.例子

文件操作

var file = DicomFile.Open(@"test.dcm");             // Alt 1var file = await DicomFile.OpenAsync(@"test.dcm");  // Alt 2var patientid = file.Dataset.GetString(DicomTag.PatientID);file.Dataset.AddOrUpdate(DicomTag.PatientName, "DOE^JOHN");// creates a new instance of DicomFilevar newFile = file.Clone(DicomTransferSyntax.JPEGProcess14SV1);file.Save(@"output.dcm");             // Alt 1await file.SaveAsync(@"output.dcm");  // Alt 2

将图像渲染为 JPEG

var image = new DicomImage(@"test.dcm");image.RenderImage().AsBitmap().Save(@"test.jpg");                     // Windows Forms

C-Store SCU系列

var client = DicomClientFactory.Create("127.0.0.1", 12345, false, "SCU", "ANY-SCP");await client.AddRequestAsync(new DicomCStoreRequest(@"test.dcm"));await client.SendAsync();

C-Echo SCU/SCP

var server = new DicomServer<DicomCEchoProvider>(12345);var client = DicomClientFactory.Create("127.0.0.1", 12345, false, "SCU", "ANY-SCP");client.NegotiateAsyncOps();// Optionally negotiate user identityclient.NegotiateUserIdentity(new DicomUserIdentityNegotiation{    UserIdentityType = DicomUserIdentityType.Jwt,    PositiveResponseRequested = true,    PrimaryField = "JWT_TOKEN"});for (int i = 0; i < 10; i++)    await client.AddRequestAsync(new DicomCEchoRequest());await client.SendAsync();

C-Find SCU

var cfind = DicomCFindRequest.CreateStudyQuery(patientId: "12345");cfind.OnResponseReceived = (DicomCFindRequest rq, DicomCFindResponse rp) => {	Console.WriteLine("Study UID: {0}", rp.Dataset.GetString(DicomTag.StudyInstanceUID));};var client = DicomClientFactory.Create("127.0.0.1", 11112, false, "SCU-AE", "SCP-AE");await client.AddRequestAsync(cfind);await client.SendAsync();

C-Move SCU系列

var cmove = new DicomCMoveRequest("DEST-AE", studyInstanceUid);var client = DicomClientFactory.Create("127.0.0.1", 11112, false, "SCU-AE", "SCP-AE");await client.AddRequestAsync(cmove);await client.SendAsync();

N-Action SCU

// It is better to increase 'associationLingerTimeoutInMs' default is 50 ms, which may not be// be sufficientvar dicomClient = DicomClientFactory.Create("127.0.0.1", 12345, false, "SCU-AE", "SCP-AE",DicomClientDefaults.DefaultAssociationRequestTimeoutInMs, DicomClientDefaults.DefaultAssociationReleaseTimeoutInMs,5000);var txnUid = DicomUIDGenerator.GenerateDerivedFromUUID().UID;var nActionDicomDataSet = new DicomDataset{    { DicomTag.TransactionUID,  txnUid }};var dicomRefSopSequence = new DicomSequence(DicomTag.ReferencedSOPSequence);var seqItem = new DicomDataset(){    { DicomTag.ReferencedSOPClassUID, "1.2.840.10008.5.1.4.1.1.1" },    { DicomTag.ReferencedSOPInstanceUID, "1.3.46.670589.30.2273540226.4.54" }};dicomRefSopSequence.Items.Add(seqItem);nActionDicomDataSet.Add(dicomRefSopSequence);var nActionRequest = new DicomNActionRequest(DicomUID.StorageCommitmentPushModelSOPClass,                DicomUID.StorageCommitmentPushModelSOPInstance, 1){    Dataset = nActionDicomDataSet,    OnResponseReceived = (DicomNActionRequest request, DicomNActionResponse response) =>     {        Console.WriteLine("NActionResponseHandler, response status:{0}", response.Status);    },};await dicomClient.AddRequestAsync(nActionRequest);dicomClient.OnNEventReportRequest = OnNEventReportRequest;await dicomClient.SendAsync();private static Task<DicomNEventReportResponse> OnNEventReportRequest(DicomNEventReportRequest request){    var refSopSequence = request.Dataset.GetSequence(DicomTag.ReferencedSOPSequence);    foreach(var item in refSopSequence.Items)    {        Console.WriteLine("SOP Class UID: {0}", item.GetString(DicomTag.ReferencedSOPClassUID));        Console.WriteLine("SOP Instance UID: {0}", item.GetString(DicomTag.ReferencedSOPInstanceUID));    }    return Task.FromResult(new DicomNEventReportResponse(request, DicomStatus.Success));}

具有高级 DICOM 客户端连接的 C-ECHO:手动控制 TCP 连接和 DICOM 关联。5QT28资讯网——每日最新资讯28at.com

var cancellationToken = CancellationToken.None;// Alternatively, inject IDicomServerFactory via dependency injection instead of using this static methodusing var server = DicomServerFactory.Create<DicomCEchoProvider>(12345); var connectionRequest = new AdvancedDicomClientConnectionRequest{    NetworkStreamCreationOptions = new NetworkStreamCreationOptions    {        Host = "127.0.0.1",        Port = server.Port,    }};// Alternatively, inject IAdvancedDicomClientConnectionFactory via dependency injection instead of using this static methodusing var connection = await AdvancedDicomClientConnectionFactory.OpenConnectionAsync(connectionRequest, cancellationToken);var associationRequest = new AdvancedDicomClientAssociationRequest{    CallingAE = "EchoSCU",    CalledAE = "EchoSCP",    // Optionally negotiate user identity    UserIdentityNegotiation = new DicomUserIdentityNegotiation    {        UserIdentityType = DicomUserIdentityType.UsernameAndPasscode,        PositiveResponseRequested = true,        PrimaryField = "USERNAME",        SecondaryField = "PASSCODE",    }};var cEchoRequest = new DicomCEchoRequest();using var association = await connection.OpenAssociationAsync(associationRequest, cancellationToken);try{    DicomCEchoResponse cEchoResponse = await association.SendCEchoRequestAsync(cEchoRequest, cancellationToken).ConfigureAwait(false);        Console.WriteLine(cEchoResponse.Status);}finally{    await association.ReleaseAsync(cancellationToken);}

7. 社区和生态:

fo-dicom 有一个活跃的社区,包括众多贡献者和维护者。它在 GitHub 上有一个开放的仓库,用户可以在其中提交问题、提出建议和贡献代码。fo-dicom 的更新频率较高,并得到了广泛的应用和认可。5QT28资讯网——每日最新资讯28at.com

为了方便新手学习官方构建了样例库:https://github.com/fo-dicom/fo-dicom-samples。5QT28资讯网——每日最新资讯28at.com

同时支持多个平台的案例开发开发:5QT28资讯网——每日最新资讯28at.com

8. 优势和劣势:

  • 优势:fo-dicom 是一个强大且易于使用的 DICOM 库,具备处理医学图像和相关数据的核心功能。它提供了多平台支持、良好的文档和示例代码,并拥有一个活跃的社区。
  • 劣势:由于 DICOM 标准的复杂性,初学者可能需要一些时间来适应 fo-dicom 的使用方式。另外,某些高级功能可能需要额外的配置或第三方组件的支持。

9. 未来计划和发展方向:

fo-dicom 的未来计划包括进一步增强图像处理功能、优化性能、改进网络通信和增加对新版 DICOM 标准的支持。通过不断改进和扩展功能,fo-dicom 将继续满足用户对医学图像处理和数据交互的需求。5QT28资讯网——每日最新资讯28at.com

今天先介绍到这里,后续我将持续分享关于fo-dicom库的使用经验技巧,欢迎有需要的朋友持续关注。5QT28资讯网——每日最新资讯28at.com

本文链接://www.dmpip.com//www.dmpip.com/showinfo-26-87004-0.htmlFo-dicom,第一个基于.NET Standard 2.0 开发的DICOM开源库

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: TypeScript 中的 Extends 怎么那么优秀啊?

下一篇: Rust语言实现图像编码转换,支持多种格式

标签:
  • 热门焦点
  • Raft算法:保障分布式系统共识的稳健之道

    Raft算法:保障分布式系统共识的稳健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可复制、可冗余、可容错”)的首字母缩写。Raft算法是一种用于在分布式系统
  • 让我们一起聊聊文件的操作

    让我们一起聊聊文件的操作

    文件【1】文件是什么?文件是保存数据的地方,是数据源的一种,比如大家经常使用的word文档、txt文件、excel文件、jpg文件...都是文件。文件最主要的作用就是保存数据,它既可以保
  • 在线图片编辑器,支持PSD解析、AI抠图等

    在线图片编辑器,支持PSD解析、AI抠图等

    自从我上次分享一个人开发仿造稿定设计的图片编辑器到现在,不知不觉已过去一年时间了,期间我经历了裁员失业、面试找工作碰壁,寒冬下一直没有很好地履行计划.....这些就放在日
  • 一个注解实现接口幂等,这样才优雅!

    一个注解实现接口幂等,这样才优雅!

    场景码猿慢病云管理系统中其实高并发的场景不是很多,没有必要每个接口都去考虑并发高的场景,比如添加住院患者的这个接口,具体的业务代码就不贴了,业务伪代码如下:图片上述代码有
  • 为什么你不应该使用Div作为可点击元素

    为什么你不应该使用Div作为可点击元素

    按钮是为任何网络应用程序提供交互性的最常见方式。但我们经常倾向于使用其他HTML元素,如 div span 等作为 clickable 元素。但通过这样做,我们错过了许多内置浏览器的功能。
  • 消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    消费结构调整丨巨头低价博弈,拼多多还卷得动吗?

    来源:征探财经作者:陈香羽随着流量红利的退潮,电商的存量博弈越来越明显。曾经主攻中高端与品质的淘宝天猫、京东重拾&ldquo;低价&rdquo;口号。而过去与他们错位竞争的拼多多,靠
  • 一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    一条抖音4亿人围观 ! 这家MCN比无忧传媒还野

    作者:Hiu 来源:互联网品牌官01 擦边少女空降热搜,幕后推手曝光被网友誉为&ldquo;纯欲天花板&rdquo;的女网红井川里予,近期因为一组哥特风照片登上热搜,引发了一场互联网世界关于
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  •  首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
Top
Baidu
map