1

我正在尝试创建一个关于非线性回归的程序。我有三个参数 [R,G,B],我想获得图像上任何像素相对于我的参考颜色代码的温度。例如:

参考文件 R,G,B,温度 = [(157,158,19,300),(146,55,18,320),(136,57,22,340),(133,88,25,460),(141,105,27,500),(210,195, 3,580),(203,186,10,580),(214,195,4,600),(193,176,10,580)]

你可以在上面看到,所有的 RGB 值都是非线性变化的。现在,我使用“最小误差算法”来获得温度 wrt RGB 颜色代码,但我想获得参考文件中不存在的值(即如果我有 (155,200,40) 并且它不存在于参考文件中,我必须获得这三个代码等于哪个温度)。

以下是在给定 RGB 值的情况下选择最接近参考温度的代码:

from math import sqrt

referenceColoursRGB =[(157,158,19),
(146,55,18),
(136,57,22),
(133,88,25),
(141,105,27),
(203,186,10),
(214,195,4)]


referenceTemperatures = [
300,
320,
340,
460,
500,
580,
600]

def closest_color(rgb):
    r, g, b = rgb
    color_diffs = []
    counter = 0
    for color in referenceColoursRGB:
        cr, cg, cb = color
        color_diff = sqrt(abs(r - cr)**2 + abs(g - cg)**2 + abs(b - cb)**2)
        color_diffs.append((color_diff, color))
        minErrorIndex =color_diffs.index(min(color_diffs))
    return minErrorIndex

temperatureLocation = closest_color((149, 60, 25))
print("Temperature : ", referenceTemperatures[temperatureLocation])
# => Temperature :  320

temperatureLocation = closest_color((220, 145, 4))
print("Temperature : ", referenceTemperatures[temperatureLocation])

# => Temperature :  580

我真的很想计算参考列表中没有出现的温度值,但是我在使用所有 RGB 值并从中计算/预测合理/准确的温度时遇到问题。

在使用 polyfit 之后,我尝试获取 1 个参数,但存在一些问题,因为每个变量对这个参数都有相同的影响。因此我无法意识到哪个颜色代码最高(即 "oneParameter = 1000 *R + 100 *G + 10 *B" ,在这种情况下,如果我有一个颜色代码为 (2,20,50) 的参数,另一个颜色代码是(2,5,200)。因此它们在“oneParameter”方程中是相等的)

我希望我能清楚地解释我的问题。我在等你的帮助!

谢谢你。

4

2 回答 2

0

注意:我不能保证这个预测的物理准确性,但这可能与您正在寻找的内容相符。即,这使得预测与您的参考数据完全匹配,但我不知道温度预测对于非参考 RGB 颜色可能有多准确。如果我知道从 RGB 到温度的映射的确切物理特性,我会使用它。

坏模型 1

进行非线性回归的一种简单方法是对数据进行预处理,以便为回归提供非线性项。sklearn具有内置的预处理功能,通过生成原始输入数据的幂和交互来执行此操作。

referenceColoursRGB =[(157,158,19),
(146,55,18),
(136,57,22),
(133,88,25),
(141,105,27),
(203,186,10),
(214,195,4)]

referenceTemperatures = [
300,
320,
340,
460,
500,
580,
600]

from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=2)
poly_RGB = poly.fit_transform(referenceColoursRGB)

ols = linear_model.LinearRegression()
ols.fit(poly_RGB, referenceTemperatures)

ols.predict(poly_RGB)
# array([300., 320., 340., 460., 500., 580., 600.])

要进行非参考 RGB 预测,您可以执行以下操作:

ols.predict(poly.transform([(149, 60, 25)]))
# array([369.68980598])

ols.predict(poly.transform([(220, 145, 4)]))
# array([949.34548347])

编辑:坏模型 2

因此,在我选择简单的东西来实现非线性拟合之前,PolynomialFeatures无需考虑 RGB 传感器上可能发生的任何真实物理现象。您可以决定它是否适合您的需求。好吧,这是另一个使用 RGB比率的模型,而不考虑正在发生的任何物理现象。同样,您可以决定此模型是否合适。

rat_RGB = [(r, g, b, r/g, r/b, g/r, g/b, b/r, b/g) for r,g,b in referenceColoursRGB]
rat_ols = linear_model.LinearRegression()
rat_ols.fit(rat_RGB, referenceTemperatures)
rat_ols.predict(rat_RGB)
# array([300., 320., 340., 460., 500., 580., 600.])

您可以看到该模型也可以完美地拟合参考数据。值得注意的是,其他示例预测使用此模型会产生不同的温度,这很有趣,并且可能很重要。

rat_ols.predict([(r, g, b, r/g, r/b, g/r, g/b, b/r, b/g) for r,g,b in [(149, 60, 25)]])
# array([481.79424789])

rat_ols.predict([(r, g, b, r/g, r/b, g/r, g/b, b/r, b/g) for r,g,b in [(220, 145, 4)]])
# array([653.06116368])

我希望你能找到/开发一个基于物理的 RGB/temp 模型。我想知道您的 RGB 传感器的制造商是否有一些可能有所帮助的规格和/或工程说明。

于 2021-09-17T03:27:05.880 回答
0
from math import sqrt

referenceColoursRGB =[(157,158,19),
(146,55,18),
(136,57,22),
(133,88,25),
(141,105,27),
(203,186,10),
(214,195,4)]


referenceTemperatures = [
300,
320,
340,
460,
500,
580,
600]

def closest_color(rgb):
    r, g, b = rgb
    color_diffs = []
    counter = 0
    for color in referenceColoursRGB:
        cr, cg, cb = color
        color_diff = sqrt(abs(r - cr)**2 + abs(g - cg)**2 + abs(b - cb)**2)
        color_diffs.append((color_diff, color))
        minErrorIndex =color_diffs.index(min(color_diffs))
    return minErrorIndex

temperatureLocation = closest_color((149, 60, 25))
print("Temperature : ", referenceTemperatures[temperatureLocation])
# => Temperature :  320

temperatureLocation = closest_color((220, 145, 4))
print("Temperature : ", referenceTemperatures[temperatureLocation])

# => Temperature :  580
于 2021-09-16T10:52:28.043 回答