我正在使用本文来解决验证码。它的工作原理是使用AForge从图像中去除背景,然后将Tesseract OCR应用于生成的清洁图像。
问题是,它当前依赖于字母为黑色,并且由于每个验证码具有不同的文本颜色,因此我需要将颜色传递给图像清洁器,或者将字母的颜色更改为黑色。要执行上述任一操作,我需要知道字母的现有颜色是什么。
如何识别字母的颜色?
使用@Robert Harvey提供的答案,我去开发了相同的代码,使用LockBits
和unsafe
方法来提高其速度。您必须在“允许不安全代码”标记上进行编译。请注意,从图像返回的像素顺序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);
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句