У меня есть двоичная маска, которая возникла из кусочно-гладкой кривой.Каждый нижележащий сегмент кривой является гладким, но связи между сегментами могут быть или не быть гладкими.Маска зашумлена, поэтому может содержать несколько пикселей вокруг базовой кривой.На рисунке ниже показан пример такого ввода:
Я хочу оценить соответствие базовой кривой, учитывая этот вход без каких-либо предварительных знаний, который сможет обеспечитькак гладкие, так и негладкие соединения.
Я работаю в python, поэтому я попробовал несколько доступных там методов, таких как полиномиальное соответствие numpy, сглаживание сплайна scipy и непараметрическая регрессия pyqt-fit, но не смог получить желаемый результат.Вот пример кода:
from imageio import imread
import random
import numpy as np
from scipy.interpolate import UnivariateSpline
import pyqt_fit.nonparam_regression as smooth
from pyqt_fit import npr_methods
from matplotlib import pyplot as plt
mask = imread(r'C:\mask.bmp')
ys, xs = np.where(mask)
# add tiny noise and sort - silly way to comply to UnivariateSpline's requirement of "x must be strictly increasing"
xs = np.array([x + random.random() * 1e-4 for x in xs])
sorter = np.argsort(xs)
xs = xs[sorter]
ys = ys[sorter]
# polynomial fit
p = np.poly1d(np.polyfit(xs, ys, 5))
# spline smoothing
spl = UnivariateSpline(xs, ys, k=3, s=1e9)
# non-parameteric regression
k = smooth.NonParamRegression(xs, ys, method=npr_methods.LocalPolynomialKernel(q=3))
k.fit()
plt.figure()
plt.imshow(mask, cmap='gray')
linexs = np.array(range(mask.shape[1]))
plt.plot(linexs, k(linexs), 'y', lw=1)
plt.plot(linexs, spl(linexs), 'g', lw=1)
plt.plot(linexs, p(linexs), 'b', lw=1)
plt.show()
Для параметров, показанных в этом примере, оба эти подбора не способны захватить негладкое соединение слева, а также обеспечивают хорошее соответствие для "хвоста"справа:
Ожидаемые результаты должны вести себя как красная кривая на изображении ниже, где я ожидаю, что кривая в местоположении 1 будет негладкой, а в местоположении 2 -быть гладким
Я был бы рад получить ссылку на подходящий алгоритм.Если есть также реализация Python, это было бы плюсом.