Проблема с pixel_array при использовании pydicom на python 3.x - PullRequest
1 голос
/ 03 апреля 2019

Я использую pydicom (устанавливается с pip3, на Python 3.7, с использованием Idle), и мне нужно получить доступ к pixel_array значениям.

Я просто скопировал и вставил предоставленный пример в документацию , и это приводит к двум ошибкам:

  • сначала о операции get_testdata_files, которая не работает, потому что

    Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] on win32
    Type "help", "copyright", "credits" or "license()" for more information.
    >>> 
    ==================== RESTART: D:\OneDrive\Desktop\test.py ====================
    None
    Traceback (most recent call last):
      File "D:\OneDrive\Desktop\test.py", line 8, in <module>
        filename = get_testdata_files("bmode.dcm")[0]
    IndexError: list index out of range
    

Я решил это, не используя эту операцию.

  • секунда - это pixel_array, и я не могу расшифровать, что не так, но кажется, что pixel_array не заполнен. Однако я могу получить доступ к другим полям в наборе данных, и файл может быть отображен (например, с помощью ImageJ).

    ==================== RESTART: D:\OneDrive\Desktop\test.py ====================
    None
    
    Filename.........: bmode.dcm
    Storage type.....: 1.2.840.10008.5.1.4.1.1.3.1
    
    Patient's name...: Femoral trombenarterectomy, Case Report:
    Patient id.......: Case Report 1
    Modality.........: US
    Study Date.......: 20110824
    Image size.......: 768 x 1024, 27472108 bytes
    Slice location...: (missing)
    Traceback (most recent call last):
    File "D:\OneDrive\Desktop\test.py", line 38, in <module>
         plt.imshow(dataset.pixel_array, cmap=plt.cm.bone)
    File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\pydicom\dataset.py", line 949, in pixel_array
         self.convert_pixel_data()
    File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\pydicom\dataset.py", line 895, in convert_pixel_data
         raise last_exception
    File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\pydicom\dataset.py", line 863, in convert_pixel_data
    arr = handler.get_pixeldata(self)
     File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\pydicom\pixel_data_handlers\pillow_handler.py", line 188, in get_pixeldata
    UncompressedPixelData.extend(decompressed_image.tobytes())
    File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\Image.py", line 746, in tobytes
    self.load()
    File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\ImageFile.py", line 261, in load
    raise_ioerror(err_code)
    File "C:\Users\marcl\AppData\Local\Programs\Python\Python37\lib\site-packages\PIL\ImageFile.py", line 58, in raise_ioerror
    raise IOError(message + " when reading image file")
    

    OSError: сбой потока данных при чтении файла изображения

Вот мой код:

import matplotlib.pyplot as plt
import sys
import pydicom
import numpy
from pydicom.data import get_testdata_files

print(__doc__)
#filename = get_testdata_files("bmode.dcm")[0]
filename = "bmode.dcm"
dataset = pydicom.dcmread(filename)

# Normal mode:
print()
print("Filename.........:", filename)
print("Storage type.....:", dataset.SOPClassUID)
print()

pat_name = dataset.PatientName
display_name = pat_name.family_name + ", " + pat_name.given_name
print("Patient's name...:", display_name)
print("Patient id.......:", dataset.PatientID)
print("Modality.........:", dataset.Modality)
print("Study Date.......:", dataset.StudyDate)

if 'PixelData' in dataset:
    rows = int(dataset.Rows)
    cols = int(dataset.Columns)
    print("Image size.......: {rows:d} x {cols:d}, {size:d} bytes".format(
        rows=rows, cols=cols, size=len(dataset.PixelData)))
    if 'PixelSpacing' in dataset:
        print("Pixel spacing....:", dataset.PixelSpacing)


# use .get() if not sure the item exists, and want a default value if missing
print("Slice location...:", dataset.get('SliceLocation', "(missing)"))

# plot the image using matplotlib
plt.imshow(dataset.pixel_array, cmap=plt.cm.bone)
plt.show()

Не могли бы вы помочь мне решить эти две ошибки и получить доступ к значениям pixel_array? Не стесняйтесь дать мне несколько советов /remarks/...

Спасибо!

1 Ответ

0 голосов
/ 03 апреля 2019

Привет, Марк, добро пожаловать в SO!

Ваша первая ошибка означает, что get_testdata_files возвращает пустой список, поэтому ваш файл не найден.Взгляните на источник pydicom , он показывает, что поиск выполняется в [DATA_ROOT]/test_files.Ваш файл находится по этому пути?

Ваша вторая ошибка связана с PIL, и ее может быть довольно сложно отладить и исправить.Сначала попробуйте прочитать pixel_array из набора данных, созданного из одного из предоставленных тестовых файлов .Если это работает, ваша проблема, вероятно, в том, что PIL не может обработать определенную кодировку данных вашего изображения.Вы хотите установить и использовать GDCM вместо PIL, чтобы посмотреть, решит ли это проблему.У другого пользователя была похожая проблема , поскольку вы, GDCM, решили эту проблему.К сожалению, работать может быть немного головной болью.Или посмотрите на эту страницу , она показывает некоторые другие альтернативы просмотра данных изображения.

...