V 友们,有没有医疗行业的,懂 DICOM 的?

2023-11-22 09:07:59 +08:00
 ChenSino

我司有个需求是这样的: 要求实现解析 dicom(多帧)文件,把他转化成多个图片,然后把每个图片拿去调用 ai 组的一个接口(标出病灶,结节,返回坐标集合),拿到每个图片的坐标后,根据坐标绘制图片把病灶圈起来得到新的图片,然后再用新的图片替换原 dicom 中的图片,实现播放 dicom 时,能看到每帧上圈出来的病灶。

图片根据坐标绘制很好实现,绘制完后如何再把他写入原 dicom 文件呢?我用的 java 的 dcm4che 库,文档几乎可以说是没有,代码注释也是少得可怜,有经验的的大佬能否指点一下如何做,或者哪里可以获取到 dcm4che 的更详细资料?

ps: 不要问我为什么 ai 不支持直接在多帧 dicom 上标注,俺也不敢说也不敢问

2958 次点击
所在节点    程序员
34 条回复
LLaMA2
2023-11-22 09:35:33 +08:00
dicom 的 image 段 你可以做到 dicom->image <==> 图片 互转

替换回去,顺便可能需要变更下 data_element 的 value_length.
以上内容是我根据搜索引擎查询 dicom 的数据格式得出的结论。

话又说回来,
你应该直接研究下已有的 dicom 渲染工具是怎么渲染画面的,
渲染的时候带入坐标自己做额外的绘制是不是更高效!
sivacohan
2023-11-22 09:36:51 +08:00
tool2d
2023-11-22 09:39:36 +08:00
dicom 是连续性的切片,你单独拿出来一帧帧 AI 标注,会不会标错啊?
其实 AI 就应该多帧标注的,类似原始输入数据是立体模型,而不是纯平面切片数据。
chesha1
2023-11-22 09:49:38 +08:00
把 ai 组返回的数据生成一个分割文件(比如用 nibabel 库生成 nii.gz 文件),然后有很多软件(比如 itk-snap ),支持导入 dicom 文件和分割文件,把结果覆盖显示在原图上

据我了解,一般是不会把分割结果直接写入原 dicom 文件的,因为 dicom 文件的像素的灰度值是有医学上的意义的

或者你可以不管格式了,直接压成一个 png 或者 jpg 文件,可以也好做,你拿到分割结果后,这是一个多维数组,dicom 文件读取后(比如用 pydicom 库)也是一个多维数组,直接覆盖在上面,然后保存成图片输出就行了
LLaMA2
2023-11-22 09:55:27 +08:00
@chesha1

看到你的回答,我想起写透视外挂的时候都是 overlay 一层透明窗口,绘制。就是不知道 OP 的 AI 模型速度快到什么程度
Yokira
2023-11-22 10:02:32 +08:00
如果是网页端,在绘制 dicom 的时候一般都会使用第三方库( cornerstonejs 之类的)在 canvas 上面进行绘制,第三方库会提供渲染标注的方法,只要将 AI 返回的结果转换成对应的标注格式,然后与 dicom 一起加载就会自动绘制出来。
或者将标注转成 png ,铺在 dicom 上面也行,随着 dicom 的层数渲染不同的标注,这样做的好处就是标注文件比较小。
总之不建议将标注写到 dicom 里面。
RVRGnXxwawP5kwKW
2023-11-22 10:16:26 +08:00
1. 你不应该去修改原来的 dicom 文件,而是应该把得到的标注重新存一个文件。
2. 你 ai 得到得病罩最后最好是转化为一系列的坐标点,病罩就是这些坐标点围成的区域。
3. 如果你获取的标注是给医生看的,你应该存成 dicom rt 格式,兼容大部分临床的 dicom 图片查看器。
4. 如果你只是要展示给普通用户,那你存什么格式都无所谓了,只要前端能显示。但仍然推荐存坐标点而不是图片,因为更 compact 更节省空间。

应该没有人比我更懂了,欢迎联系讨论: https://kaizhao.net/cn
sakae010
2023-11-22 10:17:04 +08:00
我们是前端实现的,用的 cornerstonejs ,差不多就是楼上说的这样
ChenSino
2023-11-22 10:21:19 +08:00
@tool2d 不懂啊,刚接触 dicom,我也觉得是 ai 应该一下处理所有,返回处理好的多帧文件
RVRGnXxwawP5kwKW
2023-11-22 10:25:38 +08:00
@tool2d 他可能就是找了个 2d 的 segmentation 模型训练了下,3d 的模型难找,而且简单模型可能内存扛不住。
Jimmyisme
2023-11-22 10:27:59 +08:00
ChenSino
2023-11-22 10:28:12 +08:00
@kaiz 是给医生看的,我也是准备生成新的 dicom,现在就是不知道该如何用 java 的 dcm4che 实现把病灶的坐标显示在多帧 dicom 文件上
ChenSino
2023-11-22 10:28:29 +08:00
@kaiz 是的
tiwizz
2023-11-22 10:29:57 +08:00
建议使用 gdcm 来解析 dcm 文件,这个是多帧的。https://stackoverflow.com/questions/45193995/how-to-read-multi-frame-dicom-files-using-gdcm ,好像答案是 c#的,转一下就可以了吧,api 都一样。事实上都是分两层的吧,结果放在图像层上一层 canva 显示。
ChenSino
2023-11-22 10:30:00 +08:00
@Yokira 好的,感谢提供思路,我试试前端处理
laqow
2023-11-22 10:31:03 +08:00
java 应该就套个 imagej 随便搞
tiwizz
2023-11-22 10:31:11 +08:00
ChenSino
2023-11-22 10:32:01 +08:00
@chesha1 要用代码实现,因为要给医院用的,后续会有很多 dicom 文件
ChenSino
2023-11-22 10:32:44 +08:00
@tiwizz ok ,感谢,我研究一下
D2h0VL89HMAU417B
2023-11-22 10:34:06 +08:00
差点以为是我们公司了,我们有个公司最近也在搞这个

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/994024

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX