10

ドキュメントを JPG 画像にスキャンしています。スキャナは、すべてのページをカラーとして、またはすべてのページを白黒としてスキャンする必要があります。私のページの多くはカラーなので、すべてのページをカラーとしてスキャンする必要があります。スキャンが完了したら、.Net で画像を調べて、どの画像が白黒かを検出して、それらの画像をグレースケールに変換してストレージに保存できるようにしたいと考えています。

.Netでグレースケール画像を検出する方法を知っている人はいますか?

私にお知らせください。

4

6 に答える 6

14

このためのライブラリが見つからない場合は、画像の多数 (またはすべて) のピクセルを取得して、r、g、および b の値が特定のしきい値内にあるかどうかを確認できます (これは経験的に設定できます)。 、または設定として持っている) 互いに。そうであれば、画像はグレースケールです。

ただし、テストのしきい値を0より少し大きくすることは間違いありません...たとえば、r = gをテストしませんが、(abs(rg) < e) eはしきい値です。そうすれば、偽色陽性を抑えることができます...元の画像とスキャン技術が正確なグレースケールを提供しない限り、そうでなければまともな数が得られると思います.

于 2009-12-09T22:37:37.527 に答える
6

色をテストする単純なアルゴリズム: ネストされた for ループ (幅と高さ) で画像をピクセルごとに移動し、ピクセルの RGB 値が等しいかどうかをテストします。そうでない場合、画像には色情報があります。この状態に遭遇せずにすべてのピクセルを通過すると、グレースケールの画像になります。

より複雑なアルゴリズムによるリビジョン:

この投稿の最初のリビジョンでは、各ピクセルの RGB 値が等しい場合にピクセルがグレースケールであると仮定する単純なアルゴリズムを提案しました。したがって、0,0,0 または 128,128,128 または 230,230,230 の RGB はすべてグレーとしてテストされますが、123,90,78 はテストされません。単純。

グレーからの差異をテストするコードのスニペットを次に示します。2 つの方法は、より複雑なプロセスの小さなサブセクションですが、元の質問を解決するのに十分な未加工のコードを提供する必要があります。

/// <summary>
/// This function accepts a bitmap and then performs a delta
/// comparison on all the pixels to find the highest delta
/// color in the image. This calculation only works for images
/// which have a field of similar color and some grayscale or
/// near-grayscale outlines. The result ought to be that the
/// calculated color is a sample of the "field". From this we
/// can infer which color in the image actualy represents a
/// contiguous field in which we're interested.
/// See the documentation of GetRgbDelta for more information.
/// </summary>
/// <param name="bmp">A bitmap for sampling</param>
/// <returns>The highest delta color</returns>
public static Color CalculateColorKey(Bitmap bmp)
{
    Color keyColor = Color.Empty;
    int highestRgbDelta = 0;

    for (int x = 0; x < bmp.Width; x++)
    {
        for (int y = 0; y < bmp.Height; y++)
        {
            if (GetRgbDelta(bmp.GetPixel(x, y)) <= highestRgbDelta) continue;

            highestRgbDelta = GetRgbDelta(bmp.GetPixel(x, y));
            keyColor = bmp.GetPixel(x, y);
        }
    }

    return keyColor;
}

/// <summary>
/// Utility method that encapsulates the RGB Delta calculation:
/// delta = abs(R-G) + abs(G-B) + abs(B-R) 
/// So, between the color RGB(50,100,50) and RGB(128,128,128)
/// The first would be the higher delta with a value of 100 as compared
/// to the secong color which, being grayscale, would have a delta of 0
/// </summary>
/// <param name="color">The color for which to calculate the delta</param>
/// <returns>An integer in the range 0 to 510 indicating the difference
/// in the RGB values that comprise the color</returns>
private static int GetRgbDelta(Color color)
{
    return
        Math.Abs(color.R - color.G) +
        Math.Abs(color.G - color.B) +
        Math.Abs(color.B - color.R);
}
于 2009-12-09T22:36:43.187 に答える
0

JPEG はメタデータをサポートしているため、まず、スキャナー ソフトウェアが保存された画像に特別なデータを配置しているかどうか、およびその情報を信頼できるかどうかを確認する必要があります。

于 2009-12-09T22:47:35.210 に答える