Как исправить недостаток линейной подгонки - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь использовать функцию linalg.lstsq от numpy, чтобы подогнать 2D-полином к большому изображению. Я генерирую 2D матрицу Вандермонда, используя polynomial.polynomial.polyvander2d и точки X / Y каждого пикселя в изображении, а затем вставляю это в lstsq с данными изображения. Когда я делаю это для большого количества пикселей, ранг, возвращаемый lstsq, меньше ожидаемого ранга матрицы, и подгонка возвращает странные результаты. Для полиномов со степенью выше 2 выходной сигнал выглядит ровно по всему изображению, и ничто не указывает на то, что он пытается сопоставить данные.

Я попытался применить метод к меньшему фрагменту изображения (200x400 пикселей) и получить правильный результат из этого. Мое лучшее предположение состоит в том, что когда я использую полное изображение (~ 250 000 пикселей), матрица 9x250 000 выглядит недостаточно качественно для компьютера, хотя это не должно быть. Я также попробовал нелинейный оптимизатор, такой как scipy.optimizer, и иногда получаю результаты, но только после долгого времени, и мне приходится тратить много усилий, чтобы правильно угадать параметры.

Вот код, который я использовал:

# Get the image we will fit
fitting_image = masked_images[0][200:400,100:500]

# Get the y values and determine the mask we will use
y = np.log(np.abs(fitting_image.ravel()))
mask_indices = y.mask == False
y = np.array(y[mask_indices])

# Create the grid we will use
M, N = np.mgrid[:fitting_image.shape[0], :fitting_image.shape[1]]
mm = M.ravel()[mask_indices]
nn = N.ravel()[mask_indices]

# Get the Vandermonde matrix
A = np.polynomial.polynomial.polyvander2d(mm, nn, [deg, deg])

# Perform the linear fit
x, _, rank, _ = np.linalg.lstsq(A, y, rcond=None)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...