2017-01-19 2 views
3

Ich verwende this article, um Captchas zu lösen. Dazu wird der Hintergrund mit AForge aus dem Bild entfernt und dann Tesseract OCR auf das resultierende gereinigte Bild angewendet.Wie kann ich die Farbe der Buchstaben in diesen Bildern erkennen?

Das Problem ist, es beruht derzeit darauf, dass die Buchstaben schwarz sind, und da jedes Captcha eine andere Textfarbe hat, muss ich entweder die Farbe an den Bildreiniger übergeben oder die Farbe der Buchstaben in Schwarz ändern. Um beides zu tun, muss ich wissen, welche Farbe die Buchstaben haben.

Wie kann ich die Farbe der Buchstaben identifizieren?

Image with letters in it

Image with letters in it

+0

Nicht narrensicher, aber Ihre Buchstaben sehen alle gleichfarbig aus; sie sind * wahrscheinlich * entweder die oberste oder nächsthäufigste Farbe auf dem Bild. Sie könnten einfach die oberste Farbe schwarz, überprüfen Sie die Ergebnisse, und wenn es versagt, versuchen Sie die nächsten ein oder zwei. – BradleyDotNET

+0

Nun, AForge hat Funktionen für die Erkennung von Blobs, also können Sie wahrscheinlich einfach diese verwenden, um die Buchstabenblobs zu erhalten und die Farbe von dort zu berechnen. – Abion47

+0

** HINWEIS: ** Wenn Sie das MSDN-Projekt herunterladen und ausprobieren möchten, stellen Sie sicher, dass Sie es in einen Ordner ohne ein '#' -Zeichen im Ordnernamen entpacken, da '#' das Fehlschlagen des Builds verursacht . –

Antwort

3

die answer von @ Robert Harvey Mit ♦ Ich ging hin und entwickeln den gleichen Code LockBits und unsafe Methoden unter Verwendung ihrer Geschwindigkeit zu verbessern. Sie müssen mit dem Flag "Unsicheren Code zulassen" kompilieren. Beachten Sie, dass die Reihenfolge der vom Bild zurückgegebenen Pixel im Format bgr nicht rgb ist und ich die Bitmap mit einem Format von Format24bppRgb sperre, um die Verwendung von 3 Bytes pro Farbe zu erzwingen.

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

Die Lösung für dieses spezielle Problem erwies sich als relativ einfach zu sein. Ich musste lediglich die Farbe des Randpixels auf der linken Seite des Bilds auf halber Höhe ablesen, die Pixel nach rechts scannen, bis sich die Farbe ändert, und das ist die Farbe des ersten Buchstabens.

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

Wenn Sie eine Menge Bilder mit LockBits und unsicheren Methoden verarbeiten, ist das wahrscheinlich der richtige Weg – TheLethalCoder

Verwandte Themen