草庐IT

python 实现dcmtk关联pacs功能 推送下拉影像

EXI-小洲 2024-07-02 原文

python 实现pacs功能 推送下拉影像

dcmtk关联pacs技术笔记:

简介

  • 1、dcmtk关联pacs的参数介绍
  • 2、dcmtk命令介绍
  • 3、演示工具的功能
  • 4、说明使用的技术
  • 5、遇到的问题
  • 6、工具目前存在的缺点

dcmtk关联pacs的参数介绍:远程pacs说明参数如何添加

需关联的PACS系统信息参数

  • [被呼叫主机ip] 192.168.10.19
  • [被呼叫主机pacs系统AE] ebm-pacs
  • [被呼叫主机pacs系统port] 105
  • [pacs系统电脑账号] dn
  • [pacs系统电脑密码] ZAQ12wsxCDE3

1、dcmtk命令介绍,ehoscu,findscu,movescu,storescu

命令参数说明参考实例文档

  • [dcmtk命令参数文档] https://support.dcmtk.org/docs/echoscu.html
  • [DICOM医学图像处理:DCMTK的wiki资料学习之PACS调试文档] https://www.pianshen.com/article/97151392057
  • [DCMTK开发笔记模拟PACS调试(Win10环境)文档] https://blog.csdn.net/Qinyimin001/article/details/103512575

DCMTK 常用参数介绍

参数说明
-v详细模式,打印处理细节
-d调试模式,打印调试信息
ip被呼叫主机ip,如(192.168.10.19)
port被呼叫主机port,如(105)
-aet设置我的呼叫(本机)AE标题,pacs给本机添加的AE title,如(zs-find-scu)
-aec设置称为对等方(被呼叫主机) 的AE标题,pacs系统的AE title,如(ebm-pacs)
-P使用患者根信息模型(默认)
-S使用研究根信息模型
-k指定检索条件(key=value)
-od指定输出目录
QueryRetrieveLevel指定检索级别
-aem设置移动目的地AE标题(movescu时使用),如(zs-move-scu)
+f输入文件格式(默认单个dcm文件路径),推送影像时使用
+sd支持目录路径下所有文件输入,推送影像时使用
-su study指按studyinstanceuid命名目的文件夹,本机接收远程服务器影像时使用
-fe .dcm是指收到的文件以.dcm为文件后缀,本机接收远程服务器影像时使用

1.1:echoscu.exe 连接,接收答复回应(相当于ping),测试本机与pacs是否关联成功

  • 参数介绍
  • pacs系统ip,端口(192.168.10.19 105) # 所有的服务都需添加该参数
    echoscu.exe -v -d -aet zs-move-scu -aec ebm-pacs 192.168.10.19 105

1.2:findscu.exe 查询

  • 参数介绍
  • 本机AE(-aet zs-find-scu)
  • 被呼叫机AE(-aec ebm-pacs)
  • 研究信息模型(-S)
  • 查询条件=(key=value)
  • 检索级别(-k QueryRetrieveLevel=STUDY)
  • 查询字段(-k PatientName)
  • 打印处理详情(-v)
  • 打印debug日志(-d)
    findscu.exe -v -d -S 192.168.10.19 105 -aet zs-find-scu -aec ebm-pacs -k QueryRetrieveLevel=STUDY -k StudyDate=20170918 -k PatientName -k PatientID -k StudyTime -k StudyID

1.3:movescu.exe 影像拉取

  • 参数介绍
  • 打印处理详情(-v)
  • 打印debug日志(-d)
  • 本机AE(-aet zs-move-scu)
  • 被呼叫机AE(-aec ebm-pacs)
  • 设置移动目的地AE以及端口(-aem zs-move-scu --port 8090(此端口在pacs给本机设置AE时一起添加)
  • 患者信息模型(-P(默认))
  • 输出目录(-od)
  • 检索级别(-k QueryRetrieveLevel=PATIENT)
  • 筛选条件(-k PatientID=0017063006)
    movescu.exe -v -d -aet zs-move-scu -aec ebm-pacs -aem zs-move-scu --port 8090 -od D:\image_test\dcmtk_scp_storage\CHEN_XIA_DI 192.168.10.19 105 -k QueryRetrieveLevel=PATIENT -k PatientID=0017063006

1.4:storescu.exe 影像推送

  • 参数介绍
  • 打印处理详情(-v)
  • 打印debug日志(-d)
  • 本机AE(-aet zs-move-scu)
  • 被呼叫机AE(-aec ebm-pacs)
  • 单个文件路径输入(D:\image_test\dcmtk_test\1.2.dcm)
  • 目录下所有文件输入(D:\image_test\dcmtk_test\1.2.dcm +sd)

1.4.1:单个dcm文件推送

    storescu.exe -d 192.168.10.19 105 D:\image_test\dcmtk_test\1.2.dcm -aet zs-move-scu -aec ebm-pacs
1.4.2、目录下所有文件推送
     storescu.exe -v -d 192.168.10.19 105 D:\image_test\dcmtk_input\138 -aet zs-move-scu -aec ebm-pacs +sd  

1.5、storescp.exe 接收pacs系统发送的影像

  • 参数介绍
  • 打印处理详情(-v)
  • 打印debug日志(-d)
  • 本机scp的AE,端口(-aet zs-store-scp 8090)
  • 输出目录(-od)
  • 保存格式(-su study)
  • 文件后缀(-fe.dcm))
    storescp.exe -d -v 8090 -aet zs-store-scp -od D:\image_test\dcmtk_scp_storage -su study -fe .dcm --fork

2、演示工具的功能:关联测试,查询,拉取,推送

2.1:影像上传路径:D:\image_test\dcmtk_input\test_0000915367
2.2:影像存储路径:D:\image_test\dcmtk_scp_storage
2.3:本机-AET:zs-movescu
2.4:PACS-AEC:ebm-pacs
2.5:PACS系统IP:192.168.10.19
2.6:PACS系统PORT:105
2.7:本机PORT:8090
2.8:注意事项:
    1.路径中不允许出现中文
    2.PACS-AEC,PACS系统IP,PACS系统PORT,为关联pacs系统固定参数
    3.本机-AET,本机PORT,需要在远程pacs脚本中添加本机ip,端口,设置AE
    4.影像拉取功能需要添加本机端口参数
    5.目前影像拉取不支持PatientName检索条件,仅支持PatientID

3、说明使用的技术:

  • dcmtk命令拼接
  • subprocess(执行命令)
  • tkinter(Gui工具设计)
  • ctypes(隐藏控制台)
  • sys(访问pyinstaller打包的临时资源)
  • pyinstaller(程序打包)

4、遇到的问题:

  • 1.pyinstaller:如何打包本地资源
    解决方法一:pyinstaller -F --add-data dcmtk-3.6.6-win64-dynamic;dcmtk-3.6.6-win64-dynamic dcmtk_gui.py
    解决方法二:修改pyinstaller生成的spec文件,修改datas=[("本地资源路径","打包后生成的临时资源目录")]
  • 2.pyinstaller:-w 去除控制台,无法执行cmd命令:
    解决方法一:设置subprocess.Popen(stdout, stderr, stdin)
    解决方法二:隐藏控制台, ctypes.windll.user32.ShowWindow(whnd, 0)
  • 3.sys:如何访问临时资源:
    解决方法:通过getattr(sys, 'frozen', False)判断是否为打包环境,获取资源的相对路径:sys._MEIPASS 
  • 4.使用资源:
    相对路径(dcmtk../bin) + dcmtk服务的exe + dcmtk命令即可 使用subprocess.Popen(),使用subprocess.getoutput()
  • 5.tkinter 组件切换电脑打开则组件布局位置不一致:
    解决方法:添加容器对象,frame
  • 6.tkinter Entry输入框与选择路径按钮同时支持:
    如果选择路径按钮,entry组件=选择路径
  • 7.tkinter Text实时显示 dcmtk命令产生的日志:
    代码介绍

5、工具目前存在的缺点:

  • 不能根据患者的name进行影像拉取
  • 运行时占用的内存比较大
  • 上传,存储,不支持选择文件(仅支持目录),手动输入都支持

6、收获:

  • dcmtk的命令基本配置
  • subprocess的常用方法
  • tkinter的组件布局,日志打印
  • pyinstaller本地资源打包
  • 打包后的资源如何访问

前存在的缺点:

  • 不能根据患者的name进行影像拉取
  • 运行时占用的内存比较大添加链接描述
  • 上传,存储,不支持选择文件(仅支持目录),手动输入都支持

6、收获:

  • dcmtk的命令基本配置
  • subprocess的常用方法
  • tkinter的组件布局,日志打印
  • pyinstaller本地资源打包
  • 打包后的资源如何访问

dcmtk下载地址:https://download.csdn.net/download/EXIxiaozhou/86724433

有关python 实现dcmtk关联pacs功能 推送下拉影像的更多相关文章

  1. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  2. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  3. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  4. ruby-on-rails - Cucumber 是否只是 rspec 的包装器以帮助将测试组织成功能? - 2

    只是想确保我理解了事情。据我目前收集到的信息,Cucumber只是一个“包装器”,或者是一种通过将事物分类为功能和步骤来组织测试的好方法,其中实际的单元测试处于步骤阶段。它允许您根据事物的工作方式组织您的测试。对吗? 最佳答案 有点。它是一种组织测试的方式,但不仅如此。它的行为就像最初的Rails集成测试一样,但更易于使用。这里最大的好处是您的session在整个Scenario中保持透明。关于Cucumber的另一件事是您(应该)从使用您的代码的浏览器或客户端的角度进行测试。如果您愿意,您可以使用步骤来构建对象和设置状态,但通常您

  5. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  6. Python 相当于 Perl/Ruby ||= - 2

    这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。

  7. java - 什么相当于 ruby​​ 的 rack 或 python 的 Java wsgi? - 2

    什么是ruby​​的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht

  8. ruby-on-rails - 复数 for fields_for has_many 关联未显示在 View 中 - 2

    目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. python - 如何读取 MIDI 文件、更改其乐器并将其写回? - 2

    我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的

随机推荐