在Python中无法获取DICOM图像以用于显示

4

我正在尝试在opencv-python中显示DICOM图像。我正在使用pydicom库,并添加API来创建一个完整的DICOM查看器,其中包含DOTNET,可以运行python(当然是使用进程实例调用python)!无法转换或查看未压缩的DICOM图像。每当我尝试加载或修改pixel_array时,都会出现错误消息。

import dicom
import cv2
import numpy
df=dicom.read_file("IM-0001-0002.dcm")
df.pixel_array

Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
df.pixel_array
File "C:\Python27\lib\site-packages\dicom\dataset.py", line 394, in pixel_array
return self._get_pixel_array()
File "C:\Python27\lib\site-packages\dicom\dataset.py", line 376, in _get_pixel_array
raise NotImplementedError("Pixel Data is compressed in a format pydicom does not yet          handle. Cannot return array")
NotImplementedError: Pixel Data is compressed in a format pydicom does not yet handle.        Cannot return array

请建议我将图像转换为能够显示图像的cv2.imshow()函数的良好方法。
谢谢您提前的帮助!
4个回答

1

尝试使用pydicom

出现错误的原因可能是:使用的.dcm文件包含不受支持的格式(例如,在pydicom中,pillow不支持JPEG 2000)。这个问题可以解决。我遇到了同样的问题(我正在使用pydicom而不是dicom),我想你会从解决我的问题的解决方案中得到一些指导:

1st Platforma 信息:

我正在使用:pydicom读取.dcm文件,Python 3.6,Anaconda和Ubuntu,15 GB RAM

解决方案:

  1. 使用以下命令安装pydicom:pip install -U pydicom

有关详细信息,请访问此处:(链接:https://pydicom.github.io/pydicom/dev/getting_started.html

  1. Anaconda是必须的。为什么? 请参考pydicom的官方文档 (https://pydicom.github.io/pydicom/dev/getting_started.html) 中的说明:“为了安装包含压缩像素数据图像处理程序的pydicom,我们建议您使用Miniconda或Anaconda。”

  2. 如果您正在使用Ubuntu,直接打开终端。如果您在Windows上使用Anaconda Navigator,请转到环境,然后启动终端。在终端中执行以下命令:

    pip install -U git+https://github.com/pydicom/pydicom.git

    conda install pydicom --channel conda-forge

    conda install -c conda-forge gdcm

交叉检查:

现在重新启动笔记本电脑,然后尝试使用pydicom执行您的代码。它将显示输出。

此外,您可以使用Matplotlib按如下方式显示:

import matplotlib.pyplot as plt
import pydicom
filename = 'IM-0001-0002.dcm'
ds = pydicom.dcmread(filename)
plt.imshow(ds.pixel_array, cmap=plt.cm.bone)

我希望它能帮助你。

0

由于pydicom不支持压缩的DICOM文件,您需要先将其解压缩。 您可以使用GDCM来完成。


0

您可以使用Python GDCM绑定来先解压文件,例如请参见这里


-1

在处理单色调DICOM文件之前,您必须先将其转换为RGB格式。请参考以下链接以了解如何转换: https://github.com/twanmal/dicom_monochrome_to_opencv

# import the necessary packages
from imutils import contours
import scipy
from skimage import measure
import numpy as np # numeric library needed
import pandas as pd #for datafrome
import argparse # simple argparser
import imutils
import cv2  # for opencv image recognising tool
import dicom
filename = askopenfilename()
dicom_file = dicom.read_file(filename) ## original dicom File
#### a dicom monochrome-2 file has pixel value between approx -2000 and +2000, opencv doesn't work with it#####
#### in a first step we transform those pixel values in (R,G,B)
### to have gray in RGB, simply give the same values for R,G, and B, 
####(0,0,0) will be black, (255,255,255) will be white,

## the threeshold to be automized with a proper quartile function of the pixel distribution
black_threeshold=0###pixel value below 0 will be black,
white_threeshold=1400###pixel value above 1400 will be white
wt=white_threeshold
bt=black_threeshold

###### function to transform a dicom to RGB for the use of opencv, 
##to be strongly improved, as it takes to much time to run,
## and the linear process should be replaced with an adapted weighted arctan or an adapted spline interpolation.
def DicomtoRGB(dicomfile,bt,wt):
    """Create new image(numpy array) filled with certain color in RGB"""
    # Create black blank image
    image = np.zeros((dicomfile.Rows, dicomfile.Columns, 3), np.uint8)
    #loops on image height and width
    i=0
    j=0
    while i<dicomfile.Rows:
        j=0
        while j<dicomfile.Columns:
            color = yaxpb(dicom_file.pixel_array[i][j],bt,wt) #linear transformation to be adapted
            image[i][j] = (color,color,color)## same R,G, B value to obtain greyscale
            j=j+1
        i=i+1
    return image
##linear transformation : from [bt < pxvalue < wt] linear to [0<pyvalue<255]: loss of information... 
def yaxpb(pxvalue,bt,wt):
    if pxvalue < bt:
        y=0
    elif pxvalue > wt:
        y=255
    else:
        y=pxvalue*255/(wt-bt)-255*bt/(wt-bt)
    return y



image=DicomtoRGB(dicom_file,bt=0,wt=1400)
## loading the RGB in a proper opencv format
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
## look at the gray file
cv2.imshow("gray", gray)
cv2.waitKey(0)
cv2.destroyWindow("gray")

这个回答没有任何意义。第一行代码“dicom_file = dicom.read_file(filename) ## 原始的 dicom 文件”会产生和原帖中提到的同样的错误。 - Monica Heddneck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接