SimpleITK OrientedBoundingBoxVertices - 在什么坐标系中定义顶点?

SimpleITK OrientedBoundingBoxVertices - in what coordinate system are the vertices defined?

使用 LabelShapeStatisticFilter,我可以从原始图像中正确提取感兴趣的定向区域。我想在原始图像上绘制那些定向边界框。

当我尝试查看 GetOrientedBoundingBoxVertices() 方法的输出时,我不清楚这些顶点是在哪个坐标系中定义的。它们似乎不在原始图像坐标系中。

我相信我正在按预期使用 LabelShapeStatisticFilter class(见下文),遵循这个出色的笔记本:http://insightsoftwareconsortium.github.io/SimpleITK-Notebooks/Python_html/35_Segmentation_Shape_Analysis.html

bacteria_labels = shape_stats.GetLabels()
bacteria_volumes = [shape_stats.GetPhysicalSize(label) for label in bacteria_labels] 
num_images = 5 # number of bacteria images we want to display

bacteria_labels_volume_sorted = [label for _,label in sorted(zip(bacteria_volumes, bacteria_labels))]

resampler = sitk.ResampleImageFilter()
aligned_image_spacing = [10,10,10] #in nanometers

for label in bacteria_labels_volume_sorted[0:num_images]:
    aligned_image_size = [ int(ceil(shape_stats.GetOrientedBoundingBoxSize(label)[i]/aligned_image_spacing[i])) for i in range(3) ]
    direction_mat = shape_stats.GetOrientedBoundingBoxDirection(label)
    aligned_image_direction = [direction_mat[0], direction_mat[3], direction_mat[6], 
                               direction_mat[1], direction_mat[4], direction_mat[7],
                               direction_mat[2], direction_mat[5], direction_mat[8] ] 
    resampler.SetOutputDirection(aligned_image_direction)
    resampler.SetOutputOrigin(shape_stats.GetOrientedBoundingBoxOrigin(label))
    resampler.SetOutputSpacing(aligned_image_spacing)
    resampler.SetSize(aligned_image_size)

    obb_img = resampler.Execute(img)
    # Change the image axes order so that we have a nice display.
    obb_img = sitk.PermuteAxes(obb_img,[2,1,0])
    gui.MultiImageDisplay(image_list = [obb_img],                   
                          title_list = ["OBB_{0}".format(label)])

我希望能够在原始图像上绘制这些边界框,但我不确定如何。

更新

也许这样更能说明我的意思。重采样定向边界框,按预期输出:

然而,在使用 original_label_image.TransformPhysicalPointToContinousIndex() 之后,原始图像 space 中的定向边界框点显示不正确(shape_stats.OrientedBoundingBoxVertices() 在原始索引 space 中) :

更新 2

使用 shape_stats.GetCentroid(),我可以正确获取每个标签质心的真实世界坐标并正确绘制它们:

shape_stats.GetOrientedBoundingBoxOrigin() 的输出似乎也符合真实世界的坐标。 shape_stats.OrientedBoundingBoxVertices() 的一个元素对应于 shape_stats.GetOrientedBoundingBoxOrigin()。

顶点是在物理 space 中定义的,而不是在索引 space 中定义的。您可能需要使用图像 class 的 TransformPhysicslPointToIndex。

我想我已经明白了:定向边界框顶点既不完全在原始图像坐标中,也不完全在边界框坐标中。

shape_stats.GetOrientedBoundingBoxOrigin() 返回的定向边界框的原点位于原始图像世界坐标中。该原点也对应于定向边界框的一个顶点。

shape_stats.OrientedBoundingBoxVertices() 返回的定向边界框的每个顶点都可以通过使用 shape_stats.GetOrientedBoundingBoxDirection() 绕原点旋转在真实世界坐标中恢复。

我不知道这种顶点表示是否是故意的,但一开始让我感到困惑(尽管我是 sitk 的新手)。