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 的新手)。
使用 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 的新手)。