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!!
Since pydicom do not support compressed dicom files, you will have to decompress it first. You can use GDCM to do that.
You can use the python GDCM binding to decompress the file first, see for example here
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")