2012-03-28 7 views
1

Ich habe eine OCR-basierte iPhone-App, die Graustufenbilder aufnimmt und sie auf Schwarz-Weiß setzt, um den Text zu finden (mit opencv). Dies funktioniert gut für Bilder mit schwarzem Text auf weißem Hintergrund. Ich habe ein Problem mit der automatischen Umschaltung auf einen inversen Schwellenwert, wenn das Bild weißer Text auf schwarzem Hintergrund ist. Gibt es einen weit verbreiteten Algorithmus, um das Bild zu überprüfen, ob es heller Text auf dunklem Hintergrund ist oder umgekehrt? Kann jemand eine saubere Arbeitsweise empfehlen? Denken Sie daran, ich arbeite nur mit dem Graustufenbild von der iPhone-Kamera.Methode zum Überprüfen von Bildpixelintensitäten

Vielen Dank.

+1

Vergleichen Sie den Prozentsatz der Pixel, die weiß sind, mit dem Prozentsatz, der schwarz ist. –

+0

Ich verwende ein Graustufenbild, daher konnte ich reines Schwarz nicht mit reinem Weiß vergleichen. Ich habe meine Lösung unten gepostet. –

Antwort

1

Da ich mit einem Graustufen-IplImage an dieser Stelle zu tun habe, konnte ich nicht Zähle schwarze oder weiße Pixel, musste aber die Anzahl der Pixel über einem bestimmten "Helligkeits" -Schwellenwert zählen. Ich habe nur die Randpixel verwendet, da dies weniger teuer ist und mir immer noch genug Informationen gibt, um eine fundierte Entscheidung zu treffen.

IplImage *image; 
int sum = 0; // Number of light pixels 
int threshold = 135; // Light/Dark intensity threshold 

/* Count number of light pixels at border of image. Must convert to unsigned char type to make range 0-255. */ 
// Check every other pixel of top and bottom 
for (int i=0; i<(image->width); i+=2) { 
    if ((unsigned char)image->imageData[i] >= threshold) { // Check top 
     sum++; 
    } 
    if ((unsigned char)image->imageData[(image->width)*(image->height) 
         - image->width + i] >= threshold) { // Check bottom 
     sum++; 
    } 
} 

//Check every other pixel of left and right Sides 
for (int i=0; i<(image->height); i+=2) { 
    if ((unsigned char)image->imageData[i*(image->width)] >= threshold) { // Check left 
     sum++; 
    } 
    if ((unsigned char)image->imageData[i*(image->width) + (image->width) - 1] >= threshold) { // Check right 
     sum++; 
    } 
} 

// If more than half of the border pixels are light, use inverse threshold to find dark characters 
if (sum > ((image->width/2) + (image->height/2))) { 
    // Use inverse binary threshold because background is light 
} 
else { 
    // Use standard binary threshold because background is dark 
} 
+0

Sie verwenden immer noch einen festen Schwellenwert, der Probleme bei der Beleuchtung oder der Belichtung verursacht. –

+0

Nein, dies ist nur um festzustellen, ob es ein heller oder dunkler Hintergrund ist. Die eigentliche binäre Schwellenwertbildung erfolgt in einem separaten Verfahren, das die Otsu-Methode für die adaptive binäre Schwellenwertbildung implementiert. –

+0

Was ist "Bild" hier? nicht ein UIImage erscheint es ....? – xaphod

0

Ich würde über jedes Pixel gehen und prüfen, ob es hell oder dunkel ist. Wenn die Anzahl der dunklen Pixel größer als die der hellen Pixel ist, müssen Sie das Bild invertieren.

hier Suchen Sie nach, wie die Helligkeit bestimmt: Detect black pixel in image iOS

Und das ist, wie ein UIImage invertiert ziehen:

[imyImage drawInRect:theImageRect blendMode:kCGBlendModeDifference alpha:1.0];