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 など、別のカラー モデルが役立つ場合があります。グレー カードの彩度は常に 0 にする必要があります。

別の例として、71、72、60 を示す灰色のターゲットがあります。これは少し暖色です。より正確な読み取り値が 67、67、67 または (R+G+B)/3 であることは理にかなっています。画像が少し露出不足なので、そのままにしておきましたが、画像の濃度を変更せずに真のニュートラルを達成しました.

これが、色を正しくするための道のりに役立つことを願っています.

于 2010-10-12T18:41:23.907 に答える