如何识别这些图像中字母的颜色?
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 LockBits
和unsafe
方法来提高它的速度。您必须在打开 "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);
}
}
我正在使用 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;
}
使用LockBits
和unsafe
方法来提高它的速度。您必须在打开 "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);
}
}