Используя LabelShapeStatisticFilter, я могу правильно извлечь ориентированные области интереса из исходного изображения. Я хочу построить эти ориентированные ограничивающие рамки над исходным изображением.
Когда я пытаюсь просмотреть вывод метода GetOrientedBoundingBoxVertices(), мне непонятно, в какой системе координат определены эти вершины. Похоже, они не находятся в исходной системе координат изображения.
Я уверен, что использую класс LabelShapeStatisticFilter по назначению (см. ниже), следуя этому замечательному блокноту: 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() ориентированные точки ограничивающей рамки в исходном пространстве изображения выглядят некорректно (shape_stats.OrientedBoundingBoxVertices() в исходном индексном пространстве):
ОБНОВЛЕНИЕ 2
Используя shape_stats.GetCentroid(), я могу правильно получить реальные координаты центроидов каждой метки и правильно их изобразить:
Также кажется, что вывод shape_stats.GetOrientedBoundingBoxOrigin() правдоподобен в реальных координатах. Один элемент shape_stats.OrientedBoundingBoxVertices() соответствует shape_stats.GetOrientedBoundingBoxOrigin().





Вершины определяются в физических пространствах, а не в пространстве индексов. Возможно, вам придется использовать TransformPhysicslPointToIndex класса Image.
SimpleITK использует индексы i, j, k, но numpy использует индексы k, j, i. Это преобразование было сделано?
Да, конверсия прошла. Я могу правильно изобразить другие достопримечательности реального мира. Я добавлю больше изображений, но, похоже, shape_stats.GetOrientedBoundingBoxOrigin(), который предоставляет одну вершину, находится в правильном месте.
Я могу правильно отображать другие точки интереса реального мира, созданные с помощью LabelShapeStatisticsFilter (см. график центроидов в обновлении 2). Похоже, что shape_stats.GetOrientedBoundingBoxOrigin(), который предоставляет одну вершину, правдоподобно находится в мировых координатах (см. обновление 2).
Я думаю, что понял это: ориентированные вершины ограничивающей рамки не находятся ни полностью в координатах исходного изображения, ни в координатах ограничивающей рамки.
Происхождение ориентированной ограничивающей рамки, возвращаемой shape_stats.GetOrientedBoundingBoxOrigin(), находится в мировых координатах исходного изображения. Это начало также соответствует одной вершине ориентированного ограничивающего прямоугольника.
Каждая вершина ориентированной ограничивающей рамки, возвращаемая shape_stats.OrientedBoundingBoxVertices(), может быть восстановлена в реальных координатах путем поворота вокруг начала координат с помощью shape_stats.GetOrientedBoundingBoxDirection().
Я не знаю, было ли это представление вершин преднамеренным, но поначалу оно меня сбивало с толку (хотя я относительный новичок в ситке).
Это похоже на ошибку для меня. Пожалуйста, сообщите об этом в ITK GitHub Issues: github.com/InsightSoftwareConsortium/ITK/issues
Из какого изображения следует вызывать TransformPhysicalPointToIndex? Вершины, похоже, не определены в реальных координатах исходного изображения.