将底片RGB转换为正片RGB的算法

4
假设我有一张以RGB格式扫描的底片负片,我正在寻找一种算法将颜色值转换为RGB正片。

由于存在橙色偏差(http://photo.net/learn/orange-negative-mask),如果我简单地说redPositive = 255 - redNegative,则最终图像会呈现强烈的青色色调,并且非常淡化。这意味着将负片图像转换为正片中给出的答案是不正确的

那么我该如何编写以下程序:

struct RGB
{
    unsigned byte red;
    unsigned byte green;
    unsigned byte blue;
};

void FilmNegativeToPositive(RGB const &negative, RGB &positive)
{
    // What goes here?
}

你能否提供一下负片的图片以及正确计算出来的正片是什么样子的呢?我担心仅仅在谷歌上搜索可能无法得到你正在处理的确切类型的负片。 - user3995702
取一张“黑色”图像(例如图片1之前的位 - 不是将胶片装入相机并暴露于光线下的白色部分,而是在拍摄1和您加载到胶卷滚轮中的引导器之间的黑色部分)。扫描它,测量其RGB值,并将其“添加”[或反转并“减去”,具体取决于您进行负转换的哪一侧]到现有值中。最好以16位精度扫描,因为在8位中,您很可能会失去约三分之一的位数。 - Mats Petersson
严格来说,问题不在于RGB转换。链接的答案在这个意义上是正确的,只是“255-value”。问题在于你的数据。 - deviantfan
1
我刚才扫描了一张空白的胶片,得到了R、G、B三个通道上的数值分别为200、150、100。因此,在反转之前,您可能需要尝试减去这些值。 - Mats Petersson
1个回答

1

我没有数据进行测试,但根据您提供的链接,负片是一种混合了不纯的青色、品红色和黄色染料的物质:

黄色染料层最为纯净。品红色染料层中有明显的黄色成分。青色染料层中同时含有明显的黄色和品红色成分。

因此,您需要做类似于以下未经测试的伪代码:

Let I_MY be the ratio of yellow impurity to pure magenta dye
Let I_CY be the ratio of yellow impurity to pure cyan dye
Let I_CM be the ratio of magenta impurity to pure cyan dye

Given R, G, B in [0, 255]
Convert to CMY:
  C = 1.0 - R/255.0
  M1 = 1.0 - G/255.0
  Y1 = 1.0 - B/255.0

Calculate the impurities in the cyan dye and remove them, since we assume no other dye has cyan impurities:
  M = M1 - I_CM×C
  Y2 = Y1 - I_CY×C

Now the amount of magenta dye is correct, so subtract its yellow impurity:
  Y = Y2 - I_MY×M

Convert the corrected CMY values back to RGB:
  R' = 255×(1.0-C)
  G' = 255×(1.0-M)
  B' = 255×(1.0-Y)

如果发现污染比预期更加复杂,那么你就需要解决一个线性代数问题:
[   1 I_MC I_YC]   [C']   [C]
[I_CM    1 I_YM] × [M'] = [M]
[I_CY I_MY    1]   [Y']   [Y]

如果您想解决C'、M'和Y',然后将其转换回RGB颜色空间。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接