Я пытаюсь оптимизировать подгонку математически определенной функции к изображению, которое, как я знаю, содержит похожую структуру. Есть ли общеизвестный способ вычисления остатков для подгонки функции к изображению?
Я использую 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()
Я ожидаю, что решение приблизится к сильному совпадению, но я получаю совпадения, которые даже не содержатся в пределах моей матрицы. Я подозреваю, что это потому, что моя стратегия расчета остатков в этом контексте совершенно неверна!
Мое решение состояло в том, чтобы использовать выпуклую весовую функцию для вычисления невязок (например, параболы) и выполнить евклидово преобразование расстояния на скелетонизированной версии исходного изображения. Поэтому моей целью было минимизировать сумму квадратов невязок, что было достаточно эффективно при подгонке формы к изображению.
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()
Это дало довольно неплохие результаты!