【问题标题】:Matlab Least Square for calibration RGB用于校准 RGB 的 Matlab 最小二乘法
【发布时间】:2012-06-12 18:32:32
【问题描述】:

我解释了我的问题两次,因为我的英语不好:/

先解释一下:

在我拍摄的一些图像中,我有每个像素的 RGB 矩阵。

此外,我有 3 个像素的 RGB,我知道它们的真实值(在我拍照后,像素的 RGB 值会因为光线而改变)。

如何使用这 3 个已知的 RGB 来使用最小二乘法,以便准确地获得原始图像颜色?

第二次解释:

我必须用我的相机拍一些苹果的照片。 如果我在我的房间和街上拍摄相同的苹果,我会得到与苹果颜色不同的图像,尽管它们是相同的苹果。这是因为街上的灯不是我房间里的灯。

为了解决这个问题,我想在苹果附近放置三个我知道它们 RGB 的圆圈(红色、绿色和蓝色)。例如,我有 3 个圈子:

红圈 -> [241 25 13]

绿色圆圈 -> [12 239 41]

蓝色圆圈 -> [35 28 237]

现在,我将用 3 个圆圈拍摄苹果。我知道我的 3 个圆圈的 RGB 发生了变化:

现在红圈是 [229 42 32]

绿色圆圈 -> [24 241 42]

蓝色圆圈 -> [29 26 230]

现在,有了这些信息(3 个圆圈的输入和输出 RGB),我想修复所有图像(苹果和 3 个圆圈)的颜色。

所以我的输入是:

(三个圆圈的初始RGB,我拍摄后这些圆圈的RGB)

并且输出必须是一个函数:(R,G,B) -> (new R, new G, new B)。

所以函数必须修复图片中的所有RGB,

对于我之前的例子:

红圈[229 42 32]会改成他原来的[241 25 13]

绿色圆圈 [24 241 42] -> [12 239 41]

蓝色圆圈[29 26 230] -> [35 28 237]

所以,如果我拍摄并得到一个 RGB 为 [142, 124, 211] 的苹果,我想用他的 RGB 运行函数并得到这个苹果的真实颜色。

有人告诉我,我可以使用最小二乘法。

【问题讨论】:

  • 我感觉没有人完全理解您的要求。我的建议是忘记任何特定方法(如最小二乘法)并解释您的输入和所需的输出。
  • @ChrisA,好的,我再试一次.. 我正在更新我的主题。请稍候:]

标签: matlab colors rgb least-squares


【解决方案1】:

你可以这样做:

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 也仍然有效,猜猜它用什么来解决它?有效最小二乘。

【讨论】:

  • 谢谢你,我试过你告诉我的,但我没有得到真正的 RGB 圆圈:>> A = Out / In A = 1.0599 -0.0602 0.0253 -0.0761 0.9960 0.0187 -0.0883 -0.0026 1.0419 A * 输出 = 254.2603 -0.6238 41.4164 6.7981 237.9027 29.6665 -7.8105 41.0234 243.7578 这不是“输入”。
  • 我认为你应用它错误。 A * In 会给你Out。这肯定有效。
  • 对不起,我太累了,你说得对!谢谢!我想尝试其他用户的更多想法,以便选择最好的想法。
猜你喜欢
  • 2023-04-04
  • 1970-01-01
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-20
相关资源
最近更新 更多