2012-01-24 36 views
3

我想让tesseract ORC在图像文件上运行,以扫描内容。
问题似乎是,tesseract不仅需要TIFF,而且还需要tiff文件处于特定格式。
如何创建可通过tesseract OCR读取的TIFF文件?

只需正常的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
的话,我都保存之前的”做一招如”。
转到图层>透明度>删除Alpha通道, 这将删除透明度,因为TIF图像不能具有透明度。

enter image description here

现在的问题是我输入的图像来自于C#,并进行预处理,以AFORGE.NET图像分析过滤器。

我还发现的libtiff的.NET端口,以及如何编写与调色板这里的图像的例子:
http://bitmiracle.com/libtiff/help/create-tiff-with-palette-(color-map).aspx

但我不知道如何从源获取数据tiff(带有错误调色板的那个)到目标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 –