无法在Python中获取dicom图像进行显示
我正在尝试在opencv-python中显示一个DICOM图像。我使用的是pydicom库,然后还添加了一些API,想要创建一个完整的DICOM查看器,使用DOTNET来运行Python(C#通过进程实例调用Python,当然!!)。但是我无法转换或查看未压缩的DICOM图像。每当我尝试加载或修改像素数组时,就会出现错误信息。
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 个回答
你需要先把它转换成RGB格式,看看这个关于单色DICOM文件的内容:
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")
你可以使用Python的GDCM库先来解压这个文件,具体可以参考这里的例子。
试试 pydicom
出现这个错误的一个原因可能是:你使用的 .dcm 文件可能包含不被支持的格式(比如,pydicom 中的 pillow 不支持 JPEG 2000 格式)。这个问题是可以解决的。我之前也遇到过同样的问题(我用的是 pydicom 而不是 dicom),我想你可以从我解决问题的办法中得到一些启发:
我的平台信息:
我使用的是:pydicom 来读取 .dcm 文件,Python 3.6,Anaconda 和 Ubuntu,内存 15 GB。
解决方案:
- 安装 pydicom,使用这个命令:
pip install -U pydicom
。
你可以在这里找到相关信息:(链接:https://pydicom.github.io/pydicom/dev/getting_started.html)
需要 Anaconda,为什么? 请查看 pydicom 的官方文档(https://pydicom.github.io/pydicom/dev/getting_started.html),里面提到“为了安装 pydicom 以及处理压缩像素数据的图像处理程序,我们建议使用 Miniconda 或 Anaconda”。
如果你直接使用 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)
希望这能帮到你。
因为pydicom不支持压缩的dicom文件,所以你需要先把它解压缩。你可以使用GDCM来完成这个操作。