【问题标题】:Binarized bitmap not saving binarized in C#二进制位图未在 C# 中保存二进制化
【发布时间】:2012-09-19 14:22:44
【问题描述】:

范围:

我正在尝试“二值化”(仅转换为两种颜色)可以找到 here 的图像。二值化输出必须遵循以下逻辑:字符将被绘制为“颜色 X”,而其他所有内容都将被绘制为“颜色 Y”。

理想情况下 X 是白色,Y 是黑色(但 X 和 Y 并不重要)。

观察:

经过一些观察,我发现这些字符不是“黄色调”、“白色调”或“黑色调”。 使用下面的代码,我应该能够识别所有这些“色调”(颜色通道阈值)并将其转换为一种颜色,并将其余部分转换为另一种颜色。

代码示例:

// 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");

问题:

运行此代码后,保存的输出(位图)实际上具有超过我在代码中定义的两种颜色(在此示例中,字符为“橙色”,其他颜色为“兰花”)。

一旦我使用 Windows 资源管理器 / Gimp / ImageProcessingLab “放大”,就会出现橙色的“色调”和兰花的“色调”。

我在这里缺少什么?如果只使用“两种”颜色而不是“色调”来设置像素颜色,为什么输出不二值化?

我上传了一些图片以方便您的检查工作。

输入位图:

输出位图:

【问题讨论】:

  • 可以上传原始的.bmp 还是未压缩的.png?您上传的图片全是 jpeg 伪影,因此无法分辨。
  • @japreiss 上传了原始图片。 “未压缩”是什么意思? webrequest 给了我一个“jpg”,这是一个问题,我将它保存为一个“位图”吗?
  • JPG 文件被压缩。 en.wikipedia.org/wiki/JPEG
  • @AntonSizikov 俄语维基百科 :) 谢谢,我只是在开玩笑
  • 是的,已修复。谷歌的第一行是俄语:)

标签: c# image-processing


【解决方案1】:

更改保存位置:

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

您的代码显然只设置了两种颜色,所以我看到的唯一可能是源图像是 JPG,并且在保存时会保留这种格式。

【讨论】:

  • 最后一个问题,那些图像在“内存”中的情况如何?它们是二值化的,对吧?只有在“JPEG”转换之后他们才会搞砸,对吗?
  • 是的!在您保存之前,框架会推迟进行 JPG 压缩。
猜你喜欢
  • 1970-01-01
  • 2015-08-02
  • 2014-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-21
  • 2016-07-27
  • 1970-01-01
相关资源
最近更新 更多