0

我需要对包含 18% 灰卡的图像进行色彩平衡。用户将此图像加载到应用程序中,然后单击灰卡。从这里开始,我需要一种算法来平衡图像的颜色。我发现一些文章提到了做矩阵变换,我试过了,但没有成功(图像被洗掉或变成一种颜色或另一种颜色)。我现在的代码是:

        int sampleSize = 20;  // The square around the user's click on the gray card
        int rVal = 0, gVal = 0, bVal = 0;
        int count = 0;
        for (int x = 0; x < sampleSize - 1; x++)
        {
            for (int y = 0; y < sampleSize - 1; y++)
            {
                System.Drawing.Color c = grayCardArea.GetPixel(x, y);
                if (c.R > 0)
                {
                    rVal += c.R;
                    gVal += c.G;
                    bVal += c.B;
                    rs.Add(c.R);
                    count++;
                }
            }
        }
        grayCardGraphics.Dispose();

        int rAvg = 0, gAvg = 0, bAvg = 0;
        rAvg = (int)Math.Round((decimal)rVal / (count));
        gAvg = (int)Math.Round((decimal)gVal / (count));
        bAvg = (int)Math.Round((decimal)bVal / (count));

        // 117 is a value I found online for the neutral gray color of the gray card
        float rDiff = (117 / (float)rAvg);
        float gDiff = (117 / (float)gAvg);
        float bDiff = (117 / (float)bAvg);

        float[][] ptsArray = 
            { 
            new float[] {rDiff, 0, 0, 0, 0},
            new float[] {0, gDiff, 0, 0, 0},
            new float[] {0, 0, bDiff, 0, 0},
            new float[] {0, 0, 0, 1, 0},
            new float[] {0, 0, 0, .0f, 1}
            };
        // Create a ColorMatrix
        ColorMatrix clrMatrix = new ColorMatrix(ptsArray);

        // Create ImageAttributes
        ImageAttributes imgAttribs = new ImageAttributes();
        // Set color matrix
        imgAttribs.SetColorMatrix(clrMatrix, ColorMatrixFlag.Default, ColorAdjustType.Default);
        // Draw image with ImageAttributes
        outputImageGraphics.DrawImage(srcImage, new System.Drawing.Rectangle(0, 0, srcImage.Width, srcImage.Height),
            0, 0, srcImage.Width, srcImage.Height,
            GraphicsUnit.Pixel, imgAttribs);

查看 outputImage 的保存副本会显示图像的奇怪转换。

任何帮助是极大的赞赏!

4

2 回答 2

2

我的公司 Atalasoft 有一个免费的 .NET Imaging SDK,它带有一个名为 LevelsCommand 的类,我认为它可以满足您的需求。

http://atalasoft.com/photofree

代码类似于

AtalaImage img = new AtalaImage("filename");
LevelsCommand cmd = new LevelsCommand(/* ... */ ); //  need to pass in leveling colors
img = cmd.Apply(img).Image;
img.Save("filename-new", new PngEncoder(), null); // or could be new JpegEncoder() or something else

您应该在文件名上使用适当的扩展名来指示格式。

于 2010-10-12T18:33:14.470 回答
1

您的第一个假设似乎是图像首先正确曝光,并且将灰卡读取为 117、117、117 将解决问题。我的建议是不要管曝光,只调整偏色。您可能会发现不同的颜色模型很有用——例如,HSL。灰卡的饱和度应始终为零。

或者,我有一个示例灰色目标读数为 71、72、60。这有点温暖。有理由认为,更正确的读数是 67、67、67 或 (R+G+B)/3。因为图像有点曝光不足,我就这样保留了它,但在不改变图像密度的情况下实现了真正的中性。

我希望这能为您获得正确的颜色提供一些帮助。

于 2010-10-12T18:41:23.907 回答