- •1. Программные системы и методы 3D-реконструкции биомедицинских данных
- •1.1. Обзор программных комплексов
- •1.2. Обзор основных подходов
- •1.2.1. Структуры визуализируемых объёмов
- •1.2.2. Сегментация и идентификация объектов
- •1.2.3. Построение поверхностей объектов
- •2. Модели, методы и алгоритмы, положенные в основу сегментации и поиска объектов
- •2.1. Формальная постановка задачи и основные этапы её решения
- •2.2. Сегментация данных компьютерной томографии и электронной микроскопии
- •2.3. Повышение производительности вычислений в методе k-средних
- •2.4. Метод иерархической декомпозиции сегментов
- •2.5. Морфологическая фильтрация сегментов
- •2.6. Построение признакового описания сегмента
- •2.7. Поиск объектов методом динамического программирования
- •3. Описание реализации программной системы
- •3.1. Основные классы, структуры и методы
- •3.2. Организация пользовательского интерфейса
- •Заключение
- •Список литературы
- •Приложение А. Примеры результатов сегментации и идентификации объектов
- •Приложение Б. Классы, реализующие семейство методов k-средних
- •Приложение В. Исходные коды базовых компонентов программной системы
- •В.1. Основные классы и структуры для хранения и обработки данных
- •В.2. Методы вычисления атрибутов сегментов
- •В.3. Поиск объектов по найденным сегментам
Атрибут |
Сегмент |
1 |
2 |
3 |
4 |
5 |
6 |
||||
|
|||||||||||
|
|
|
|
|
|
|
|||||
σµ |
|
20,24844 |
17,37826 |
16,08445 |
19,82426 |
15,96458 |
19,40351 |
||||
|
|
|
|
|
|
194,6601 |
135,9651 |
372,8344 |
191,6271 |
322,7703 |
240,3212 |
|
|
X |
|
||||||||
|
|
|
|
148,1209 |
193,6672 |
175,7595 |
215,9873 |
212,5199 |
197,9635 |
||
Y |
|
||||||||||
σX |
|
22,80069 |
9,215522 |
14,38029 |
8,863125 |
14,8409 |
15,1472 |
||||
σY |
|
23,27569 |
22,37212 |
22,13141 |
8,447703 |
8,518236 |
20,58224 |
2.7. Поиск объектов методом динамического программирования
Если все исходные данные в совокупности рассматриваются как 3D-облако точек, то результатом их сегментации является разбиение исходного множества вокселов на подмножества, соответствующие различным искомым объектам. В этом случае для решения исходной задачи реконструкции остаётся построить сетку (полигональную поверхность) для каждого такого подмножества и визуализировать её одним из известных методов.
Однако в том случае , когда применяется 2D-сегментация каждого слоя данных по отдельности, для идентификации объектов необходимо различить, какие сегменты на разных слоях относятся к одному и тому же или разным объектам. После этого для каждого объекта можно построить множество точек, состоящее из соответствующих сегментов. Рассмотрим более детально метод, позволяющий решить данную проблему.
С помощью дескрипторов, которые ставятся в соответствие сегментам по формулам (2.6.1 – 2.6.5), можно определить степень рассогласования между сегментами s1 и s2 как евклидову норму разности их дескрипторов d (s1 ) и d (s2 ):
n |
|
f (s1, s2 )= ∑(di (s1 )− di (s2 ))2 , |
(2.7.1) |
i=1
где:
n – количество рассматриваемых атрибутов сегмента, di – значение i - ого атрибута.
Но поскольку дескриптор сегмента образуют атрибуты, имеющие разные единицы измерения (объём, плотность, координаты центра масс и др.), лучше всего для подсчёта рассогласования между ними использовать частный случай расстояния Махаланобиса [59, 60], в котором квадрат разности между значениями каждого рассматриваемого атрибута сегментов нормируется на величину дисперсии этого атрибута:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
n |
(d |
i |
(s )− d |
i |
(s |
2 |
))2 |
|
|
|
|
f (s1, s2 )= ∑ |
|
1 |
|
|
|
, |
(2.7.2) |
|||||
|
|
|
2 |
|
|
|
|
|||||
|
i=1 |
|
|
|
σi |
|
|
|
|
|
|
|
где σi – среднеквадратическое отклонение i - ого атрибута. 30
Предположим, что каждый из атрибутов сегмента имеет равномерное распределение в диапазоне принимаемых им значений. Тогда, используя расчётную формулу для дисперсии случайной величины ξ , равномерно распределённой на отрезке [a; b], и учитывая то, что усреднённая сумма равномерных, одинаково распределённых случайных величин также распределена равномерно, причём на том же самом отрезке, можно оценить среднеквадратическое отклонение каждого из атрибутов следующим образом:
σ |
|
= |
|
|
|
(S)− min d |
|
2 |
(2.7.3) |
|
|
max d |
(S) |
12 |
|||||||
|
i |
|
|
S T |
i |
S T |
i |
|
|
|
Искомые объекты могут как однородными (серое вещество), так и с меняющейся текстурой (например, кости) [2]. При этом объект может иметь разрывы на некоторых слоях. Последние 2 случая, как правило, невозможно распознать без дополнительной априорной информации, поэтому далее будем руководствоваться следующими предположениями:
•каждый объект состоит только из сегментов, расположенных на следующих друг за другом слоях; другими словами, фрагменты одного и того же объекта не могут быть расположены на двух слоях, между которыми такие фрагменты отсутствуют;
•при переходе с одного слоя на другой резких отличий между сегментами, образующими один и тот же объект, не наблюдается, то есть, разница между дескрипторами таких сегментов по используемой метрике минимальна;
•каждый сегмент может принадлежать только одному объекту.
Определение. Последовательность сегментов на соседних слоях (sik0 , sik0 +1 , ... , sik0 +K −1 ),
где ij индекс сегмента на j - м слое, k0 – начальный слой, а K – количество слоёв, назовём соответствием между данными сегментами.
Таким образом, задача идентификации объектов сводится к поиску всевозможных соответствий между сегментами, расположенными на разных слоях исходных данных. Поиск таких соответствий можно рассматривать как многошаговый динамический процесс, в котором каждый момент времени определяется номером соответствующего слоя данных, состояниями являются сегменты, распределённые по слоям, а управлениями – переходы с сегментов текущего слоя на соседний. Следует отметить, что множество финальных состояний совпадает с множеством всех предварительно найденных 2D-сегментов, поскольку объект может начинаться и заканчиваться на любом слое исходных данных.
В процессе поиска соответствий рассматриваются сегменты самого верхнего уровня детализации, то есть листья иерархической структуры, описанной в разделе 2.4. Все сегменты делятся на занятые (те, которые уже включены в одно из найденных
31
соответствий) и свободные. В самом начале работы алгоритма все сегменты помечаются как свободные. Как только сегмент оказался включён в какое-либо соответствие, он получает статус «занят». Поиск очередного соответствия начинается с первого свободного сегмента на слое с наименьшим индексом. Для того чтобы не рассматривать слишком маленькие и/или большие детали, полученные в результате иерархической декомпозиции сегментов, можно ввести ограничения на их объём V , который должен принадлежать диапазону [Vmin ;Vmax ].
Определим стоимость перехода с текущего слоя на соседний как рассогласование между дескрипторами соответствующих сегментов (состояний), то значение функции f (s1, s2 ), вычисляемой по формуле (2.7.2),
где s1 – сегмент текущего слоя, а s2 |
– сегмент соседнего слоя. |
|
Тогда критерием качества найденного соответствия можно считать суммарное |
||
рассогласование между всеми соседними сегментами, образующими соответствие: |
||
k |
+K −2 |
|
F = |
0 ∑ f (sik , sik +1 ) |
(2.7.4) |
|
k =k0 |
|
Таким образом, поиск соответствий между сегментами сводится к решению задачи минимизации функции F при перемещении от начального слоя к конечному по соответствующим сегментам (рис. 12).
Сегмент 1 |
Сегмент 1 |
Сегмент 2 |
Сегмент 2 |
Сегмент k2 Сегмент kN
Начальный слой данных
Рис. 12. Схема поиска соответствий между 2D-сегментами
Поскольку функция F аддитивна по промежутку слоёв, на которых расположены сегменты, и удовлетворяет принципу Беллмана в форме достаточного условия [61], для решения рассматриваемой задачи можно применить алгоритм пошаговой минимизации этой функции, основанный на методе рекуррентных соотношений Беллмана [61, 62, 63].
32
Приведём более подробное описание данного алгоритма применительно к рассматриваемой задаче, используя следующие обозначения:
-s – массив сегментов,
-IsSegmentUsed – булевы переменные (флаги) использования сегментов,
-layer_index – индекс текущего слоя данных (служебная переменная),
-Disparity – текущее значение минимальной стоимости переходов по соответствию,
-N – общее количество слоёв исходных данных.
Шаг 1. Полагаем для всех сегментов IsSegmentUsed = false.
Шаг 2. В цикле по I от 0 до N-1 и по сегментам s[I][J], принадлежащим слою I, если
IsSegmentUsed[I][J] == false, выполняем Шаг 3 – Шаг 5. Шаг 3. Полагаем layer_index = I, Disparity = 0.
Шаг 4. Создаём новое соответствие и добавляем в него сегмент с индексом J на слое layer_index.
Шаг 5. Пока layer_index<N, выполняем Шаг 6 – Шаг 10. После этого переходим на Шаг 2. Шаг 6. В цикле по K по сегментам слоя layer_index + 1 выбираем тот, объём которого принадлежит заданному диапазону [Vmin ;Vmax ] и который доставляет минимум величины
Disparity + F(s[layer_index][J], s[layer_index+1][K]). Обозначим его за L.
Шаг 7. Добавляем сегмент с индексом L в созданное соответствие.
Шаг 8. Полагаем Disparity = Disparity + F(s[layer_index][J], s[layer_index+1][L]). Шаг 9. IsSegmentUsed[layer_index+1][L] = true.
Шаг 10. Увеличиваем layer_index на 1 и переходим на Шаг 5.
Конец алгоритма
Заметим, что на Шаге 2 приведённого алгоритма обход сегментов может быть инициирован не с начального, а с некоего промежуточного слоя данных, и в этом случае результат поиска соответствий по вышеописанному алгоритму будет совсем другим. При этом обход сегментов будет осуществляться в обе стороны – вперёд и назад. Кроме того, может варьироваться выбор очередного сегмента для формирования нового соответствия. Возможные варианты такого выбора остались за пределами текущего рассмотрения.
33