【问题标题】:How to do color balancing using a gray card in C#如何在 C# 中使用灰卡进行色彩平衡
【发布时间】:2010-10-12 18:01:16
【问题描述】:

我需要对包含 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 的保存副本会显示图像的奇怪转换。

非常感谢任何帮助!

【问题讨论】:

  • 这些是经过伽马校正的图像吗?如果是这样,您需要考虑到这一点。

标签: c# photo imaging


【解决方案1】:

我的公司 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

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

【讨论】:

    【解决方案2】:

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

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

    我希望这能为您正确选择颜色提供一些帮助。

    【讨论】:

      猜你喜欢
      • 2015-05-23
      • 2014-11-26
      • 1970-01-01
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 2019-01-17
      • 2020-06-07
      • 1970-01-01
      相关资源
      最近更新 更多