範囲:
ここにある画像を「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値化されないのはなぜですか?
検査作業を簡単にするために、いくつかの画像をアップロードしました。
入力ビットマップ:
出力ビットマップ: