逐像素二维辐射校准

Pixelwise 2D Radiometric Calibration

我有 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] 然后应用 polyfit 来获取每个像素的参数, 有没有办法将 X(i,3) 和 Y(i,3) 馈送到 polyfit 或类似的东西以获得相同的结果但更快?

谢谢 本

如果您的目标是矢量化 polyfit 那么是的,这可以完成,但需要手动重写 np.polyfit。幸运的是,它可以建立在 np.linalg.lstsq and the polynomial design matrix provided by 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 图像重塑为扁平版本,适合并转换回来。