2017-01-19 26 views
3

Я использую this article, чтобы решить капчу. Он работает, удаляя фон с изображения с помощью AForge, а затем применяя Tesseract OCR к полученному очищенному изображению.Как определить цвет букв на этих изображениях?

Проблема заключается в том, что в настоящее время она основана на черных чернах, и поскольку каждый штрих имеет другой цвет текста, мне нужно либо передать цвет очистителю изображения, либо изменить цвет букв на черный. Чтобы сделать это, мне нужно знать, что такое существующий цвет букв.

Как я могу определить цвет букв?

Image with letters in it

Image with letters in it

+0

Не прочный, но ваши письма выглядят одинаково; они * вероятно * либо верхний, либо самый верхний наиболее часто встречающийся цвет на картинке. Вы можете просто повернуть верхний цвет черный, проверить результаты, и если он не сработает, попробуйте следующий один или два. – BradleyDotNET

+0

Ну, у AForge есть функции для обнаружения blob, поэтому вы, вероятно, можете просто использовать их, чтобы получить капли письма и рассчитать цвет оттуда. – Abion47

+0

** ПРИМЕЧАНИЕ. ** Если вы хотите загрузить проект MSDN и попробовать его, убедитесь, что вы разархивируете его в папку без символа '#' в имени папки, так как это '#' приведет к сбою сборки , –

ответ

3

Использование answer по @Robert Харви ♦ Я пошел и разработал один и тот же код, используя 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); 
    } 
} 
2

Решение этой конкретной задачи оказалось относительно просто. Все, что мне нужно было сделать, это получить цвет краевого пикселя на полпути вниз по левой стороне изображения, сканировать пиксели вправо до тех пор, пока цвет не изменится, и это цвет первой буквы.

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

Если вы собираетесь обрабатывать множество изображений с помощью LockBits и небезопасные методы, вероятно, это путь – TheLethalCoder

 Смежные вопросы

  • Нет связанных вопросов^_^