最近在搞使用 python 的 pydicom 製作 dicom 影像

發現一些重點
特別在這邊紀錄一下

首先
要放入dicom 的影像需要設定格式
不能夠直接把np陣列放進去
尤其是針對RGB影像
必須要封裝
否則呈現都會是亂碼的圖片
而製作影像方式可參考

https://github.com/pydicom/pydicom/issues/1003#issuecomment-569041752

 

from pydicom.encaps import encapsulate
import io
from PIL import Image
frame_data = []
ds = pydicom.dcmread('00.dcm', force=False)
image = Image.fromarray(imgArr)
with io.BytesIO() as output:
# 將影像儲存成JPEG2000格式
image.save(output, format="JPEG2000")
# 附加進去要放進去的影像(因為影像預設可以多張)
frame_data.append(output.getvalue())

# 進行封裝
encapsulated_data = encapsulate(frame_data)
# 將影像放入我們讀取的dicom
ds.PixelData = encapsulated_data

# 設定傳輸影像的代碼UID
from pydicom.uid import JPEG2000
ds.file_meta.TransferSyntaxUID = JPEG2000

 


上傳影像可以參考官方範例

https://github.com/pydicom/pynetdicom#storage-scu

 

from pydicom import dcmread
from pydicom.uid import ImplicitVRLittleEndian

from pynetdicom import AE, VerificationPresentationContexts
from pynetdicom.sop_class import CTImageStorage, MRImageStorage

ae = AE(ae_title='MY_STORAGE_SCU')
# We can also do the same thing with the requested contexts
ae.requested_contexts = VerificationPresentationContexts
# Or we can use inbuilt objects like CTImageStorage.
# The requested presentation context's transfer syntaxes can also
# be specified using a str/UID or list of str/UIDs
ae.add_requested_context(CTImageStorage,
transfer_syntax=ImplicitVRLittleEndian)
# Adding a presentation context with multiple transfer syntaxes
ae.add_requested_context(MRImageStorage,
transfer_syntax=[ImplicitVRLittleEndian,
'1.2.840.10008.1.2.1'])

assoc = ae.associate(addr, port)
if assoc.is_established:
dataset = dcmread('file-in.dcm')
# `status` is the response from the peer to the store request
# but may be an empty pydicom Dataset if the peer timed out or
# sent an invalid dataset.
status = assoc.send_c_store(dataset)

assoc.release()

 


然後影像中需要設定成唯一值UID的也必須設定

https://pydicom.github.io/pydicom/dev/reference/generated/pydicom.uid.generate_uid.html

然後設定tag資料也需要參考格式以及tag意義是什麼

https://dicom.innolitics.com/ciods/rt-image/image-pixel/7fe00010

例如以下這樣

 

from pydicom.uid import generate_uid
InstanceUIDStr = generate_uid()

# DA TM UI 都是格式代號

ds[0x0008,0x0012] = DataElement(0x00080012, 'DA', InstanceCreationDateStr) # Instance Creation Date = 20210801
ds[0x0008,0x0013] = DataElement(0x00080013, 'TM', InstanceCreationTimeStr) # Instance Creation Time = 133500.00
ds[0x0008,0x0018] = DataElement(0x00080018, 'UI', InstanceUIDStr) # SOP Instance UID = 1.2.840.113619.2.281.41200.104311250.162978000.1073631555

 

給大家參考囉