最近在搞使用 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
給大家參考囉
留言板
歡迎留下建議與分享!希望一起交流!感恩!