【问题标题】:How can I identify the color of the letters in these images?如何识别这些图像中字母的颜色?
【发布时间】:2017-06-03 13:15:00
【问题描述】:

我正在使用this article 来解决验证码问题。它的工作原理是使用 AForge 从图像中移除背景,然后将 Tesseract OCR 应用于生成的清洁图像。

问题是,它目前依赖于黑色字母,并且由于每个验证码都有不同的文本颜色,我需要将颜色传递给图像清洁器,或者将字母的颜色更改为黑色。做任何一个,我需要知道字母的现有颜色是什么。

如何识别字母的颜色?

【问题讨论】:

  • 并非万无一失,但您的字母看起来都是相同的颜色;它们可能是图片中最常见的颜色。您可以将顶部颜色变为黑色,检查结果,如果失败,请尝试下一个或两个。
  • 嗯,AForge 有检测斑点的功能,所以您可以使用这些功能来获取字母斑点并从那里计算颜色。
  • 注意: 如果您想下载 MSDN 项目并尝试一下,请确保将其解压缩到文件夹名称中没有 # 字符的文件夹,如# 将导致构建失败。
  • 您可以间接检测颜色的唯一方法(因为如果您知道字母的颜色,您就会知道字母本身)。我的第一反应是将其转换为灰度,然后处理两次:一次是原始灰度,一次是灰度反转,如果初始尝试失败。
  • 恕我直言,如果您尝试创建 Minimal, Complete, and Verifiable example,我可以为您提供更好的帮助,我坚信 代码清晰和简洁跨度>

标签: c# captcha tesseract aforge


【解决方案1】:

这个特定问题的解决方案被证明是相对简单的。我所要做的就是获取图像左侧中间边缘像素的颜色,向右扫描像素直到颜色发生变化,这就是第一个字母的颜色。

public Color GetTextColor(Bitmap bitmap)
{
    var y = bitmap.Height/2;
    var startingColor = bitmap.GetPixel(0, y);

    for (int x = 1; x < bitmap.Width; x++)
    {
        var thisColor = bitmap.GetPixel(x, y);
        if (thisColor != startingColor)
            return thisColor;
    }
    return null;
}

【讨论】:

  • 如果您要使用 LockBits 处理大量图像并且不安全的方法可能是要走的路
【解决方案2】:

使用@Robert Harvey 的answer,我使用LockBitsunsafe 方法开发了相同的代码以提高它的速度。您必须使用“允许不安全代码”标志进行编译。请注意,从图像返回的像素顺序是bgr 而不是rgb 格式,我使用Format24bppRgb 格式锁定位图,强制它使用每种颜色3 个字节。

public unsafe Color GetTextColour(Bitmap bitmap)
{
    BitmapData bitmapData = bitmap.LockBits(new Rectangle(0, 0, bitmap.Width, bitmap.Height), ImageLockMode.ReadOnly, PixelFormat.Format24bppRgb);
    try
    {
        const int bytesPerPixel = 3;
        const int red = 2;
        const int green = 1;

        int halfHeight = bitmap.Height / 2;

        byte* row = (byte*)_bitmapData.Scan0 + (halfHeight * _bitmapData.Stride);

        Color startingColour = Color.FromArgb(row[red], row[green], row[0]);
        for (int wi = bytesPerPixel, wc = _bitmapData.Width * bytesPerPixel; wi < wc; wi += bytesPerPixel)
        {
            Color thisColour = Color.FromArgb(row[wi + red], row[wi + green], row[wi]);
            if (thisColour != startingColour)
            {
                return thisColour;
            }
        }

        return Color.Empty; //Or some other default value
    }
    finally
    {
        bitmap.UnlockBits(bitmapData);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-21
    • 1970-01-01
    • 2014-08-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多