Как создать TIFF-файл, который можно прочитать с помощью Tesseract OCR?
Я хочу позволить tesseract ORC запустить файл изображения, чтобы проверить содержимое.
Проблема, по-видимому, в том, что tesseract не только требует TIFF, но и требует, чтобы файл tiff был в определенном формате.
С помощью обычного файла tiff я получаю:
root@toshiba:~/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.

тогда я должен ... сделайте еще один трюк, прежде чем"Сохранить как".
Переход к слою > прозрачность > удалить Альфа-канал,
что приведет к удалению прозрачности, поскольку изображения TIF не могут иметь прозрачности.

Теперь проблема в том, что мое входное изображение приходит из C# и предварительно обрабатывается с помощью AFORGE.NET фильтры для анализа изображений.
Я также нашел .NET-порт LibTiff и пример того, как написать изображение с цветовой палитрой here:
http://bitmiracle.com/libtiff/help/create-tiff-with-palette-(color-map).aspx
Но я не знаю, как получить данные из исходного tiff (с неправильной палитрой) в целевой tiff (с правильным форматом палитры)...
2 ответов:
Я слышал, что Тессеракт прекрасно справляется с оттенками серого.
Поэтому, пожалуйста, попробуйте следующий код для преобразования ваших изображений 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); } } }Надеюсь, это сработает.
У меня была та же проблема с Тессерактом, но благодаря вашему совету я просто использовал GIMP, чтобы изменить его .tif из цветного файла в оттенки серого. Это легко сделать с помощью команды Image mode-greyscale, а затем Сохранить как tif снова. Надеюсь, это поможет тем, кто не хочет использовать командную строку для устранения проблемы с изображением.
Comments