2012-01-24 1 views
3

Я хочу, чтобы tesseract ORC работал над файлом изображения, чтобы проверить содержимое.
Проблема заключается в том, что tesseract требует не только TIFF, но также требует, чтобы файл tiff находился в определенном формате.
Как создать файл TIFF, который можно прочитать с помощью Tesseract OCR?

С помощью всего лишь обычный файл в формате TIFF, я получаю:

[email protected]:~/Desktop# tesseract crap.tif crap.txt 
Tesseract Open Source OCR Engine 
check_legal_image_size:Error:Only 1,2,4,5,6,8 bpp are supported:32 
Segmentation fault 

До сих пор мне удалось найти противоядие.
Он заключается в использовании GIMP, Изображение> Режим> Указатели и настройка «Сформировать Оптимальная палитра», «максимальное количество цветов» до 256.
enter image description here
то я должен сделать еще один трюк, прежде чем «Сохранить В виде".
Переход к уровню> Прозрачность> Удалите альфа-канал, , который удалит прозрачность, потому что изображения TIF не могут иметь прозрачность.

enter image description here

Теперь проблема заключается в моем входном изображении приходит от C#, и предобработана с фильтрами AForge.NET анализа изображений.

Я также нашел .NET порт LibTIFF и пример того, как написать изображение с цветовой палитрой здесь:
http://bitmiracle.com/libtiff/help/create-tiff-with-palette-(color-map).aspx

Но я не знаю, как получить данные из источника tiff (тот, у которого неправильная палитра), к целевому тифу (с правильным форматом палитры) ...

ответ

2

Я слышал, что tesseract отлично сочетается с оттенками серого TIFF.

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

using (Tiff tif = Tiff.Open(@"input.tif", "r")) 
{ 
    FieldValue[] value = tif.GetField(TiffTag.IMAGEWIDTH); 
    int width = value[0].ToInt(); 

    value = tif.GetField(TiffTag.IMAGELENGTH); 
    int height = value[0].ToInt(); 

    int xresolution = -1; 
    value = tif.GetField(TiffTag.XRESOLUTION); 
    if (value != null) 
     xresolution = value[0].ToInt(); 

    int yresolution = -1; 
    value = tif.GetField(TiffTag.YRESOLUTION); 
    if (value != null) 
     yresolution = value[0].ToInt(); 

    int[] raster = new int[height * width]; 
    if (!tif.ReadRGBAImageOriented(width, height, raster, Orientation.TOPLEFT)) 
    { 
     System.Windows.Forms.MessageBox.Show("Could not read image"); 
     return; 
    } 

    string fileName = "grayscale.tif"; 
    using (Tiff output = Tiff.Open(fileName, "w")) 
    { 
     output.SetField(TiffTag.IMAGEWIDTH, width); 
     output.SetField(TiffTag.IMAGELENGTH, height); 
     output.SetField(TiffTag.ROWSPERSTRIP, 1); 
     output.SetField(TiffTag.SAMPLESPERPIXEL, 1); 
     output.SetField(TiffTag.BITSPERSAMPLE, 8); 
     output.SetField(TiffTag.PLANARCONFIG, PlanarConfig.CONTIG); 
     output.SetField(TiffTag.COMPRESSION, Compression.LZW); 
     output.SetField(TiffTag.FILLORDER, FillOrder.MSB2LSB); 
     output.SetField(TiffTag.PHOTOMETRIC, Photometric.MINISBLACK); 

     if (xresolution != -1 && yresolution != -1) 
     { 
      output.SetField(TiffTag.XRESOLUTION, xresolution); 
      output.SetField(TiffTag.YRESOLUTION, yresolution); 
     } 

     byte[] samples = new byte[width]; 
     for (int y = 0, index = 0; y < height; y++) 
     { 
      for (int x = 0; x < width; x++) 
      { 
       int rgb = raster[index++]; 

       // compute pixel brightness taking human eye's sensitivity 
       // to each of red, green and blue colors into account 
       byte gray = (byte)(Tiff.GetR(rgb) * 0.299 + Tiff.GetG(rgb) * 0.587 + Tiff.GetB(rgb) * 0.114); 

       // Alternative formulas for RGB -> Gray conversion 

       //byte gray = (byte)(Tiff.GetR(rgb) * 0.2125 + Tiff.GetG(rgb) * 0.7154 + Tiff.GetB(rgb) * 0.0721); 
       //byte gray = (byte)((Tiff.GetR(rgb) + Tiff.GetG(rgb) + Tiff.GetB(rgb))/3); 

       samples[x] = gray; 
      } 

      output.WriteEncodedStrip(y, samples, samples.Length); 
     } 
    } 
} 

Будем надеяться, что он будет делать трюк.

2

У меня была такая же проблема с Tesseract, но благодаря вашему совету, я просто использовал GIMP для изменения .tif из цветного файла в оттенки серого. Это легко сделать, используя команду Режим изображения - оттенки серого, а затем снова сохранить в качестве tif. Надеюсь, это поможет кому-то, кто не хочет использовать командную строку для исправления проблемы с изображением.

+0

Это хорошая альтернатива существующему решению. +1 –

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