如何识别这些图像中字母的颜色?

How can I identify the color of the letters in these images?

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

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

我该如何识别字母的颜色?

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

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;
}

使用 by @Robert Harvey♦ I went and developed the same code using LockBitsunsafe方法来提高它的速度。您必须在打开 "Allow unsafe code" 标志的情况下进行编译。请注意,从图像返回的像素顺序是 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);
    }
}