【问题标题】:Using dicom Images with OpenCV in Python在 Python 中使用带有 OpenCV 的 dicom 图像
【发布时间】:2018-12-10 14:35:33
【问题描述】:

我正在尝试使用 dicom 图像并在 Python 环境中使用 OpenCV 对其进行操作。到目前为止,我已经使用 pydicom 库读取 dicom(.dcm) 图像数据并使用像素数组属性使用 OpenCV imshow 方法显示图片。但输出只是一个空白窗口。这是我目前正在使用的代码的 sn-p。

import numpy as np
import cv2
import pydicom as dicom

ds=dicom.dcmread('sample.dcm')
cv2.imshow('sample image dicom',ds.pixel_array)

cv2.waitkey()

如果我打印出此处使用的数组,则输出与使用普通 numpy 数组得到的不同。我也尝试过使用 matplotlib imshow 方法,它能够显示带有一些颜色失真的图像。有没有办法将数组转换为 OpenCV 的可读格式?

【问题讨论】:

  • 您错过了对 cv2.waitKey 的呼叫。没有它,GUI 将无法工作(阅读文档)。
  • @DanMašek 请原谅我,我实际上正在使用该方法,但它不在此 sn-p 中。该窗口确实显示了,但它是一个空白窗口。
  • @DanMašek 但我会将其添加到代码中,以免人们误解。
  • 你得到的numpy数组元素的数据类型是什么? np.int16?范围是多少(最小值/最大值)?是单通道吗?
  • @DanMašek 实际上是 uint16

标签: python python-3.x opencv opencv3.0 pydicom


【解决方案1】:

遇到了类似的问题。使用exposure.equalize_adapthist() (source)。生成的图像不是您使用 DICOM 查看器看到的 100%,但它是我能得到的最好的。

import numpy as np
import cv2
import pydicom as dicom
from skimage import exposure

ds=dicom.dcmread('sample.dcm')
dcm_sample=ds.pixel_array
dcm_sample=exposure.equalize_adapthist(dcm_sample)
cv2.imshow('sample image dicom',dcm_sample)

cv2.waitkey()

【讨论】:

    【解决方案2】:

    我想出了一种方法来显示图像。正如丹在 cmets 中提到的,矩阵的值被按比例缩小,并且由于 imshow 功能,输出太暗,人眼无法区分。所以,最后我唯一需要做的就是将整个垫子数据乘以 128。图像现在完美显示。将矩阵乘以 255 会使图片曝光并导致某些特征被破坏。这是修改后的代码。

    import numpy as np
    import cv2
    import pydicom as dicom
    
    ds=dicom.dcmread('sample.dcm')
    dcm_sample=ds.pixel_array*128
    cv2.imshow('sample image dicom',dcm_sample)
    
    cv2.waitkey()
    

    【讨论】:

      【解决方案3】:

      我不认为这是一个正确的答案。它适用于该特定图像,因为您的大多数像素值都在较低范围内。检查此OpenCV: How to visualize a depth image。它适用于 c++,但很容易适应 Python。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-01-03
        • 2013-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-16
        相关资源
        最近更新 更多