逐像素2D辐射校准

时间:2018-12-12 15:04:44

标签: python numpy opencv camera-calibration

我有3张图片,带有适用的均值滤镜。 仅在盖上盖子的情况下拍摄噪声图像。 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] 然后应用polyfit获取每个像素的参数, 有没有一种方法可以将X(i,3)和Y(i,3)馈入polyfit或类似的东西以得到相同的结果但更快?

谢谢 本

1 个答案:

答案 0 :(得分:0)

如果您的目标是对polyfit进行矢量化处理,则可以,但是可以手动重写np.polyfit。幸运的是,它可以建立在np.linalg.lstsqdesign matrix提供的多项式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的尺寸,因此您必须将2d图像重塑为展平的版本,并重新安装。