我解释了我的问题两次因为我的英语不好:/
首先解释:
我拍摄的某些图像中的每个像素都有RGB矩阵。
此外,我有3个像素的RGB,我知道它们的实际值(在我拍照后,像素的RGB值因光而改变)。
如何使用这3种已知的RGB才能使用最小二乘法,这样才能准确地获得原始图像颜色?
第二个解释:
我必须用相机拍一些苹果的照片。 如果我在我的房间和街道上拍摄相同的苹果,我会得到与苹果颜色不同的图像,尽管这些苹果是相同的。这是因为街上的灯光不是我房间里的灯光。
为了解决这个问题,我想在苹果附近放置三个我知道RGB的圆圈(红色,绿色和蓝色)。例如,我有3个圈子:
红圈 - > [241 25 13]
绿色圆圈 - > [12 239 41]
蓝色圆圈 - > [35 28 237]
现在,我将用三个圆圈拍摄苹果。我知道我的3个圆圈的RGB发生了变化:
现在红圈是[229 42 32]
绿色圆圈 - > [24 241 42]
蓝色圆圈 - > [29 26 230]
现在,有了这些信息(3个圆圈的输入和输出RGB),我想修复所有图像的颜色(苹果和3个圆圈)。
所以我的输入是:
(三个圆圈的初始RGB,我拍摄后这些圆圈的RGB)
并且输出必须是函数:(R,G,B) - > (新R,新G,新B)。
因此该函数必须修复图片中的所有RGB,
我以前的例子:
红色圆圈[229 42 32]将改为原来的[241 25 13]
绿色圆圈[24 241 42] - > [12 239 41]
蓝色圆圈[29 26 230] - > [35 28 237]
所以,如果我拍摄并获得一个带有[142,124,211] RGB的苹果,我想用他的RGB运行该功能并获得这个苹果的真实颜色。
有人告诉我,我可以使用最小二乘法。答案 0 :(得分:4)
你可以这样做:
In = [ 229 24 29
42 241 26
32 42 230 ];
Out = [ 241 12 35
25 239 28
13 41 237 ];
然后计算:
A = Out / In;
A
将是从输入颜色到所需输出颜色的所需线性转换。这只是一个模型,你可以决定这是否是一个特别好的颜色。我确信在色彩校准方面有很多工作,但我没有声称知道这一点。
另请注意/
不是正常的划分。它基本上是Out * inv(In)
的Matlab重载。它实际上比这更多。有关详细信息,请参阅help mrdivide
。
然后,要应用新的线性变换,请将A
应用于彩色图像。对于给定的输入像素inrbg = [ R ; G ; B ];
,您将计算
outrgb = A * inrgb;
你可以将它应用于整个图像。
不幸的是,你会得到一些超出允许强度范围的值,你必须把它们放回去。这是另一个迹象,纯粹的线性模型不一定是伟大的。至少这会让你有个好的开始。
还有一件事,我上面写的并没有明确使用最小二乘法,但是如果你对颜色输入和输出有更多的估计,比如
>> InN = [In randn(size(In))+In]; % just an example to get more columns, don't use this
>> InN
InN =
229.0000 24.0000 29.0000 228.2382 25.2329 28.9302
42.0000 241.0000 26.0000 41.3748 240.6159 26.5301
32.0000 42.0000 230.0000 32.2829 42.0552 229.3372
>> OutN = [Out randn(size(Out))+Out]; % just an example to get more columns, don't use this
>> OutN
OutN =
241.0000 12.0000 35.0000 241.1487 10.8441 33.8811
25.0000 239.0000 28.0000 25.3679 240.0666 27.0684
13.0000 41.0000 237.0000 12.1927 41.2091 236.9066
然后这个A = OutN / InN
仍然可以工作并猜测它用于解决它的用途?有效的最小二乘。