来自 rtstruct dicom 文件的两个 3D 数组之间的 Dice 相似度索引

问题描述 投票:0回答:1

大家好,我创建了一个评估骰子相似度指数(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 相同,该指数不依赖于因子的顺序。 谢谢大家

python multidimensional-array similarity dicom
1个回答
0
投票

鉴于您收到 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:
   ...
© www.soinside.com 2019 - 2024. All rights reserved.