Пиксельная 2D радиометрическая калибровка - PullRequest
0 голосов
/ 12 декабря 2018

У меня 3 изображения с примененным средним фильтром.I0 только изображение шума, снятого в кепке.На I20 снято изображение, которое показывает только целевое значение отражения 20%. I90 - изображение, показывающее только целевое значение отражения 90% для каждого пикселя.

Таким образом, вместо того, чтобы зацикливаться на каждом пикселе и использовать полиномиальное соответствие (https://docs.scipy.org/doc/numpy/reference/generated/numpy.polyfit.html)

, где X = [I0 (i), I20 (i), I90 (i)] и Y = [0,0.2,0.9], а затем применяя полифит, чтобы получить параметры для каждого пикселя, есть ли способ подать X (i, 3) и Y (i, 3) в полифит или что-то подобное, чтобы получить тот же результат, нобыстрее?

Спасибо, Бен

1 Ответ

0 голосов
/ 13 декабря 2018

Если вашей целью является векторизация полифита, то да, это можно сделать, но требует переписать np.polyfit вручную.К счастью, он может быть построен поверх np.linalg.lstsq и полиномиальной расчетной матрицы , предоставленной np.vander.В общем, процедура выглядит следующим образом:

import numpy as np

def fit_many(x, y, order=2):
    '''
        arguments:
            x: [N]
            y: [N x S]

        where:
            N - # of measurements per pixel
            S - # pixels

        returns [`order` x S]
    '''

    A = np.vander(x, N=order)
    return np.linalg.lstsq(A, y, rcond=None)[0]

И может использоваться, как показано ниже

# measurement x values. I suppose those are your reflectances?
x = np.array([0, 1, 2])

y = np.array([ # a row per pixel
    [-1, 0.2, 0.9],
    [-.9, 0.1, 1.2],
]).T


params = fit_many(x, y)

import matplotlib.pyplot as plt

poly1 = np.poly1d(params[:, 0])
poly2 = np.poly1d(params[:, 1])

plt.plot(x, y[:, 0], 'bo')
plt.plot(x, poly1(x), 'b-')
plt.plot(x, y[:, 1], 'ro')
plt.plot(x, poly2(x), 'r-')
plt.show()

Имейте в виду, np.linalg.lstsq не допускает размеры выше двух, так что вам придется преобразовать 2-мерное изображение в сплющенную версию, подогнать и преобразовать обратно.

...