Процедура подбора активных моделей формы не сходится с функцией подбора статистической модели
Я следовал подходу 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 итераций. (Синий: модель - Красный: перед проверкой - Зеленый: после проверки) Как видно, мы остаемся близкими к форме модели на протяжении всех этих итераций
Таким образом, мы остаемся близко к форме (защищенной анализом главных компонентов), но не близко к поведению интенсивности (защищенному функцией подгонки) вокруг ориентиров.
1 ответ
Градиентное изображение неверно или лучше не имеет смысла, потому что мне нужно взять производную по нормали профиля вместо того, чтобы брать производную в горизонтальном и вертикальном направлении.