0

範囲:

ここにある画像を「2値化」(2色のみに変換)しようとしています。2値化された出力は、次のロジックに従う必要があります。文字は「カラーX」としてペイントされ、その他はすべて「カラーY」としてペイントされます。

理想的には、Xは白、Yは黒です(ただし、XとYは実際には重要ではありません)。

観察:

いくつか観察したところ、キャラクターは「イエロートーン」、「ホワイトトーン」、「ブラックトーン」のいずれかであることがわかりました。コードBellowを使用すると、これらすべての「トーン」(カラーチャネルのしきい値処理)を認識して1つの色に変換し、残り全体を別の色に変換できるはずです。

コードサンプル:

// My Own Web Requests Class. You can use C# 
WebRequests wr = new WebRequests();  

Native One
Bitmap bmp;
string url = "http://www.fazenda.rj.gov.br/projetoCPS/codigoImagem";

bmp = wr.GetBitmap(url);
bmp.Save(@"captcha.bmp");

for (int i = 0; i < bmp.Width; i++)
{
    for (int j = 0; j < bmp.Height; j++)
    {
        Color pixel = bmp.GetPixel(i, j);
        byte R, G, B;

        // Fetching RGB Values
        R = pixel.R;
        G = pixel.G;
        B = pixel.B;

        // Converting Black tones 
        if ((R < Color.Black.R + 110)
            && (G < Color.Black.G + 110)
            && (B < Color.Black.B + 110))
        {
            bmp.SetPixel(i, j, Color.Orange);
            continue;
        }

        // Converting Yellow tones
        if ((R > Color.Yellow.R - 110)
                && (G > Color.Yellow.G - 110)
                && (B < Color.Yellow.B + 110))
        {
            bmp.SetPixel(i, j, Color.Orange);
            continue;
        }

        // Converting White tones
        if ((R > Color.White.R - 110)
            && (G > Color.White.G - 110)
            && (B > Color.White.B - 110))
        {
            bmp.SetPixel(i, j, Color.Orange);
            continue;
        }

        bmp.SetPixel(i, j, Color.Orchid);
    }
}

bmp.Save(@"FilteredCaptcha.bmp");

問題:

このコードを実行した後、保存された出力(ビットマップ)には、実際にはコードで定義した2色以上が含まれています(このサンプルでは、​​文字の場合は「オレンジ」、その他すべての場合は「蘭」です)。

Windows Explorer / Gimp / ImageProcessingLabを使用して「ズームイン」すると、オレンジの「トーン」と蘭の「トーン」があります。

ここで何が欠けていますか?ピクセルの色を設定するために「トーン」ではなく「2」色のみを使用している場合、出力が2値化されないのはなぜですか?

検査作業を簡単にするために、いくつかの画像をアップロードしました。

入力ビットマップ:

入力ビットマップ

出力ビットマップ:

出力ビットマップ

4

1 に答える 1

1

保存場所を次の場所に変更します。

bmp.Save(@"c:\temp\FilteredCaptcha.bmp", System.Drawing.Imaging.ImageFormat.Bmp);

あなたのコードは明らかに2色しか設定していないので、私が見る唯一の可能性は、ソース画像がJPGであり、保存時にこの形式が事前に保存されていることです。

于 2012-09-19T14:42:50.320 に答える