我司有个需求是这样的: 要求实现解析 dicom(多帧)文件,把他转化成多个图片,然后把每个图片拿去调用 ai 组的一个接口(标出病灶,结节,返回坐标集合),拿到每个图片的坐标后,根据坐标绘制图片把病灶圈起来得到新的图片,然后再用新的图片替换原 dicom 中的图片,实现播放 dicom 时,能看到每帧上圈出来的病灶。
图片根据坐标绘制很好实现,绘制完后如何再把他写入原 dicom 文件呢?我用的 java 的 dcm4che 库,文档几乎可以说是没有,代码注释也是少得可怜,有经验的的大佬能否指点一下如何做,或者哪里可以获取到 dcm4che 的更详细资料?
ps: 不要问我为什么 ai 不支持直接在多帧 dicom 上标注,俺也不敢说也不敢问
1
LLaMA2 359 天前
dicom 的 image 段 你可以做到 dicom->image <==> 图片 互转
替换回去,顺便可能需要变更下 data_element 的 value_length. 以上内容是我根据搜索引擎查询 dicom 的数据格式得出的结论。 话又说回来, 你应该直接研究下已有的 dicom 渲染工具是怎么渲染画面的, 渲染的时候带入坐标自己做额外的绘制是不是更高效! |
2
sivacohan 359 天前 1
|
3
tool2d 359 天前 via Android
dicom 是连续性的切片,你单独拿出来一帧帧 AI 标注,会不会标错啊?
其实 AI 就应该多帧标注的,类似原始输入数据是立体模型,而不是纯平面切片数据。 |
4
chesha1 359 天前
把 ai 组返回的数据生成一个分割文件(比如用 nibabel 库生成 nii.gz 文件),然后有很多软件(比如 itk-snap ),支持导入 dicom 文件和分割文件,把结果覆盖显示在原图上
据我了解,一般是不会把分割结果直接写入原 dicom 文件的,因为 dicom 文件的像素的灰度值是有医学上的意义的 或者你可以不管格式了,直接压成一个 png 或者 jpg 文件,可以也好做,你拿到分割结果后,这是一个多维数组,dicom 文件读取后(比如用 pydicom 库)也是一个多维数组,直接覆盖在上面,然后保存成图片输出就行了 |
6
Yokira 359 天前
如果是网页端,在绘制 dicom 的时候一般都会使用第三方库( cornerstonejs 之类的)在 canvas 上面进行绘制,第三方库会提供渲染标注的方法,只要将 AI 返回的结果转换成对应的标注格式,然后与 dicom 一起加载就会自动绘制出来。
或者将标注转成 png ,铺在 dicom 上面也行,随着 dicom 的层数渲染不同的标注,这样做的好处就是标注文件比较小。 总之不建议将标注写到 dicom 里面。 |
7
RVRGnXxwawP5kwKW 359 天前
1. 你不应该去修改原来的 dicom 文件,而是应该把得到的标注重新存一个文件。
2. 你 ai 得到得病罩最后最好是转化为一系列的坐标点,病罩就是这些坐标点围成的区域。 3. 如果你获取的标注是给医生看的,你应该存成 dicom rt 格式,兼容大部分临床的 dicom 图片查看器。 4. 如果你只是要展示给普通用户,那你存什么格式都无所谓了,只要前端能显示。但仍然推荐存坐标点而不是图片,因为更 compact 更节省空间。 应该没有人比我更懂了,欢迎联系讨论: https://kaizhao.net/cn 。 |
8
sakae010 359 天前
我们是前端实现的,用的 cornerstonejs ,差不多就是楼上说的这样
|
10
RVRGnXxwawP5kwKW 359 天前
@tool2d 他可能就是找了个 2d 的 segmentation 模型训练了下,3d 的模型难找,而且简单模型可能内存扛不住。
|
11
Jimmyisme 359 天前
|
12
ChenSino OP @kaiz 是给医生看的,我也是准备生成新的 dicom,现在就是不知道该如何用 java 的 dcm4che 实现把病灶的坐标显示在多帧 dicom 文件上
|
14
tiwizz 359 天前
建议使用 gdcm 来解析 dcm 文件,这个是多帧的。https://stackoverflow.com/questions/45193995/how-to-read-multi-frame-dicom-files-using-gdcm ,好像答案是 c#的,转一下就可以了吧,api 都一样。事实上都是分两层的吧,结果放在图像层上一层 canva 显示。
|
16
laqow 359 天前
java 应该就套个 imagej 随便搞
|
20
D2h0VL89HMAU417B 359 天前
差点以为是我们公司了,我们有个公司最近也在搞这个
|
21
coolwulf 359 天前 1
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.
|
22
worldqiuzhi 359 天前
dcm4che 本来就支持呀 先把原始 dcm 头信息保存到 xml 里 再把处理完的图片转 dcm 并把头信息写回不就可以了吗
|
23
coolwulf 359 天前
@kaiz We are hiring. I see you are a post-doc in case you are looking for a job. Contact me.
|
24
tiwizz 359 天前
@ChenSino gdcm 可能还需要注意一下 GetPhotometricInterpretation(),即数据格式是不是"YBR_FULL",需要转 rgb 这类的。
|
25
ChenSino OP @worldqiuzhi 老哥指点一下,就是找不到他的使用文档
|
26
worldqiuzhi 359 天前
@ChenSino dcm2xml: Convert DICOM file in XML presentation Convert <dicom-file> (or the standard input if <dicom-file> = '-') in XML
presentation and optionally apply XSLT stylesheet on it. Writes result to standard output. usage: jpg2dcm Encapsulate JPEG, JPEG 2000 Part 1, JPEG 2000 Part 15 (HTJ2K) image or MPEG2, MP4 or Quicktime video file(s) (or present in directories) into DICOM file(s) (or into DICOM directory). DICOM attributes can be specified via command line (using -m option) or a XML file (using -f option). If both the options are specified, system will generate metadata first from sample metadata file then from file specified by user, then add the attributes specified individually on command line and lastly read the header from the file to get specific information in accordance with the content type of the file. The Type 1 and Type 2 attributes, if missing will be generated by the system. |
27
putaozhenhaochi 359 天前 via iPhone
dicom 协议挺麻烦的。 肯定是在前端标注。
|
29
CodingNew 358 天前
“解析 dicom(多帧)文件,把他转化成多个图片” 用 python 哈,java 搞这个不给力。
|
30
574402766 358 天前
我们是读进来以后转成二维数组把轮廓像素点 hu 值改掉再存成 dicom 送去归档...
|
31
ChenSino OP @CodingNew 这一步很好实现,java 读取 dicom 获取多帧很好做,但是编辑写入数据、图片到 dicom 好像不太好操作,关键是没有文档不知道怎么下手。
|
33
tiwizz 358 天前
@ChenSino 模型结果最好不要放回 dicom 里面,这个是前端工作干的事情啊。react jsx 例如这样: <div id="content" style={{ width: '800px', height: '600px', }} ref={imgRef}>
<img id="image-content" src={`data:image/png;base64,${imgbase64}`} /> <canvas ref={canvasDrawRef} width="800px" height="600px" /> </div> 在 canvas 层里面描绘你的结果,img 仍然是你解析的 dicom 图像。只要注意 canvas img 大小变化同步。 |