我司有个需求是这样的:
要求实现解析 dicom(多帧)文件,把他转化成多个图片,然后把每个图片拿去调用 ai 组的一个接口(标出病灶,结节,返回坐标集合),拿到每个图片的坐标后,根据坐标绘制图片把病灶圈起来得到新的图片,然后再用新的图片替换原 dicom 中的图片,实现播放 dicom 时,能看到每帧上圈出来的病灶。
图片根据坐标绘制很好实现,绘制完后如何再把他写入原 dicom 文件呢?我用的 java 的 dcm4che 库,文档几乎可以说是没有,代码注释也是少得可怜,有经验的的大佬能否指点一下如何做,或者哪里可以获取到 dcm4che 的更详细资料?
ps:
不要问我为什么 ai 不支持直接在多帧 dicom 上标注,俺也不敢说也不敢问

dicom 的 image 段 你可以做到 dicom->image <==> 图片 互转替换回去,顺便可能需要变更下 data_element 的 value_length.以上内容是我根据搜索引擎查询 dicom 的数据格式得出的结论。话又说回来,你应该直接研究下已有的 dicom 渲染工具是怎么渲染画面的,渲染的时候带入坐标自己做额外的绘制是不是更高效!

github.com/dcm4che/dcm4che/blob/master/dcm4che-tool/dcm4che-tool-jpg2dcm/README.md

dicom 是连续性的切片,你单独拿出来一帧帧 AI 标注,会不会标错啊?其实 AI 就应该多帧标注的,类似原始输入数据是立体模型,而不是纯平面切片数据。

把 ai 组返回的数据生成一个分割文件(比如用 nibabel 库生成 nii.gz 文件),然后有很多软件(比如 itk-snap ),支持导入 dicom 文件和分割文件,把结果覆盖显示在原图上据我了解,一般是不会把分割结果直接写入原 dicom 文件的,因为 dicom 文件的像素的灰度值是有医学上的意义的或者你可以不管格式了,直接压成一个 png 或者 jpg 文件,可以也好做,你拿到分割结果后,这是一个多维数组,dicom 文件读取后(比如用 pydicom 库)也是一个多维数组,直接覆盖在上面,然后保存成图片输出就行了

看到你的回答,我想起写透视外挂的时候都是 overlay 一层透明窗口,绘制。就是不知道 OP 的 AI 模型速度快到什么程度

如果是网页端,在绘制 dicom 的时候一般都会使用第三方库( cornerstonejs 之类的)在 canvas 上面进行绘制,第三方库会提供渲染标注的方法,只要将 AI 返回的结果转换成对应的标注格式,然后与 dicom 一起加载就会自动绘制出来。或者将标注转成 png ,铺在 dicom 上面也行,随着 dicom 的层数渲染不同的标注,这样做的好处就是标注文件比较小。总之不建议将标注写到 dicom 里面。

  1. 你不应该去修改原来的 dicom 文件,而是应该把得到的标注重新存一个文件。2. 你 ai 得到得病罩最后最好是转化为一系列的坐标点,病罩就是这些坐标点围成的区域。3. 如果你获取的标注是给医生看的,你应该存成 dicom rt 格式,兼容大部分临床的 dicom 图片查看器。4. 如果你只是要展示给普通用户,那你存什么格式都无所谓了,只要前端能显示。但仍然推荐存坐标点而不是图片,因为更 compact 更节省空间。应该没有人比我更懂了,欢迎联系讨论: kaizhao.net/cn 。

我们是前端实现的,用的 cornerstonejs ,差不多就是楼上说的这样

不懂啊,刚接触 dicom,我也觉得是 ai 应该一下处理所有,返回处理好的多帧文件

他可能就是找了个 2d 的 segmentation 模型训练了下,3d 的模型难找,而且简单模型可能内存扛不住。

#10 github.com/wasserth/TotalSegmentator

是给医生看的,我也是准备生成新的 dicom,现在就是不知道该如何用 java 的 dcm4che 实现把病灶的坐标显示在多帧 dicom 文件上

是的

建议使用 gdcm 来解析 dcm 文件,这个是多帧的。 stackoverflow.com/questions/45193995/how-to-read-multi-frame-dicom-files-using-gdcm ,好像答案是 c#的,转一下就可以了吧,api 都一样。事实上都是分两层的吧,结果放在图像层上一层 canva 显示。

好的,感谢提供思路,我试试前端处理

java 应该就套个 imagej 随便搞

补充: github.com/malaterre/GDCM/tree/master/Examples/Java

要用代码实现,因为要给医院用的,后续会有很多 dicom 文件

ok ,感谢,我研究一下

差点以为是我们公司了,我们有个公司最近也在搞这个

You shouldn't convert dicom to images directly since RGB image is losing a lot of details in the dicom. Should just put the data in a Ndarray, then get a single slice if you need to call a 2D model. However you should be using a 3D model for this kind of application.

dcm4che 本来就支持呀 先把原始 dcm 头信息保存到 xml 里 再把处理完的图片转 dcm 并把头信息写回不就可以了吗

We are hiring. I see you are a post-doc in case you are looking for a job. Contact me.

gdcm 可能还需要注意一下 GetPhotometricInterpretation(),即数据格式是不是"YBR_FULL",需要转 rgb 这类的。

老哥指点一下,就是找不到他的使用文档

dcm2xml: Convert DICOM file in XML presentation Convert (or the standard input if = '-') in XMLpresentation and optionally apply XSLT stylesheet on it. Writes result tostandard output.usage: jpg2dcmEncapsulate JPEG, JPEG 2000 Part 1, JPEG 2000 Part 15 (HTJ2K) image orMPEG2, MP4 or Quicktime video file(s) (or present in directories) intoDICOM file(s) (or into DICOM directory). DICOM attributes can be specifiedvia command line (using -m option) or a XML file (using -f option). Ifboth the options are specified, system will generate metadata first fromsample metadata file then from file specified by user, then add theattributes specified individually on command line and lastly read theheader from the file to get specific information in accordance with thecontent type of the file. The Type 1 and Type 2 attributes, if missingwill be generated by the system.

dicom 协议挺麻烦的。 肯定是在前端标注。

大佬!

“解析 dicom(多帧)文件,把他转化成多个图片” 用 python 哈,java 搞这个不给力。

我们是读进来以后转成二维数组把轮廓像素点 hu 值改掉再存成 dicom 送去归档...