简体   繁体   English

从服务器检索所有DICOM对象

[英]Retrieve all the DICOM object from server

All, Forgive me I just began to learn the DICOM. 全部,原谅我,我才刚刚开始学习DICOM。 I knew all the DICOM objects would be stored in a DICOM server. 我知道所有DICOM对象都将存储在DICOM服务器中。 In the really words . 用真正的话来说。 It should be a PACS server. 它应该是PACS服务器。 Basically, It works like the SQL record stored in the Table from the Database (like SQL server). 基本上,它的工作方式类似于数据库(如SQL Server)中存储在表中的SQL记录。 So in the DICOM world . 因此在DICOM世界中。 There should have the equivalent commands (select , insert, update) like in the SQL? 应该像SQL中一样具有等效的命令(选择,插入,更新)? Right? 对?

My question is 我的问题是

Is there any command to retrieve all the DICOM object stored in the DICOM server? 是否有任何命令可检索存储在DICOM服务器中的所有DICOM对象?

BTW . 顺便说一句。 Currently, I am working on the .Net. 目前,我正在使用.Net。 Please help to recommend a good open source DICOM client SDK to me. 请帮我推荐一个好的开源DICOM客户端SDK。 Thanks. 谢谢。

What you are looking for is dicom Query/Retrieve service http://dicom.nema.org/dicom/2013/output/chtml/part04/sect_C.3.html 您正在寻找的是dicom查询/检索服务http://dicom.nema.org/dicom/2013/output/chtml/part04/sect_C.3.html

It is a basic service, so all dicom implementations should support it. 它是一项基本服务,因此所有dicom实现都应支持它。

I don't have experience with Dicom under .Net, but there are a few open source libraries available (see https://www.google.fr/search?q=dicom+api+.net ) and SO doesn't allow asking for tool recommendations, so I don't want to randomly pick one... 我没有在.Net下使用Dicom的经验,但是有一些可用的开源库(请参阅https://www.google.fr/search?q=dicom+api+.net ),因此SO不允许询问推荐工具,所以我不想随机选择一个...

There are two different questions that you put: 您提出了两个不同的问题:

  1. How can I talk DICOM for the purpose of retrieving images? 我该如何谈谈DICOM以获取图像?
  2. How can I put a vaild DICOM query that instructs the server to transfer all images to a particular destination 如何放置有效的DICOM查询,以指示服务器将所有图像传输到特定目标

ad 1. This question has been partially answered. 广告1.该问题已得到部分回答。 To be more specific I recommend you to have a look at the DICOM toolkit by OFFIS . 更具体地说,我建议您看一下OFFIS的DICOM工具包 For your task you need to set up a storescp and movescu (and probably findscu - see 2). 对于您的任务,您需要设置一个storecp和movescu(可能还有findscu-参见2)。 The tools are open source work out of the box from the command line. 这些工具是开源的,可以从命令行直接使用。 They are not .NET based, but maybe you do not want/need to write an application for that tasks. 它们不是基于.NET的,但也许您不想/不需要为该任务编写应用程序。

ad 2. In theory you can do this by putting a C-MOVE request without any restrictions. 广告2。理论上,您可以通过发出C-MOVE请求而没有任何限制来进行此操作。 However, only a few systems will accept this because it looks like a malformed request ("give me everything you got" is rarely what the user wants to do and may effect terabytes of data to be transferred with potential negative consequences for both systems involved in the transaction). 但是,只有少数系统会接受此请求,因为它看起来像是格式错误的请求(“给我您所获得的一切”很少是用户想要执行的操作,并且可能会影响数TB的数据传输,并对参与其中的两个系统都产生潜在的负面影响交易)。

So you have to provide query criteria that limit that number of results matched by the C-MOVE request. 因此,您必须提供查询条件,以限制与C-MOVE请求匹配的结果数。 In practice it depends on your use case what the most appropriate way of doing this would look like. 实际上,这取决于您的用例,最合适的方式是什么样的。

I assume that you want to do a data migration, so you really want to make sure not to miss a single dataset. 我假设您要进行数据迁移,因此您确实要确保不要遗漏单个数据集。 In this case, I would use a query that imposes study date criteria. 在这种情况下,我将使用一个强加研究日期标准的查询。 DICOM supports open and closed intervals. DICOM支持打开和关闭间隔。 So you could split the packages of datasets to transfer into chunks of - let's say - one month. 因此,您可以将数据集的数据包拆分为一个月(假设为一个月)的大块数据。 You should have an information or at least a reasonable assumption what the minimum study date residing on the server is. 您应该有信息或至少有一个合理的假设,认为服务器上的最低学习日期是多少。 Then your first C-MOVE would move everything before that date, eg (for everything until Jan 01, 1990). 然后,您的第一个C-MOVE将移动该日期之前的所有内容,例如(直到1990年1月1日为止的所有内容)。

(0x0008, 0x0020) = [-19900101]

And then you put one query for each month: 然后,您对每个月进行一次查询:

(0x0008, 0x0020) = [19900102-19900201]
(0x0008, 0x0020) = [19900202-19900301]

...and so on... ...等等...

It is worth a try if the remote DICOM node you are referring to accepts C-MOVE Requests formed in this way. 如果您要引用的远程DICOM节点接受以这种方式形成的C-MOVE请求,则值得尝试。 However, it does not have to. 但是,它不是必须的。 For a valid C-MOVE you will have to provide unique matching keys for each study (yes, I am over-simplyfing here omitting the theory of the entire DICOM information model) you want to move. 对于有效的C-MOVE,您将必须为要移动的每个研究提供唯一的匹配键(是的,我在这里简化了,省略了整个DICOM信息模型的理论)。 In this case you use the above mentioned strategy to C-FIND the Study Instance UIDs which fall into the provided date range. 在这种情况下,您可以使用上述策略C-查找属于提供的日期范围内的研究实例UID。 You can instruct any DICOM Server to return the Study Instance UID with each match just by appending an empty Study Instance UID attribute to your request, eg 您可以通过将空的研究实例UID属性附加到您的请求,来指示任何DICOM服务器返回每个匹配项的研究实例UID,例如

    (0x0008, 0x0020) = [-19900101]
    (0x0008, 0x0052) = [STUDY]
    (0x0020, 0x000d) = []

Then you use the output of the server in the Study Instance UID attribute of each response as an input to the C-MOVE operation, eg 然后,您可以在每个响应的研究实例UID属性中使用服务器的输出作为C-MOVE操作的输入,例如

    (0x0008, 0x0052) = [STUDY]
    (0x0020, 0x000d) = [1.2.360.3234.345345.64575782356.23424.21.3]

This scenario would require you to set up C-FIND and C-MOVE clients ("Service Class Users", SCUs) and a C-STORE SCP (Service Class Provider) which is the target for the C-MOVE operation. 这种情况下,您需要设置C-FIND和C-MOVE客户端(“服务类用户”,SCU)和C-STORE SCP(服务类提供者),这是C-MOVE操作的目标。

Sorry not to provide easier instructions, but these are DICOM's nasty little details... 抱歉,没有提供更简单的说明,但这只是DICOM讨厌的小细节...

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM