Есть ли способ расчета остатков при попытке сопоставить функцию с изображением в Python?

1

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

Я использую scipy.minimize.optimize чтобы попытаться подогнать кривую к изображению. Моя стратегия состоит в том, чтобы измерить, насколько хорошо моя особенность, которая сегментирована в матрице B ниже, соответствует моей функции f, минимизируя среднее евклидово расстояние между B и f.

Я определил следующую функцию, которую я scipy.optimize.minimize в scipy.optimize.minimize:

# x is a tuple of arguments passed to f
# f is the function I am trying to fit to B, which returns a matrix of 0s and 1s
# B is the image I am trying to fit to, whose voxel values are 0 or 1

from scipy.ndimage.morphology import distance_transform_edt
def objective(x, f, B):
    f_matrix = f(*x)
    f_matrix_edt = distance_transform_edt(f_matrix)
    residuals = B * f_matrix_edt
    return residuals.sum()

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

Теги:
image-processing
numerical-analysis

1 ответ

0

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

from scipy.ndimage.morphology import distance_transform_edt
from skimage.morphology import skeletonize
def objective(x, f, B):
    f_matrix = f(*x)
    B_skeleton = skeletonize(B)
    B_edt = distance_transform_edt(B_skeleton)
    residuals = f_matrix * B_edt ** 2
    return residuals.sum()

Это дало довольно неплохие результаты!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню