我在用本文 https://code.msdn.microsoft.com/windowsdesktop/Solving-Captcha-with-C-dadf37cd解决验证码问题。它的工作原理是使用 AForge 从图像中删除背景,然后将 Tesseract OCR 应用于生成的清理后的图像。
问题是,它目前依赖于黑色的字母,并且由于每个验证码都有不同的文本颜色,我需要将颜色传递给图像清洁器,或者将字母的颜色更改为黑色。为了执行任一操作,我需要知道字母的现有颜色是什么。
我该如何识别字母的颜色?
使用answer https://stackoverflow.com/a/41838692/4631427作者:@Robert Harvey 我使用以下方法开发了相同的代码LockBits https://msdn.microsoft.com/query/dev12.query?appId=Dev12IDEF1&l=EN-US&k=k(System.Drawing.Bitmap.LockBits); and unsafe
提高其速度的方法。您必须在打开“允许不安全代码”标志的情况下进行编译。请注意,从图像返回的像素顺序位于bgr
not 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);
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)