我有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或类似的东西以得到相同的结果但更快?
谢谢 本
答案 0 :(得分:0)
如果您的目标是对polyfit进行矢量化处理,则可以,但是可以手动重写np.polyfit
。幸运的是,它可以建立在np.linalg.lstsq
和design 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图像重塑为展平的版本,并重新安装。