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

我正在使用这篇文章来解决validation码。 它的工作原理是使用AForge从图像中删除背景,然后将Tesseract OCR应用于生成的清洁图像。

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

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

图像与字母在它

图像与字母在它

使用@Robert Harvey的答案 ♦我使用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); } } 

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

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