将胶片负RGB转换为正RGB的算法

时间:2015-11-19 00:49:34

标签: c++ colors photo data-conversion

假设我将摄影胶片负片扫描为RGB图像,我试图找到一种将颜色值转换为RGB正片的算法。

由于橙色偏差(http://photo.net/learn/orange-negative-mask),如果我简单地说redPositive = 255 - redNegative我得到一个具有强烈青色色调的最终图像,并且非常褪色。这意味着这里给出的答案:Convert negative image to positive NOT 正确。

那么我将如何制作以下例程:

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

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

1 个答案:

答案 0 :(得分: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色彩空间。