Есть ли способ расчета остатков при попытке сопоставить функцию с изображением в Python? - PullRequest
1 голос
/ 17 апреля 2019

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

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

.определила следующую функцию, которую я передаю в 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()

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

1 Ответ

0 голосов
/ 18 апреля 2019

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

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()

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

...