Я следовал подходу Active Shape Models, описанному Тимом Кутсом в учебник и оригинальный документ. Пока все шло хорошо (анализ прокруста, анализ главных компонент, предварительная обработка изображений (контраст, шум)). Только сама процедура подгонки кажется не сходящейся.
Я использую статистическую модель подхода структуры серого уровня, как описано в учебник (стр. 13) для создания функции подгонки для каждого из 8 резцов, для каждого из 40 ориентиров (таким образом, всего создается 320 различных функций подгонки) для каждого резца путем выборки 5 (=k
) точки с обеих сторон вдоль профиля, нормального к границе, через каждый из 40 ориентиров для каждого из 8 резцов. Эти функции равны расстоянию Махаланобиса (учебник а> стр. 14).
Во время процедуры подбора я отбираю 10 (=m>k
) точек с каждой стороны вдоль профиля, перпендикулярного границе, через каждый из 40 ориентиров текущего приближения зуба. Таким образом, я должен оценить 2(m-k)+1
выборки с помощью соответствующей функции подбора. Каждый из этих образцов содержит значение градиента 2k+1
точек. Выбирается образец, который минимизирует функцию, и соответствующий ориентир располагается в средней точке этих 2k+1
точек. Это делается для каждого из 40 ориентиров. Это приводит к новой (еще не подтвержденной) аппроксимации зуба.
Это приближение в системе координат изображения выравнивается с моделью зуба в системе координат изображения. Затем рассчитываются коэффициенты (bi
) анализа главных компонентов и проверяются, |bi|<3*sqrt(eigenvalue_i)
ли они, чтобы не слишком сильно отклоняться от формы модели. Коэффициенты (bi
) при необходимости ограничиваются, и мы возвращаемся к системе координат изображения и начинаем новую итерацию.
Показывает изображение, на котором мы хотим найти левый верхний резец.
Показывает градиентное изображение с аппроксимацией зуба в системе координат изображения на итерации 19. (Красный: до проверки - Зеленый: после проверки) Как видно, мы немного отклонились от оптимального решения.
def create_gradient(img):
temp = cv2.Scharr(img, ddepth=-1, dx=1, dy=0)
return cv2.Scharr(temp, ddepth=-1, dx=0, dy=1)
Показывает аппроксимацию зуба в системе координат модели на итерации 19. (Синий: модель - Красный: до проверки - Зеленый: после проверки) Как видно, мы все еще близки к форме модели.
Показывает аппроксимацию зуба в системе координат модели за 19 итераций. (Синий: модель - Красный: до проверки - Зеленый: после проверки) Как видно, мы остаемся близкими к форме модели на протяжении всех этих итераций.
Таким образом, мы остаемся близкими к форме (защищенной анализом главных компонентов), но не близко к поведению интенсивности (защищаемому функцией подгонки) вокруг ориентиров.