我正在尝试优化数学上定义的函数对我知道包含相似结构的图像的拟合度。是否有一种众所周知的方法来计算残差以使函数适合图像?
我正在使用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()
我希望解决方案能够收敛到很强的拟合度,但是我得到的拟合度甚至不包含在矩阵的范围内。我怀疑这是因为在这种情况下我计算残差的策略是完全错误的!
最佳答案
我的解决方案是使用凸加权函数来计算残差(如抛物线),然后对原始图像的骨架化版本执行欧几里德距离变换。因此,我的目标是使残差平方的总和最小,这对于将形状适合图像非常有效。
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()
这给出了一些相当不错的结果!