C# 如何创建';tesseract OCR可以读取吗?

C# 如何创建';tesseract OCR可以读取吗?,c#,ocr,tesseract,libtiff,libtiff.net,C#,Ocr,Tesseract,Libtiff,Libtiff.net,我想让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 Segm

我想让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。

然后,在“另存为”之前,我必须再做一个技巧
转到图层>透明度>移除Alpha通道, 这将删除透明度,因为TIF图像不能具有透明度

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

我还发现了LibTiff的.NET端口,以及如何在此处使用调色板编写图像的示例:


但我不知道如何将数据从源tiff(调色板错误的tiff)获取到目标tiff(调色板格式正确).

我听说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);
        }
    }
}
使用(Tiff-tif=Tiff.Open(@“input.tif”,“r”))
{
FieldValue[]value=tif.GetField(tiftTag.IMAGEWIDTH);
int width=值[0]。ToInt();
值=tif.GetField(TiffTag.IMAGELENGTH);
int height=值[0]。ToInt();
int x分辨率=-1;
值=tif.GetField(TiffTag.XRESOLUTION);
if(值!=null)
xresolution=值[0]。ToInt();
int-yresolution=-1;
值=tif.GetField(TiffTag.YRESOLUTION);
if(值!=null)
yresolution=值[0]。ToInt();
int[]光栅=新int[高度*宽度];
如果(!tif.ReadRGBAImageOriented(宽度、高度、光栅、方向.左上角))
{
System.Windows.Forms.MessageBox.Show(“无法读取图像”);
返回;
}
字符串fileName=“grayscale.tif”;
使用(Tiff输出=Tiff.Open(文件名,“w”))
{
output.SetField(TiffTag.IMAGEWIDTH,width);
output.SetField(TiffTag.IMAGELENGTH,height);
output.SetField(TiffTag.ROWSPERSTRIP,1);
output.SetField(TiffTag.samplesperpoixel,1);
output.SetField(TiffTag.BITSPERSAMPLE,8);
设置字段(TiffTag.PLANARCONFIG,PLANARCONFIG.CONTIG);
设置字段(TiffTag.COMPRESSION,COMPRESSION.LZW);
SetField(TiffTag.FILLORDER,FILLORDER.MSB2LSB);
输出设置字段(TiffTag.photomic,光度控制.MiniBlack);
如果(X分辨率!=-1&&Y分辨率!=-1)
{
output.SetField(TiffTag.x分辨率,x分辨率);
output.SetField(TiffTag.YRESOLUTION,YRESOLUTION);
}
字节[]样本=新字节[宽度];
对于(int y=0,index=0;y灰度转换的替代公式
//字节灰=(字节)(Tiff.GetR(rgb)*0.2125+Tiff.GetG(rgb)*0.7154+Tiff.GetB(rgb)*0.0721);
//字节灰=(字节)((Tiff.GetR(rgb)+Tiff.GetG(rgb)+Tiff.GetB(rgb))/3);
样本[x]=灰色;
}
output.writencodedstrip(y,samples,samples.Length);
}
}
}

希望它能起作用。

我对Tesseract也有同样的问题,但多亏了你的建议,我刚刚使用GIMP将.tif从颜色文件更改为灰度文件。通过使用命令Image mode-greyscale,然后再次保存为tif,可以轻松完成此操作。希望这能帮助那些不想使用命令行修复映像问题的人