SimpleITK OrientedBoundingBoxVertices — в какой системе координат определены вершины?

Используя 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)])

Я ожидаю, что смогу нарисовать эти ограничивающие рамки поверх исходного изображения, но я не уверен, как это сделать.

ОБНОВИТЬ

Возможно, это может лучше проиллюстрировать то, что я имею в виду. Ориентированная ограничительная рамка с повторной выборкой, вывод, как и ожидалось:

SimpleITK OrientedBoundingBoxVertices — в какой системе координат определены вершины?

Однако после использования original_label_image.TransformPhysicalPointToContinousIndex() ориентированные точки ограничивающей рамки в исходном пространстве изображения выглядят некорректно (shape_stats.OrientedBoundingBoxVertices() в исходном индексном пространстве):

SimpleITK OrientedBoundingBoxVertices — в какой системе координат определены вершины?

ОБНОВЛЕНИЕ 2

Используя shape_stats.GetCentroid(), я могу правильно получить реальные координаты центроидов каждой метки и правильно их изобразить:

SimpleITK OrientedBoundingBoxVertices — в какой системе координат определены вершины?

Также кажется, что вывод shape_stats.GetOrientedBoundingBoxOrigin() правдоподобен в реальных координатах. Один элемент shape_stats.OrientedBoundingBoxVertices() соответствует shape_stats.GetOrientedBoundingBoxOrigin().

SimpleITK OrientedBoundingBoxVertices — в какой системе координат определены вершины?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
389
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вершины определяются в физических пространствах, а не в пространстве индексов. Возможно, вам придется использовать TransformPhysicslPointToIndex класса Image.

Из какого изображения следует вызывать TransformPhysicalPointToIndex? Вершины, похоже, не определены в реальных координатах исходного изображения.

Kevin 25.07.2019 19:45

SimpleITK использует индексы i, j, k, но numpy использует индексы k, j, i. Это преобразование было сделано?

blowekamp 26.07.2019 08:32

Да, конверсия прошла. Я могу правильно изобразить другие достопримечательности реального мира. Я добавлю больше изображений, но, похоже, shape_stats.GetOrientedBoundingBoxOrigin(), который предоставляет одну вершину, находится в правильном месте.

Kevin 26.07.2019 14:49

Я могу правильно отображать другие точки интереса реального мира, созданные с помощью LabelShapeStatisticsFilter (см. график центроидов в обновлении 2). Похоже, что shape_stats.GetOrientedBoundingBoxOrigin(), который предоставляет одну вершину, правдоподобно находится в мировых координатах (см. обновление 2).

Kevin 26.07.2019 14:58
Ответ принят как подходящий

Я думаю, что понял это: ориентированные вершины ограничивающей рамки не находятся ни полностью в координатах исходного изображения, ни в координатах ограничивающей рамки.

Происхождение ориентированной ограничивающей рамки, возвращаемой shape_stats.GetOrientedBoundingBoxOrigin(), находится в мировых координатах исходного изображения. Это начало также соответствует одной вершине ориентированного ограничивающего прямоугольника.

Каждая вершина ориентированной ограничивающей рамки, возвращаемая shape_stats.OrientedBoundingBoxVertices(), может быть восстановлена ​​в реальных координатах путем поворота вокруг начала координат с помощью shape_stats.GetOrientedBoundingBoxDirection().

Я не знаю, было ли это представление вершин преднамеренным, но поначалу оно меня сбивало с толку (хотя я относительный новичок в ситке).

Это похоже на ошибку для меня. Пожалуйста, сообщите об этом в ITK GitHub Issues: github.com/InsightSoftwareConsortium/ITK/issues

blowekamp 30.07.2019 16:40

Другие вопросы по теме