AttributeError: объект 'FileDataset' не имеет атрибута 'PixelSpacing'

Я хочу преобразовать тип файла серии изображений из.dcm в.mha. Ниже приведен мой код:

import numpy
import pydicom
import os
PathDicom ='./DicomResource'
lstFilesDCM = []
for dirName, subdirList, fileList in os.walk(PathDicom):
for filename in fileList:
    if '.dcm' in filename.lower():
        lstFilesDCM.append(os.path.join(dirName, filename))

RefDs = pydicom.read_file(lstFilesDCM[0])
ConstPixelDims = (int(RefDs.Rows), int(RefDs.Columns), len(lstFilesDCM))
#RefDs.PixelSpacing = 0
ConstPixelSpacing = (float(RefDs.PixelSpacing[0]), 
float(RefDs.PixelSpacing[1]), float(RefDs.SliceThickness))
info = ConstPixelDims + ConstPixelSpacing
f = open('info.txt', 'w')
for n in info:
    f.write(str(n)+' ')
f.close()
location = []
for i in range(len(lstFilesDCM)):
    ds = pydicom.read_file(lstFilesDCM[i])
    location.append(ds.SliceLocation)
location.sort()
ArrayDicom = numpy.zeros((len(lstFilesDCM), RefDs.Rows, RefDs.Columns), 
dtype=RefDs.pixel_array.dtype)
for filenameDCM in lstFilesDCM:
    ds = pydicom.read_file(filenameDCM)
    ArrayDicom[location.index(ds.SliceLocation), :, :] = ds.pixel_array
ds = ArrayDicom.tostring()
f = open('1.mha', 'wb')
f.write(ds)
f.close()

При этом я получаю следующую ошибку:

AttributeError: объект 'FileDataset' не имеет атрибута 'PixelSpacing'

Я также попытался добавить RefDs.PixelSpacing = 0, Это бросает следующую ошибку. ошибка

Кто-нибудь может мне помочь решить проблему?

1 ответ

Атрибут "PixelSpacing" (0028,0030) не является обязательным во всех классах СОП. Для некоторых классов SOP, таких как "CT Image Storage" (Modality CT), это тип "1". Со многими другими это тип "1С". В классах СОП, таких как "Хранение изображений компьютерной радиографии" (Modality CR), эквивалентный атрибут "Расстояние между пикселями тепловизора" (0018,1164) включен в набор данных. Следующая цитата из 2017a, Часть 3 - Определения информационных объектов, объясняет это немного.

10.7.1.1 Пиксельное расстояние
Расстояние между пикселями (0028,0030) определяет физическое расстояние пациента между центром каждого пикселя.
Если присутствует Pixel Spacing (0028,0030) и изображение не было откалибровано для коррекции эффекта геометрического увеличения, значения этого атрибута должны быть такими же, как в Imager Pixel Spacing (0018,1164) или Nominal Scanned Pixel Spacing (0018,2010), если присутствует какой-либо из этих атрибутов.
Если присутствует Pixel Spacing (0028,0030), и значения отличаются от значений в Imager Pixel Spacing (0018,1164) или Nominal Scanned Pixel Spacing (0018,2010), то изображение было исправлено для известного или предполагаемого геометрического увеличения или откалиброван относительно некоторого объекта известного размера на известной глубине внутри пациента.
Если тип калибровки интервала между пикселями (0028,0A02) и интервал между пикселями тепловизора (0018,1164) и номинальное расстояние между сканированными пикселями (0018,2010) отсутствуют, то невозможно определить, была ли выполнена коррекция или калибровка.
Заметка
1. Imager Pixel Spacing (0018,1164) является обязательным атрибутом в IOD семейства DX.
2. Номинальный интервал между сканированными пикселями (0018,2010) является обязательным атрибутом в многокадровых IOD семейства SC.

Глядя на ваш вопрос, кажется, что ваш код не связан с каким-либо конкретным классом Modality/SOP. Учитывая это, вполне возможно, что ваш цикл столкнется с некоторыми случаями, в которых отсутствует этот атрибут.

О первой ошибке:

AttributeError: объект 'FileDataset' не имеет атрибута 'PixelSpacing'

Ошибка очень понятна. Набор данных DICOM не содержит искомого атрибута.

О второй ошибке:

Ошибка типа: объект 'DSfloat' не поддерживает индексирование

Значение Кратность атрибута равно 2.

Pixel Spacing = Row Spacing\Column Spacing = 0.30 mm\0.25 mm

Таким образом, вы должны иметь возможность доступа к значению с помощью индекса. Первое значение должно быть для строки, а второе должно быть столбцом. Но это зависит от реализации вашего инструментария / технологии. Я не знаю об обоих здесь, поэтому я не могу сказать.

Может быть, ваш инструментарий возвращает одно значение (без массива, следовательно, без индекса), которое вы должны далее разделить на разделитель ('\') и затем использовать его.

Или может быть, что, поскольку атрибут не представлен, значение переменной null (или что-то подобное в вашей технологии), и именно поэтому индексация не работает.

Другие вопросы по тегам