我已经使用了Tesseract,结果还有很多不足之处.我目前正在检测非常小的图像(35x15,没有边框,但尝试添加一个带有imagemagick而没有ocr优势); 它们的范围从2个字符到5个,并且是一个非常可靠的字体,但是字符可变,只需使用图像大小校验和,或者这样就不起作用了.
除了坚持使用Tesseract或对其进行完整的定制培训外,OCR还有哪些选择? 此外,如果这与Heroku样式托管兼容将是非常有用的(至少我可以编译垃圾箱并将其推过).
我一直在寻找一段时间以及所有我见过的OCR库请求.我想知道如何实现最纯净,易于安装和使用OCR库以及安装到C#项目的详细信息.
如果可行,我只想像通常的dll参考一样实现它...
例:
using org.pdfbox.pdmodel;
using org.pdfbox.util;
Run Code Online (Sandbox Code Playgroud)
还有一个小的OCR代码示例会很好,例如:
public string OCRFromBitmap(Bitmap Bmp)
{
Bmp.Save(temppath, System.Drawing.Imaging.ImageFormat.Tiff);
string OcrResult = Analyze(temppath);
File.Delete(temppath);
return OcrResult;
}
Run Code Online (Sandbox Code Playgroud)
所以请考虑我对OCR项目并不熟悉,并给我一个答案,比如和假人交谈.
编辑: 我猜人们误解了我的要求.我想知道如何将这些开源OCR库实现到C#项目以及如何使用它们.作为dup给出的链接没有给出我要求的答案.
有没有人有OCR不同字体的经验?我正在生成一个ID,然后尝试用tesseract扫描它.目前我只是T&E'n不同的字体,但这似乎效率很低.我尝试过OCR*系列字体,以及Arial和Georgia等其他各种字体.tesseract往往与OCR*字体混淆.
是否有专门为tesseract设计的字体,或任何适合它的系统字体?
根据我的经验,OCR库往往只输出图像内,但没有找到文本,其中文本被发现.是否有一个OCR库可以输出图像中找到的单词以及x, y, width, height找到这些单词的坐标()?
请注意,我真的在寻找我的问题的答案.我不是在寻找一些源代码或一些学术论文的链接:我已经使用了源代码,我已经阅读了论文,但仍然没有弄清楚这个问题的最后部分......
我正在研究一些快速屏幕字体OCRing,我正在取得很好的进展.
我已经找到了基线,将角色分开,将每个角色转换为黑白,然后对每个角色进行轮廓处理,以便将Freeman链码应用于它.
基本上它是一个8连接的链码,看起来像这样:
3 2 1
\ | /
4-- --0
/ | \
5 6 7
Run Code Online (Sandbox Code Playgroud)
所以,如果我有一个'a',经过我所有的转换(包括转换为黑白),我最终会得到这样的结果:
11110
00001
01111
10001
10001
01110
Run Code Online (Sandbox Code Playgroud)
然后它的外部计数可能看起来像这样(我可能在这里犯了一个错误,这是ASCII艺术轮廓,我的'算法'可能会使轮廓错误,但这不是我的问题点):
XXXX
X1111X
XXXX1X
X01111X
X10001X
X10001X
X111X
XXX
Run Code Online (Sandbox Code Playgroud)
在Xs之后,我得到了链码,它将是:
0011222334445656677
请注意,这是规范化的链代码,但您始终可以将链式代码规范化,如下所示:您只需保留最小的整数.
(顺便说一句,有一个超级高效的实现来找到链代码,你只需要取一个'X'的8个相邻像素,然后查看256查找表,如果你有0,1,2,3,4, 5,6或7)
不过,我现在的问题是:从那个0011222334445656677链码开始,我怎么发现我有'a'?
因为,例如,如果我的'a'看起来像这样:
11110
00001
01111
10001
10001
01111 <-- This pixel is now full
Run Code Online (Sandbox Code Playgroud)
然后我的链码现在是:0002222334445656677
然而,这也是一个'a'.
我知道这些链代码的重点是能够适应这些微小的变化,但我无法弄清楚我应该如何找到哪个字符对应于一个链代码.
我已经走得那么远了,现在我被卡住了......
(顺便说一下,我不需要100%的效率,将"0"与"O"或"o"区分开来的事情并不是真正的问题)
我试图找到一种方法来打破已经自适应阈值化的扫描文档中的文本行.现在,我存储文档为无符号的整数0到255的像素值,并且这是我在像素的平均值中的每一行,以及我基于像素值的平均值是否是线分割成的范围大于250,然后我取每个范围的线的中位数.但是,这种方法有时会失败,因为图像上可能会出现黑色斑点.
是否有更加抗噪的方式来完成这项任务?
编辑:这是一些代码."扭曲"是原始图像的名称,"剪切"是我想要分割图像的地方.
warped = threshold_adaptive(warped, 250, offset = 10)
warped = warped.astype("uint8") * 255
# get areas where we can split image on whitespace to make OCR more accurate
color_level = np.array([np.sum(line) / len(line) for line in warped])
cuts = []
i = 0
while(i < len(color_level)):
if color_level[i] > 250:
begin = i
while(color_level[i] > 250):
i += 1
cuts.append((i + begin)/2) # middle of the whitespace region
else:
i += 1
Run Code Online (Sandbox Code Playgroud)
我还是初学者,但我想写一个字符识别程序.该计划尚未准备好.我编辑了很多,因此评论可能不完全匹配.我将使用8连接进行连接组件标记.
from PIL import Image
import numpy as np
im = Image.open("D:\\Python26\\PYTHON-PROGRAMME\\bild_schrift.jpg")
w,h = im.size
w = int(w)
h = int(h)
#2D-Array for area
area = []
for x in range(w):
area.append([])
for y in range(h):
area[x].append(2) #number 0 is white, number 1 is black
#2D-Array for letter
letter = []
for x in range(50):
letter.append([])
for y in range(50):
letter[x].append(0)
#2D-Array for label
label = []
for x in range(50):
label.append([])
for y in range(50):
label[x].append(0)
#image to number …Run Code Online (Sandbox Code Playgroud) 我正在考虑制作一个需要从图像中提取TEXT的应用程序.我没有做过类似的事情,我不想自己实现所有的东西.是否有任何已知的库或开源代码(支持ios,objective-C),它可以帮助我从图像中提取文本.一个基本的源代码也将做(我将尝试根据我的需要修改它).
如果有人对此有任何想法,请告诉我.
谢谢,维克拉姆
所以我在研究后听到的是,唯一可靠的免费OCR选项是Tesseract或CuneiForm.
现在,Tesseract文档非常可怕,他们给你的只是一堆Visual Studio代码(适用于我的Windows),从那里你就可以在他们的API海洋中独立完成.您所能做的就是使用编译的exe然后在tiff图像上使用它.
我期待至少很短的文档告诉你如何拉动他们的API调用来使用OCR至少是一个小例子但是没有,他们的文档中没有类似的东西.
CuneiForm:我下载了它,"很棒"一切都用俄语.:(
这些家伙真的很难提起一个小例子而不是他们为我们提供了大量不相关的信息,可能有90%的人无法到达,你怎么能在没有开始小事情的情况下到达那里并且他们不解释它们!
所以我有一堆API,但如果它无处可解,我该怎么用?...也许有人可以给我建议和解决方案?我不是要求一个奇迹,只是一些小事来告诉我事情是如何运作的.
嗨,你能不能给我一个简单的例子来测试Tesseract OCR,最好是在C#中.
我试过这里的演示.我下载了英文数据集并在C盘中解压缩.并将代码修改如下:
string path = @"C:\pic\mytext.jpg";
Bitmap image = new Bitmap(path);
Tesseract ocr = new Tesseract();
ocr.SetVariable("tessedit_char_whitelist", "0123456789"); // If digit only
ocr.Init(@"C:\tessdata\", "eng", false); // To use correct tessdata
List<tessnet2.Word> result = ocr.DoOCR(image, Rectangle.Empty);
foreach (tessnet2.Word word in result)
Console.WriteLine("{0} : {1}", word.Confidence, word.Text);
Run Code Online (Sandbox Code Playgroud)
不幸的是,代码不起作用.程序死于"ocr.Init(..."行.即使使用try-catch,我甚至无法获得异常.
我能够运行vietocr!但这对我来说是一个非常大的项目.我需要一个像上面这样的简单例子.
谢谢