范围:
我正在尝试“二值化”(仅转换为两种颜色)可以找到的图像here。二值化输出必须遵循以下逻辑:字符将被绘制为“颜色X”,其他所有内容将被绘制为“颜色Y”。
理想情况下,X是白色,Y是黑色(但X和Y并不重要)。
观察:
经过一些观察,我发现这些字符要么是“黄色调”,“白色调”还是“黑色调”。 使用代码Bellow,我应该能够识别并将所有这些“色调”(颜色通道阈值处理)转换为一种颜色,并将整个静止转换为另一种颜色。
代码示例:
// 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");
问题:
运行此代码后,保存的输出(Bitmap)实际上具有多于我在代码中定义的两种颜色(对于字符为“Orange”,对于其他所有颜色为“Orchid”,在此示例中)。
使用Windows资源管理器/ Gimp / ImageProcessingLab进行“放大”后,会出现橙色的“色调”和兰花的“色调”。
我在这里缺少什么?如果仅使用“两种”颜色而不是“色调”来设置像素颜色,为什么输出不会被二值化?
我上传了一些图片,让您的检查工作更轻松。
输入位图:
输出位图:
答案 0 :(得分:1)
更改保存位置:
bmp.Save(@"c:\temp\FilteredCaptcha.bmp", System.Drawing.Imaging.ImageFormat.Bmp);
您的代码显然只设置了两种颜色,因此我看到的唯一可能是源图像是JPG,并且在保存时会预先设置此格式。