逐像素二维辐射校准
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 图像重塑为扁平版本,适合并转换回来。
我有 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 图像重塑为扁平版本,适合并转换回来。