V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
ChenSino
V2EX  ›  程序员

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

  •  
  •   ChenSino · 2023-11-22 09:07:59 +08:00 · 2958 次点击
    这是一个创建于 368 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    34 条回复    2023-11-23 10:11:06 +08:00
    LLaMA2
        1
    LLaMA2  
       2023-11-22 09:35:33 +08:00
    dicom 的 image 段 你可以做到 dicom->image <==> 图片 互转

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

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

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

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

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

    应该没有人比我更懂了,欢迎联系讨论: https://kaizhao.net/cn
    sakae010
        8
    sakae010  
       2023-11-22 10:17:04 +08:00
    我们是前端实现的,用的 cornerstonejs ,差不多就是楼上说的这样
    ChenSino
        9
    ChenSino  
    OP
       2023-11-22 10:21:19 +08:00
    @tool2d 不懂啊,刚接触 dicom,我也觉得是 ai 应该一下处理所有,返回处理好的多帧文件
    RVRGnXxwawP5kwKW
        10
    RVRGnXxwawP5kwKW  
       2023-11-22 10:25:38 +08:00
    @tool2d 他可能就是找了个 2d 的 segmentation 模型训练了下,3d 的模型难找,而且简单模型可能内存扛不住。
    Jimmyisme
        11
    Jimmyisme  
       2023-11-22 10:27:59 +08:00
    ChenSino
        12
    ChenSino  
    OP
       2023-11-22 10:28:12 +08:00
    @kaiz 是给医生看的,我也是准备生成新的 dicom,现在就是不知道该如何用 java 的 dcm4che 实现把病灶的坐标显示在多帧 dicom 文件上
    ChenSino
        13
    ChenSino  
    OP
       2023-11-22 10:28:29 +08:00
    @kaiz 是的
    tiwizz
        14
    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
        15
    ChenSino  
    OP
       2023-11-22 10:30:00 +08:00
    @Yokira 好的,感谢提供思路,我试试前端处理
    laqow
        16
    laqow  
       2023-11-22 10:31:03 +08:00
    java 应该就套个 imagej 随便搞
    tiwizz
        17
    tiwizz  
       2023-11-22 10:31:11 +08:00
    ChenSino
        18
    ChenSino  
    OP
       2023-11-22 10:32:01 +08:00
    @chesha1 要用代码实现,因为要给医院用的,后续会有很多 dicom 文件
    ChenSino
        19
    ChenSino  
    OP
       2023-11-22 10:32:44 +08:00
    @tiwizz ok ,感谢,我研究一下
    D2h0VL89HMAU417B
        20
    D2h0VL89HMAU417B  
       2023-11-22 10:34:06 +08:00
    差点以为是我们公司了,我们有个公司最近也在搞这个
    coolwulf
        21
    coolwulf  
       2023-11-22 10:35:14 +08:00   ❤️ 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.
    worldqiuzhi
        22
    worldqiuzhi  
       2023-11-22 10:35:26 +08:00
    dcm4che 本来就支持呀 先把原始 dcm 头信息保存到 xml 里 再把处理完的图片转 dcm 并把头信息写回不就可以了吗
    coolwulf
        23
    coolwulf  
       2023-11-22 10:36:04 +08:00
    @kaiz We are hiring. I see you are a post-doc in case you are looking for a job. Contact me.
    tiwizz
        24
    tiwizz  
       2023-11-22 10:39:23 +08:00
    @ChenSino gdcm 可能还需要注意一下 GetPhotometricInterpretation(),即数据格式是不是"YBR_FULL",需要转 rgb 这类的。
    ChenSino
        25
    ChenSino  
    OP
       2023-11-22 10:41:27 +08:00
    @worldqiuzhi 老哥指点一下,就是找不到他的使用文档
    worldqiuzhi
        26
    worldqiuzhi  
       2023-11-22 10:49:40 +08:00
    @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.
    putaozhenhaochi
        27
    putaozhenhaochi  
       2023-11-22 11:08:35 +08:00 via iPhone
    dicom 协议挺麻烦的。 肯定是在前端标注。
    NeroKamin
        28
    NeroKamin  
       2023-11-22 11:21:36 +08:00 via iPhone
    @kaiz 大佬!
    CodingNew
        29
    CodingNew  
       2023-11-22 17:42:07 +08:00
    “解析 dicom(多帧)文件,把他转化成多个图片” 用 python 哈,java 搞这个不给力。
    574402766
        30
    574402766  
       2023-11-22 20:19:24 +08:00
    我们是读进来以后转成二维数组把轮廓像素点 hu 值改掉再存成 dicom 送去归档...
    ChenSino
        31
    ChenSino  
    OP
       2023-11-23 09:00:48 +08:00
    @CodingNew 这一步很好实现,java 读取 dicom 获取多帧很好做,但是编辑写入数据、图片到 dicom 好像不太好操作,关键是没有文档不知道怎么下手。
    ChenSino
        32
    ChenSino  
    OP
       2023-11-23 09:02:13 +08:00
    @574402766 我们也是 ai 处理后返回像素的坐标点集合,要把它描迹--
    tiwizz
        33
    tiwizz  
       2023-11-23 10:06:36 +08:00
    @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 大小变化同步。
    tiwizz
        34
    tiwizz  
       2023-11-23 10:11:06 +08:00
    @ChenSino 额,或者直接就 canvas 上同时绘制图像和你的模型结果。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2975 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 14:11 · PVG 22:11 · LAX 06:11 · JFK 09:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.