Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Tesseract OCR配置和图像处理_C#_Image Processing_Tesseract - Fatal编程技术网

C# Tesseract OCR配置和图像处理

C# Tesseract OCR配置和图像处理,c#,image-processing,tesseract,C#,Image Processing,Tesseract,我一直在阅读Tesseract.Net包装器中关于各种图像“类型”的糟糕输出的帖子和内容,但我无法找到解决我糟糕输出的方法 下面是我试图解析的图片: 正如你所看到的,有不同的字体、大小、前景和背景。我试着用不同的量对它进行灰度化和高级化,但没有什么能接近正确解析整个图像 TesseractEngine ocr = new TesseractEngine(Path.Combine(Environment.CurrentDirectory, "tessdata"), "

我一直在阅读Tesseract.Net包装器中关于各种图像“类型”的糟糕输出的帖子和内容,但我无法找到解决我糟糕输出的方法

下面是我试图解析的图片:

正如你所看到的,有不同的字体、大小、前景和背景。我试着用不同的量对它进行灰度化和高级化,但没有什么能接近正确解析整个图像

TesseractEngine ocr = new TesseractEngine(Path.Combine(Environment.CurrentDirectory, "tessdata"), "fra", EngineMode.Default);
ocr.SetVariable("tessedit_char_whitelist", "ABCDEFGHIJKLMNOPQRSTUVWXYZÉÈ0123456789:'");
Page pg = ocr.Process(image.ToGrayscale().ScaleByPercent(200));
MessageBox.Show(pg.GetText());
有了这段代码(让我知道
ToGrayScale()
ScaleByPercent(…)
的详细信息是否有帮助),下面是我得到的输出:

8300 QÉMQ I09'0'9I

PIOII':

这似乎对应于
Bacc。génie logiciel
&
profile:

话虽如此,我对图像转换知之甚少,因此示例或提示将大有帮助,但如果必要,我完全愿意深入研究链接的内容/文档。我应该如何处理这样的图像


编辑:通过一些技巧(由@Yves Daoust建议),我成功地达到了这一点:

然而,输出(右边)还不是很完美。我一直在努力为Tesseract提供配置,以便它只接受特定列表中的单词。以下是我的尝试:

var initVars = new Dictionary<string, object>() {
            { "load_system_dawg", false },
            { "user_words_suffix", "fra.user-words" },
            { "language_model_penalty_non_freq_dict_word", 1 },
            { "language_model_penalty_non_dict_word", 1 }
        };
TesseractEngine ocr = new TesseractEngine(Path.Combine(Environment.CurrentDirectory, "tessdata"), "fra", EngineMode.Default, 
            Enumerable.Empty<string>(), initVars, false);
var initVars=newdictionary(){
{“加载系统”,false},
{“用户词后缀”,“框架用户词”},
{“语言、模式、惩罚、非频率、词汇”,1},
{“语言、模式、惩罚、非命令词”,1}
};
TesseractEngine ocr=新的TesseractEngine(Path.Combine(Environment.CurrentDirectory,“tessdata”),“fra”,EngineMode.Default,
Enumerable.Empty(),initVars,false);

我一直在寻找如何提供此类配置的示例,但我只找到了简短、不详细的文本解释。

您可以通过自己提取字符在很大程度上帮助Tesseract,这在这里非常简单:仅保留白色像素(以及表单其他部分的其他颜色)



顺便说一句,字符是如此可预测,以至于您可以自己进行识别(通过简单的像素级比较),而无需Tesseract的帮助。

请特别阅读二值化部分是的,我已经开始了其中提到的一些内容(很可能稍后会编辑OP,以提供有关各种测试的更多信息)。我读过“这是将图像转换为黑白。Tesseract在内部执行此操作,但结果可能不太理想,尤其是在页面背景不均匀的情况下。”对于二值化,我认为这是自动完成的,对吗?哇,这是一个简单的答案,但符合逻辑!我会试试看,看看会怎么样。我认为像素级是一种非常慢的方法,但也许我也会尝试一下(性能实际上很重要,但并不重要)@Mat:要从C#访问像素,请确保使用锁定位/解锁位机制,而不是GetPixel/SetPixel。性能上的差异是巨大的。到目前为止,我已经成功地提取出了单色,但使用这种方法,结果的准确率约为50-60%。我将尝试添加更多内容,稍后编辑OP。@Mat:生成的图像是否清晰地围绕字符?@Mat:您应该使用该特定字体训练Tesseract。正如我已经说过的,你也可以不用Tesseract。角色很感人,但你知道它们的大小,所以拆分应该不是问题。