大家好,我创建了一个评估骰子相似度指数(DSC)的脚本,但我不确定该脚本。选择结构后我想计算它们的 DSC 我定义了两个函数 第一个提取数组: \python\ 代码:
def extract_coordinates(rtstruct, target_name):
for item in rtstruct.StructureSetROISequence:
roi_name = item.ROIName.strip()
roi_number = item.ROINumber
if roi_name.lower() == target_name.lower():
referenced_roi_number = rtstruct.ROIContourSequence[roi_number -1].ReferencedROINumber
coordinate_array = []
for dataset in rtstruct.ROIContourSequence[roi_number -1].ContourSequence:
coordinate_triplets = dataset.ContourData
for i in range(0, len(coordinate_triplets), 3):
x, y, z = map(float, coordinate_triplets[i:i + 3])
coordinate_array.append((x, y, z))
return coordinate_array
return None
coordinate_array1 = extract_coordinates(rtstruct1, target_name1)
coordinate_array2 = extract_coordinates(rtstruct2, target_name2)
列表的长度约为 32 个对象。如果我选择最后两个元素,我会在referenced_roi_number = rtstruct.ROIContourSequence[roi_number -1].ReferencedROINumber-> out of index行上出现错误,此外将[roi_number-1]更改为[roi_number-10],DSC将发生变化,但i0m能够使用最后两项。 第二个函数是关于我如何计算DSC,但如果我将PTV(轮廓1,而ctv轮廓2)与CTV(现在变成轮廓1与PTV轮廓2)交换,DSC将从0.2853更改为1.7147(2-1.7147= 0.2853) )但我总是需要相同的结果,而不取决于结构的顺序。
if coordinate_array1 is not None and coordinate_array2 is not None:
def calculate_dice_similarity(coordinate_array1, coordinate_array2):
contour1 = set(coordinate_array1) # Converti la lista in un insieme
contour2 = set(coordinate_array2) # Converti la lista in un insieme
intersection = len(np.logical_and(contour1, contour2))
union = len(np.union1d(contour1, contour2))
dice_similarity = (2.0 * intersection) / (len(contour1) + len(contour2))
return dice_similarity
# Evaluation of Dice Similarity Index
dice_similarity = calculate_dice_similarity(coordinate_array1, coordinate_array2)
print(f"Dice Similarity Index between '{target_name1}' e '{target_name2}': {dice_similarity:.4f}")
else:
print(f"Struture '{target_name1}' o '{target_name2}' not found
我不知道如何解决它们。我尝试访问 roicontoursequence 列表,发现这是一个包含 32 个元素的列表,但我不知道如何解决该问题。与 DSC 相同,该指数不依赖于因子的顺序。 谢谢大家
鉴于您收到 IndexError,在没有进一步信息的情况下,我猜测 ROI 编号并不代表轮廓数组的正确索引。它们通常以这种方式存储,但不能保证。
我建议使用类似以下内容来获取 target_name 到 ROIContour 索引的映射:
roi_to_name = {roi.ROINumber: roi.ROIName for roi in ds.StructureSetROISequence}
# get contour index->ROIName
ctr_index_to_name = {i: roi_to_name[ctr.ReferencedROINumber] for i, ctr in enumerate(ds.ROIContourSequence)}
# Reverse to get name->index
name_to_ctr_index = {v: k for k,v in ctr_index_to_name.items()}
然后你可以直接跳到:
for dataset in rtstruct.ROIContourSequence[name_to_ctr_index[target_name]].ContourSequence:
...