Tesseract: El texto no se reconoce a partir de un png.

Creado en 19 jun. 2015  ·  21Comentarios  ·  Fuente: charlesw/tesseract

Tengo esta imagen, pero el tesseract no reconoce el texto de la imagen.

banner2

La salida después de ejecutar tesseract es:

Ammmz e um

Bzndmary Pbf fi ularamr
ugsmmm gmmm
Rz fi aume P3 yMuiR: 6aua
Stams Pay hefare 20 'arnsrzz

question

Todos 21 comentarios

No estoy seguro de si ya está haciendo algún preprocesamiento, sin embargo, esto podría ayudar. El número 115 describe algunas técnicas que pueden resultar útiles. También puede habilitar la opción tessedit_write_images (solucionada por el número 160) para ver exactamente qué imagen se está introduciendo en tesseract (tesseract realiza un procesamiento previo por sí mismo). Finalmente, específico para su ejemplo, haría al menos lo siguiente como iniciador:

  1. Cambiar el tamaño de la imagen para que sea de 300 ppp
  2. Configure la región de interés solo para el componente de campos \ panel (se supone que el diseño es fijo)
  3. Considere actualizar los diccionarios de palabras y patrones para admitir los posibles valores de campo de formulario (consulte https://code.google.com/p/tesseract-ocr/wiki/ImproveQuality#Dictionaries,_word_lists,_and_patterns).

Traté de seguir tus pasos:
Cambié el tamaño de la imagen, recorté la imagen (una pequeña parte de ella), apliqué una escala de grises y establecí las variables (no puedo establecer 'tessedit_write_images' en verdadero), mi método no pudo recuperar el valor de tessedit_write_images. Entonces publico el código, tal vez haya algo mal en el código.

La imagen recortada:
spscale
Después de eso, este es el resultado:, pero no es suficiente
Monto
Bene fi cioso
Dzscnmmn
Re fi erenoz
estafas

Este es mi codigo:
CropImage () public void
{
Imagen de mapa de bits = nuevo mapa de bits (localPath);
// var rect = new Rectangle (130,10,125,70);
var rect = nuevo rectángulo (60,10,70,70);
Mapa de bits imageCrop = image.Clone (rect, image.PixelFormat);
imageCrop.SetResolution (300, 300);
Gráficos g = Graphics.FromImage (imageCrop);
g.DrawImage (imageCrop, 0, 0);
g.Dispose ();
imageCrop.Save (localPathCrop);
}

    public void GrayScaleImage()
    {
        Bitmap c = new Bitmap(localPathCrop);
        Bitmap d;
        int rgb;

        for (int y = 0; y < c.Height; y++)
            for (int x = 0; x < c.Width; x++)
            {
                Color pixelColor = c.GetPixel(x, y);
                rgb = (int)((pixelColor.R + pixelColor.G + pixelColor.B)/3);
                c.SetPixel(x, y, Color.FromArgb(rgb, rgb, rgb));
            }
        d = c;
        d.Save(localPathGrayScale);
    }

public void readOCR ()
{
var pathToLangFolder = @ "D: \ Pruebas de automatización \ OCRTest \ Tesseract-OCR";

        using (var engine = new TesseractEngine(pathToLangFolder, "eng", EngineMode.Default))
        {
            engine.SetVariable("load_system_dawg", false);
            engine.SetVariable("load_freq_dawg", false);
            engine.SetVariable("tessedit_write_imag", true);
            bool result ;

            if (engine.TryGetBoolVariable("tessedit_write_imag", out result))
            {
                Assert.AreEqual(false, result, "The values are not equal");
            }
            else
            {
                Assert.Fail("Failed to retrieve value for '{0}'.", "tessedit_write_imag");
            }

            using (Bitmap image = new Bitmap(localPathGrayScale))
            {
                using (var pix = PixConverter.ToPix(image))
                {
                    using (var page = engine.Process(pix))
                    {
                        Console.WriteLine(page.GetMeanConfidence() + " : " + page.GetText());
                    }
                }
            }
        }
    }

Con respecto a la conversión de la imagen a escala de grises, la fórmula real es 0.2126 * R + 0.7152 * G + 0.0722 * B (https://en.wikipedia.org/wiki/Grayscale), sin embargo, Pix expone esta funcionalidad a través de Pix.ConvertRGBToGray (establezca todos los parámetros en 0 para utilice los valores predeterminados definidos por leptonica). Aunque no me molestaría con esto a menos que esté realizando un procesamiento adicional que requiera una imagen en escala de grises (como ejecutarla a través de un algoritmo de umbral / binerización personalizado). Tenga en cuenta que Tesseract ya hace esto y, en general, se considera lo suficientemente bueno para la mayoría de los casos.

También estoy bastante seguro de que no está cambiando correctamente el tamaño de la imagen a 300 ppp en su función de recorte. Si comprueba la salida, creo que encontrará que en realidad es del mismo tamaño. Lo que tendrá que hacer es utilizar la resolución de la fuente y calcular un factor de escala a partir de eso. Entonces, asumiendo que la fuente es de 70 ppp (resolución de pantalla típica), algo como lo siguiente debería funcionar:

public static Bitmap ResizeImage(Bitmap src, Single targetResolution)
{
        if(targetResolution <= 0.0f) throw new ArgumentOutOfRangeException ("targetResolution", "The target resolution must be greater than zero.");

        if(src.HorizontalResolution <= 0.0f) throw new ArgumentOutOfRangeException ("src", "The src image doesn't specify a horizontal resolution.");

        if(src.VerticalResolution<= 0.0f) throw new ArgumentOutOfRangleException("src", "The src image doesn't specify a vertical resolution.");

        Single horizontalScale = targetResolution / src.HorizontalResolution;
        Single verticalScale = targetResolution / src.VerticalResolution;

        Bitmap result = new Bitmap(src.Width * horizontalScale , src.Height * verticalScale);
        b.SetResolution(targetResolution, targetResolution )
        using (Graphics g = Graphics.FromImage((Image)b))
        {
            g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
            g.DrawImage(src, 0, 0, result .Width  , result.Height);
        }
        return b;
}

Finalmente, el código a continuación siempre fallará, ya que acaba de establecer tessedit_write_images en verdadero (también tenga en cuenta que es tessedit_write_images no tessedit_write_imag :

engine.SetVariable("tessedit_write_images", true);
if (engine.TryGetBoolVariable("tessedit_write_images", out result))
{
    Assert.AreEqual(false, result, "The values are not equal");
}

Lo que probablemente quieras es algo como esto:

engine.SetVariable("tessedit_write_images", true);
if (engine.TryGetBoolVariable("tessedit_write_images", out result))
{
    Assert.AreEqual(true, result, "The variable 'tessedit_write_images' should be enabled.");
}

Tenga en cuenta que he creado un problema, # 183, para admitir el cambio de tamaño \ escalar Pix, ya que probablemente sea una operación común. No hay promesas de que se implemente en el corto plazo.

Relacionado con el método ResizeImage, creo, en lugar de b.SetResolution (targetResolution, targetResolution)
deberíamos tener src.SetResolution (targetResolution, targetResolution)? y también encontré un error en Bitmap result = new Bitmap (src.Width * horizontalScale, src.Height * verticalScale);
Los argumentos 1 y 2 no se pueden convertir de flotante a cadena

Opps lo siento debería haber sido result.SetResolution(targetResolution, targetResolution) y Bitmap result = new Bitmap ((int) (src.Width * horizontalScale), (int) (src.Height * verticalScale))

Después de que hice los cambios, este es el resultado, pero aún no es lo que esperaba.
Monto
Beneficiario
Descnvhun
Rekreno:
Estado

Y este es el método CropImage después de sus cambios
CropImage () public void
{
Imagen de mapa de bits = nuevo mapa de bits (localPath);
var rect = nuevo rectángulo (60,10,70,70);
Mapa de bits imageCrop = image.Clone (rect, image.PixelFormat);
ResizeImage (imageCrop, 300);
imageCrop.Save (localPathCrop);

    }

Umm, lo siento, no tengo ideas, puede que no sea una imagen de calidad lo suficientemente alta.
¿Quizás intente stackoverflow si aún no lo ha hecho?

Antes de solucionar el problema, ¿tiene alguna idea para pasar por alto esto?

Sabes lo gracioso, usar la misma biblioteca tesseract en Java, funciona bien. No tengo que recortar la imagen, solo escalarla.

¿Qué sucede si usa la herramienta de línea de comandos tesseract?
El 25 de junio de 2015 a las 21:21, "FlorinMax" [email protected] escribió:

Ahora lo gracioso es usar la misma biblioteca tesseract en Java,
funciona bien. No tengo que recortar la imagen, solo escalarla.

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/charlesw/tesseract/issues/182#issuecomment -115214245.

Vengo con algunas actualizaciones. Después de buscar el problema, encontré cuál era el problema. Nuestro método para cambiar el tamaño de la imagen no está haciendo lo que esperamos. Básicamente, el método no cambia el tamaño de la imagen, dibuja con la misma resolución.
Entonces, en lugar de:
/ Resultado del mapa de bits = nuevo mapa de bits ((int) (src.Width * horizontalScale), (int) (src.Height * verticalScale));
//result.SetResolution(targetResolution, targetResolution);

Yo añadí :
int ancho = (int) (src.Width * horizontalScale);
int altura = (int) (src.Height * verticalScale);
Resultado del mapa de bits = nuevo mapa de bits (src, ancho, alto);

Después de esto, nuestra imagen obtiene una resolución más alta:
Dimensiones 1334 x 375
Ancho 1334 píxeles
Altura 375 píxeles
Profundidad de bits 32
y obtengo todo el texto de la imagen.

Como dije en los comentarios anteriores, en Java, usando AffineTransform, obtengo una imagen con mejor resolución:
Dimensiones 640 x 180
Ancho 640
Altura 180 píxeles
Profundidad de bits 24

Tratando de obtener lo mismo que con VS, el texto no se reconoce por completo, por lo que tengo que dar la máxima resolución objetivo.

En conclusión, el problema no fue el Tesseract, el problema fue nuestro método de cambio de tamaño y creo que no está completamente optimizado.

De acuerdo, veré si puedo encontrar algo de tiempo este fin de semana para exponer el cambio de tamaño.
funcionalidad ofrecida por leptonica. Debería resolver este tipo de problemas.
El 26 de junio de 2015 a las 23:54, "FlorinMax" [email protected] escribió:

Vengo con algunas actualizaciones. Después de buscar el problema, encontré lo que
era el problema. Nuestro método para cambiar el tamaño de la imagen no está haciendo lo que
suponer. Básicamente, el método no cambia el tamaño de la imagen, dibuja con el
misma resolución.
Entonces, en lugar de:
/ Resultado del mapa de bits = nuevo mapa de bits ((int) (src.Width * horizontalScale),
(int) (src.Height * verticalScale));
//result.SetResolution(targetResolution, targetResolution);

Yo añadí :
int ancho = (int) (src.Width * horizontalScale);
int altura = (int) (src.Height * verticalScale);
Resultado del mapa de bits = nuevo mapa de bits (src, ancho, alto);

Después de esto, nuestra imagen obtiene una resolución más alta:
Dimensiones 1334 x 375
Ancho 1334 píxeles
Altura 375 píxeles
Profundidad de bits 32
y obtengo todo el texto de la imagen.

Como dije en los comentarios anteriores, en Java, usando AffineTransform,
obtener una imagen con mejor resolución:
Dimensiones 640 x 180
Ancho 640
Altura 180 píxeles
Profundidad de bits 24

Intentando obtener lo mismo que con VS, no se reconoce el texto
completamente, así que tengo que dar la máxima resolución objetivo.

En conclusión, el problema no fue el Tesseract, nuestro método de cambio de tamaño fue
el problema, y ​​creo que no está completamente optimizado.

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/charlesw/tesseract/issues/182#issuecomment -115698001.

Agregué un nuevo método de escala a Pix que debería funcionar mejor para el caso de uso. ¿Puede obtener el código fuente más reciente y probarlo? Puede crear un paquete NuGet haciendo doble clic en el archivo build.bat.

¿Dónde debería encontrar el archivo build.bat? ¿Tengo que desinstalar tesseract orc de NuGet Pacages y volver a instalarlo?

De todos modos ... el comportamiento de la biblioteca es muy extraño. Algunas veces reconoce todos los caracteres y números, otras no. Tiene cierta dificultad para reconocer los números. para esto, tengo que jugar (aumentar / disminuir) con targetresolution para obtener el texto de la imagen. Vi que la fecha es la más difícil de reconocer en la imagen.

No, solo verifique la fuente, desarrolle la rama y ejecute ~ \ build.bat
generar un paquete nuget que luego puede usar agregando a un nuget local
repo.

Lo siento, pero no estoy tan familiarizado con esto. Quizás puedas darme más detalles ...

En Tesseract -master, encontré un archivo build.bat ... ¿este es el indicado?

Sí, sin embargo, deberá cambiar el brazo para desarrollarse. Maestro solo
contiene código publicado.
El 30/06/2015 9:29 pm, "FlorinMax" [email protected] escribió:

En Tesseract -master, encontré un archivo build.bat ... ¿este es el indicado?

-
Responda a este correo electrónico directamente o véalo en GitHub
https://github.com/charlesw/tesseract/issues/182#issuecomment -117134882.

¿Fue útil esta página
0 / 5 - 0 calificaciones