Как создать файл в формате TIFF, который будет читаться с помощью Ose? - PullRequest
3 голосов
/ 25 января 2012

Я хочу, чтобы 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, перехода в Image> Mode> Indexes и установки «Generate Optimum Palette», «максимальное количество цветов» на 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 (с неправильной палитрой) до целевого tiff (с правильным форматом палитры) ...

Ответы [ 2 ]

2 голосов
/ 25 марта 2012

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

2 голосов
/ 26 января 2012

Я слышал, что тессеракт в порядке с 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);
        }
    }
}

Надеемся, это поможет.

...