Как оценить кусочно-гладкую посадку на шумную маску? - PullRequest
1 голос
/ 31 мая 2019

У меня есть двоичная маска, которая возникла из кусочно-гладкой кривой.Каждый нижележащий сегмент кривой является гладким, но связи между сегментами могут быть или не быть гладкими.Маска зашумлена, поэтому может содержать несколько пикселей вокруг базовой кривой.На рисунке ниже показан пример такого ввода:
input mask
Я хочу оценить соответствие базовой кривой, учитывая этот вход без каких-либо предварительных знаний, который сможет обеспечитькак гладкие, так и негладкие соединения.

Я работаю в 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()

Для параметров, показанных в этом примере, оба эти подбора не способны захватить негладкое соединение слева, а также обеспечивают хорошее соответствие для "хвоста"справа:
current results
Ожидаемые результаты должны вести себя как красная кривая на изображении ниже, где я ожидаю, что кривая в местоположении 1 будет негладкой, а в местоположении 2 -быть гладкимexpected results

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

...