2009-08-15 7 views
4

J'ai une image avec des lettres, les lettres sont en deux couleurs noir et bleu, je veux lire les lettres de couleur bleue de l'image.Traitement d'image en C# - Une solution intelligente?

Quelqu'un peut-il me suggérer une méthode pour le faire en C#. J'étudie GDI +, mais je n'ai toujours pas eu de logique pour développer ce programme.

J'ai essayé OCRing, mais le problème avec les OCR communs est qu'ils ne reconnaissent pas la différence de couleur.

Je veux seulement lire les caractères bleus ....

Toute orientation est très apprécié.

+0

Comment votre travail technique OCR ? Peut-il seulement détecter les caractères noirs sur un fond blanc? Ou y a-t-il un autre problème? –

+0

pour OCR Iam utilisant Terrasact et open source OCR de google, son fonctionnement très bien avec la plupart des images, mais pour certaines images son affichage latin ou caractères grecs, certains terrsact personne expérimentée pourrait aider dans ce segment .. –

Répondre

9

Essayez celui-ci;) Mais c'est un code dangereux.

void RedAndBlue() 
{ 

    OpenFileDialog ofd; 
    int imageHeight, imageWidth; 

    if (ofd.ShowDialog() == DialogResult.OK) 
    { 
     Image tmp = Image.FromFile(ofd.FileName); 
     imageHeight = tmp.Height; 
     imageWidth = tmp.Width; 
    } 
    else 
    { 
     // error 
    } 

    int[,] bluePixelArray = new int[imageWidth, imageHeight]; 
    int[,] redPixelArray = new int[imageWidth, imageHeight]; 
    Rectangle rect = new Rectangle(0, 0, tmp.Width, tmp.Height); 
    Bitmap temp = new Bitmap(tmp); 
    BitmapData bmpData = temp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb); 
    int remain = bmpData.Stride - bmpData.Width * 3; 
    unsafe 
    { 
     byte* ptr = (byte*)bmpData.Scan0; 
     for (int j = 0; j < bmpData.Height; j++) 
     { 
      for (int i = 0; i < bmpData.Width; i++) 
      { 
       bluePixelArray[i, j] = ptr[0]; 
       redPixelArray[i, j] = ptr[2]; 
       ptr += 3; 
      } 
      ptr += remain; 
     } 
    } 
    temp.UnlockBits(bmpData); 
    temp.Dispose(); 
} 
+5

C'est la bonne façon de faire la manipulation de pixels bitmap. Le mot clé "dangereux" est malheureux dans ce cas, car il n'est vraiment dangereux que si vous n'êtes pas bon en maths. "notaspathethicallyslowasgetpixelandsetpixel" serait un mot-clé plus approprié pour cela. – MusiGenesis

+0

Je dois l'avertir de la partie "dangereuse" parce qu'il doit permettre un code dangereux avant. Et vous avez raison à propos de "notaspathethicallyslowasgetpixelandsetpixel" :) –

+0

+1 pour cela, mais devriez-vous également appeler temp.Dispose() après l'opération UnlockBits finale? – Andy

0

Vous pouvez modifier probablement la palette d'avoir noir et blanc sur l'image

1

Modifier la couleur de l'image à gris mis à l'échelle, puis utilisez OCR

public Bitmap MakeGrayscale(Bitmap original) 
    { 
     //make an empty bitmap the same size as original 
     Bitmap newBitmap = new Bitmap(original.Width, original.Height); 

     for (int i = 0; i < original.Width; i++) 
     { 
      for (int j = 0; j < original.Height; j++) 
      { 
       //get the pixel from the original image 
       Color originalColor = original.GetPixel(i, j); 

       //create the grayscale version of the pixel 
       int grayScale = (int)((originalColor.R * .3) + (originalColor.G * .59) 
        + (originalColor.B * .11)); 

       //create the color object 
       Color newColor = Color.FromArgb(grayScale, grayScale, grayScale); 

       //set the new image's pixel to the grayscale version 
       newBitmap.SetPixel(i, j, newColor); 
      } 
     } 

     return newBitmap; 
    } 
Questions connexes