逐像素二维辐射定标

2024-04-26 13:37:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我有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] 然后应用多边形拟合得到每个像素的参数, 有没有办法将X(i,3)和Y(i,3)输入polyfit或类似的东西,以获得相同的结果,但速度更快

谢谢 本


Tags: https图像numpy过滤器docs目标图片像素
1条回答
网友
1楼 · 发布于 2024-04-26 13:37:19

如果您的目标是矢量化polyfit,那么是的,这可以完成,但需要手动重写np.polyfit。幸运的是,它可以建立在^{}^{}提供的多项式design matrix之上。总之,例程如下所示:

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图像重塑为扁平版本,进行调整并转换回原来的版本

相关问题 更多 >