LIDC-IDRI数据集xml文件读取roi坐标,并根据imageSOP_UID匹配到原始dcm图像上框出肺结节区域
import pydicom as dicom
import os
import cv2
import numpy as np
import lxml.etree as etree
import pydicom
from PIL import Image
from skimage.draw import polygon
from matplotlib.pyplot import plot as plt
def xml_reader(path):
anno = {}
xmlns = '{http://www.nih.gov}'
tree = etree.parse(path)
assert tree.findall(xmlns + 'ResponseHeader') != [], '{}.has no ResponseHeader'.format(path)
Res = tree.findall(xmlns + 'ResponseHeader')[0]
if tree.findall(xmlns + 'readingSession') == []: return {}
i = tree.findall(xmlns + 'readingSession')[0]
Nodules = []
if i.findall(xmlns + 'unblindedReadNodule') == []: return {}
j = i.findall(xmlns + 'unblindedReadNodule')[0]
Nodule = []
for k in j.findall(xmlns + 'roi'):
roi = {}
roi['imageSOP_UID'] = k.findall(xmlns + 'imageSOP_UID')[0].text
roi['roi'] = []
for l in k.findall(xmlns + 'edgeMap'):
x = int(l.findall(xmlns + 'xCoord')[0].text)
y = int(l.findall(xmlns + 'yCoord')[0].text)
roi['roi'].append([x, y])
Nodule.append(roi)
Nodules.append(Nodule)
anno['session'] = Nodules
return anno
xml_name = 'E:\manifest-1600709154662\LIDC-IDRI\LIDC-IDRI-0001\\01-01-2000-NA-NA-30178\\3000566.000000-NA-03192\\069.xml'
roi_contour = xml_reader(xml_name)
r = roi_contour['session'][0]
target_sop_uid = r[0]['imageSOP_UID']
dcm_folder_path = "D:\Paper_Code\Test_medical_image\manifest-1600709154662\LIDC-IDRI\LIDC-IDRI-0001\\01-01-2000-NA-NA-30178\\3000566.000000-NA-03192"
cxl = ''
for root, dirs, files in os.walk(dcm_folder_path):
for file_name in files:
if file_name.endswith(".dcm"):
dcm_file_path = os.path.join(root, file_name)
ds = pydicom.dcmread(dcm_file_path)
if ds.SOPInstanceUID == target_sop_uid:
print(f"找到了匹配的DICOM切片:{dcm_file_path}")
cxl = dcm_file_path
break
ds = pydicom.dcmread(cxl)
image_data = ds.pixel_array
temp = np.array(image_data, np.uint8)
temp = cv2.cvtColor(temp, cv2.COLOR_GRAY2RGB)
mask = np.array(r[7]['roi'], dtype=np.int32)
color = (0, 0, 255)
thickness = 2
is_closed = True
cv2.polylines(temp, [mask], is_closed, color, thickness)
cv2.imshow("ROI Boundary", temp)
cv2.waitKey(0)
cv2.destroyAllWindows()