Unable to get dicom image for display in python

匿名 (未验证) 提交于 2019-12-03 01:05:01

问题:

I'm trying to display a DICOM image in opencv-python.I am using the pydicom library,And then adding API's to create a full fledged DICOM viewer with DOTNET, that runs python(C# calls python with process instance of course!!). I am unable to convert or see the uncompressed DICOM image. whenever i try to load or modify the pixel_array. I get error messges.

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 

Please suggest me good way to convert the image making cv2.imshow() function o display the image

Thanks in Advance!!

回答1:

Since pydicom do not support compressed dicom files, you will have to decompress it first. You can use GDCM to do that.



回答2:

You can use the python GDCM binding to decompress the file first, see for example here



回答3:

you have to convert in RGB before, look at that for a monochrome dicom file: 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") 


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!