尝试将函数与 python 中的图像匹配时,有没有办法计算残差?
Is there a way to calculate residuals when trying to match a function to an image in python?
我正在尝试优化数学定义的函数与我知道包含类似结构的图像的拟合。有没有一种众所周知的方法来计算函数对图像的拟合残差?
我正在使用 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()
我希望解决方案收敛到强拟合,但我得到的拟合甚至不包含在我的矩阵范围内。我怀疑这是因为我计算残差的策略在这种情况下是完全错误的!
我的解决方案是使用凸加权函数来计算残差(如抛物线)并对原始图像的骨架化版本执行欧几里德距离变换。因此,我的 objective 是最小化残差平方和,这对于使形状适合图像非常有效。
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()
这给出了一些相当不错的结果!
我正在尝试优化数学定义的函数与我知道包含类似结构的图像的拟合。有没有一种众所周知的方法来计算函数对图像的拟合残差?
我正在使用 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()
我希望解决方案收敛到强拟合,但我得到的拟合甚至不包含在我的矩阵范围内。我怀疑这是因为我计算残差的策略在这种情况下是完全错误的!
我的解决方案是使用凸加权函数来计算残差(如抛物线)并对原始图像的骨架化版本执行欧几里德距离变换。因此,我的 objective 是最小化残差平方和,这对于使形状适合图像非常有效。
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()
这给出了一些相当不错的结果!