2012-01-24 74 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 –