Создание нового DICOM с нуля с использованием 12-битных изображений - PullRequest
2 голосов
/ 09 марта 2020

Я пытаюсь создать новый файл dicom с нуля, используя pydicom. Я создал файл с помощью следующих ссылок из stackoverflow и примеров pydicom github . Это моя функция:

def generate_dicom(pixel_array,filename):

    sop_uid = pydicom.uid.generate_uid()
    sop_class_uid = pydicom._storage_sopclass_uids.ComputedRadiographyImageStorage

    #create metadata
    file_meta = Dataset()
    file_meta.MediaStorageSOPClassUID = sop_class_uid
    file_meta.MediaStorageSOPInstanceUID = sop_uid
    file_meta.ImplementationClassUID = '1.2.276.0.7230010.3.0.3.6.2'
    file_meta.FileMetaInformationGroupLength = 218
    file_meta.FileMetaInformationVersion = b'\x00\x01'
    file_meta.ImplementationVersionName = 'OFFIS_DCMTK_362'
    file_meta.SourcApplicationEntitTitle = 'AZMED'

    ds = FileDataset(filename, {},file_meta = file_meta,preamble=b"\x00" * 128)

    # Set the transfer syntax implicitly, if not set explicitly above
    ds.is_little_endian = True
    ds.is_implicit_VR = True

    #change modality
    ds.Modality = 'CR'

    # Set creation date/time
    dt = datetime.datetime.now()
    ds.ContentDate = dt.strftime('%Y%m%d')
    timeStr = dt.strftime('%H%M%S.%f')  # long format with micro seconds
    ds.ContentTime = timeStr

    ds.StudyInstanceUID = pydicom.uid.generate_uid()
    ds.SeriesInstanceUID = pydicom.uid.generate_uid()
    ds.SOPInstanceUID =  sop_uid
    ds.SOPClassUID = sop_class_uid
    ds.SecondaryCaptureDeviceManufctur = 'AZMed_SAS'
    ds.FrameOfReferenceUID = pydicom.uid.generate_uid()

    # set patient name and ID
    ds.PatientName = "Test^Firstname"
    ds.PatientID = "123456"

    ## These are the necessary imaging components of the FileDataset object.
    # we create 16 bit pixel arrays here
    ds.SamplesPerPixel = 1
    ds.PhotometricInterpretation = "MONOCHROME2"
    ds.PixelRepresentation = 0
    ds.HighBit = 15
    ds.BitsStored = 16
    ds.BitsAllocated = 16
    #ds.SmallestImagePixelValue = b"\x00\x00"
    #ds.LargestImagePixelValue = b"\xff\xff"
    ds.Columns = pixel_array.shape[0]
    ds.Rows = pixel_array.shape[1]

    if pixel_array.dtype != np.uint16:
        pixel_array = pixel_array.astype(np.uint16)

    ds.PixelData = pixel_array.tostring()
    ds.ImagesInAcquisition = "1"

    # reutrn the dataset of dicom
    return ds

Для этой функции я передаю изображение с использованием cv2:

new_pixel_array = cv2.imread('/home/toing/image_01.png', -1)

Когда я передаю new_pixel_array с формой (1500, 200), с 12-битными значениями и вводим uint16 в мою функцию, я получаю очень размытое изображение, когда пытаюсь прочитать сгенерированный диком.

ds = generate_dicom(new_pixel_array, 'toing.dcm')
ds.pixel_array

enter image description here Однако, когда я пытаюсь передать:

x = np.arange(16).reshape(16,1)
new_pixel_array = (x + x.T) * 32
new_pixel_array = np.tile(new_pixel_array,(16,16))

Как предлагается в этом ответе, Я получаю желаемое мозаичное изображение, показанное правильно.

Я также пытался преобразовать new_pixel_array в 8-битные значения перед передачей в мою функцию, но я все еще получаю тот же результат. С другой стороны, сгенерированное мозаичное изображение прекрасно работает при конвертации. Что я тут не так делаю?

1 Ответ

2 голосов
/ 09 марта 2020

Мне кажется, что размеры установлены неправильно.

Если я правильно вас понимаю, ваше изображение должно быть (1500, 200), то есть 1500 пикселей в высоту и 200 пикселей в ширину.

ds.Columns = pixel_array.shape[0]  # 1500
ds.Rows = pixel_array.shape[1]     # 200

В предоставленном вами фрагменте вы задаете ширину или столбцы для первого значения вашей фигуры.

Попробуйте изменить эти значения

...