Как создать файл в формате TIFF, который будет читаться при помощи Ose?
Я хочу, чтобы 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, и пример того, как написать изображение с цветовой палитрой здесь:
http://bitmiracle.com/libtiff/help/create-tiff-with-palette-(color-map).aspx
Но я не знаю, как получить данные от исходного tiff (с неправильной палитрой) до целевого tiff (с правильным форматом палитры)...
2 ответа
Я слышал, что тессеракт отлично подходит для 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);
}
}
}
Надеюсь, это поможет.
У меня была та же проблема с Tesseract, но благодаря вашему совету я просто использовал GIMP, чтобы изменить.tif из цветного файла в оттенки серого. Это легко сделать с помощью команды Режим изображения - оттенки серого, а затем снова сохранить как tif. Надеюсь, это поможет кому-то, кто не хочет использовать командную строку для решения проблемы с изображением.