最近做文档识别方面的项目,做汉字识别需要建立字库,在网上找了各种OCR,感觉都不好,这方面的技术应该比较成熟了,OCR的软件很多,但没有找到几篇有含金量量的论文,也没有看到哪位大牛公开字库,我用pygame渲染字体来生成字库,也用PIL对整齐的图片进行切割得到字库。

pygame渲染字体来生成字库

  用pygame渲染字体我参考的这篇文章,根据GB2323-8标准,汉语中常用字3500个,覆盖了99.7%的使用率,加上次常用共6763个,覆盖99.99%的使用率。先生成一个字体图片,从网上找来3500个常用汉字,对每一个子按字体进行渲染:

 def pasteWord(word):
'''输入一个文字,输出一张包含该文字的图片'''
pygame.init()
font = pygame.font.Font(os.path.join("./fonts", "a.ttf"), 22)
text = word.decode('utf-8')
imgName = "E:/dataset/chinesedb/chinese/"+text+".png"
paste(text,font,imgName) def paste(text,font,imgName,area = (0, -9)):
'''根据字体,将一个文字黏贴到图片上,并保存'''
im = Image.new("RGB", (32, 32), (255, 255, 255))
rtext = font.render(text, True, (0, 0, 0), (255, 255, 255))
sio = StringIO.StringIO()
pygame.image.save(rtext, sio)
sio.seek(0)
line = Image.open(sio)
im.paste(line, area)
#im.show()
im.save(imgName)

  渲染图片次数多总是报错,对于渲染失败的文字我又重试,最终得到了一个包含3510字(加上10个数字)的字库:

字符分割生成字库

  另外一种办法就是把3500个字放在word排好,然后转PDF保存成图片,像下面这样:

  

  密密麻麻的字,但非常整齐,不需要什么图片处理算法,只要找到空白的行和列,按行和列就可以进行切割,切割出来也好,只要保存有序切割,切出来的图片依然可以与字对应,下面是切割的代码:

 #!encoding=utf-8
import Image
import os def yStart(grey):
m,n = grey.size
for j in xrange(n):
for i in xrange(m):
if grey.getpixel((i,j)) == 0:
return j
def yEnd(grey):
m,n = grey.size
for j in xrange(n-1,-1,-1):
for i in xrange(m):
if grey.getpixel((i,j)) == 0:
return j def xStart(grey):
m,n = grey.size
for i in xrange(m):
for j in xrange(n):
if grey.getpixel((i,j)) == 0:
return i
def xEnd(grey):
m,n = grey.size
for i in xrange(m-1,-1,-1):
for j in xrange(n):
if grey.getpixel((i,j)) == 0:
return i
def xBlank(grey):
m,n = grey.size
blanks = []
for i in xrange(m):
for j in xrange(n):
if grey.getpixel((i,j)) == 0:
break
if j == n-1:
blanks.append(i)
return blanks def yBlank(grey):
m,n = grey.size
blanks = []
for j in xrange(n):
for i in xrange(m):
if grey.getpixel((i,j)) == 0:
break
if i == m-1:
blanks.append(j)
return blanks def getWordsList():
f = open('3500.txt')
line = f.read().strip()
wordslist = line.split(' ')
f.close()
return wordslist count = 0
wordslist = []
def getWordsByBlank(img,path):
'''根据行列的空白取图片,效果不错'''
global count
global wordslist
grey = img.split()[0]
xblank = xBlank(grey)
yblank = yBlank(grey)
#连续的空白像素可能不止一个,但我们只保留连续区域的第一个空白像素和最后一个空白像素,作为文字的起点和终点
xblank = [xblank[i] for i in xrange(len(xblank)) if i == 0 or i == len(xblank)-1 or not (xblank[i]==xblank[i-1]+1 and xblank[i]==xblank[i+1]-1)]
yblank = [yblank[i] for i in xrange(len(yblank)) if i == 0 or i == len(yblank)-1 or not (yblank[i]==yblank[i-1]+1 and yblank[i]==yblank[i+1]-1)]
for j in xrange(len(yblank)/2):
for i in xrange(len(xblank)/2):
area = (xblank[i*2],yblank[j*2],xblank[i*2+1]+32,yblank[j*2]+32)#这里固定字的大小是32个像素
#area = (xblank[i*2],yblank[j*2],xblank[i*2+1],yblank[j*2+1])
word = img.crop(area)
word.save(path+wordslist[count]+'.png')
count += 1
if count >= len(wordslist):
return def getWordsFormImg(imgName,path):
png = Image.open(imgName,'r')
img = png.convert('')
grey = img.split()[0]
#先剪出文字区域
area = (xStart(grey)-1,yStart(grey)-1,xEnd(grey)+2,yEnd(grey)+2)
img = img.crop(area)
getWordsByBlank(img,path) def getWrods():
global wordslist
wordslist = getWordsList()
imgs = ["l1.png","l2.png","l3.png"]
for img in imgs:
getWordsFormImg(img,'words/') if __name__ == "__main__":
getWrods()

  切出来的字的效果也很好的:

  

  自己对这图像处理本来就不熟悉,用的都是土包子的方法。汉字的识别难度是比较大的,对应整齐的图片,采样DTW对字库求相似项,效果还不错,但用扫描仪、相机拍下来的文章切割处理后,效果很差。我用了BP神经网络,但3500个汉字相当于3500个类,这个超多类别的分类问题,BP也很难应付,主要是训练数据太少,手里只有一份字库。

  如果您有什么好的方法识别图片汉字的方法,希望给与我分享,谢谢!

python生成汉字图片字库的更多相关文章

  1. python 生成随机图片验证码

    1.安装pillow模块 pip install pillow (1)创建图片 from PIL import Image #定义使用Image类实例化一个长为400px,宽为400px,基于RGB的 ...

  2. python生成测试图片

    直接代码 import cv2.cv as cv saveImagePath = 'E:/ScreenTestImages/' colorRed = [0,0,255] colorGreen = [0 ...

  3. Python数据展示 - 生成表格图片

    前言 前一篇文章介绍了推送信息到企业微信群里,其中一个项目推送的信息是使用Python自动生成的表格,本文来讲讲如何用Python生成表格图片. 选一个合适库 Python最大的优点就是第三方库丰富, ...

  4. python生成随机图形验证码

    使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL impor ...

  5. python 将png图片格式转换生成gif动画

    先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...

  6. [Python] 将视频转成ASCII符号形式、生成GIF图片

    一.简要说明 简述:本文主要展示将视频转成ASCII符号形式展示出来,带音频. 运行环境:Win10/Python3.5. 主要模块: PIL.numpy.shutil. [PIL]: 图像处理 [n ...

  7. Python(三) PIL, Image生成验证图片

    Python(三) PIL, Image生成验证图片 安装好PIL,开始使用. 在PyCharm中新建一个文件:PIL_Test1.py 1 # PIL 应用练习 2 # 3 # import PIL ...

  8. 012. asp.net生成验证码图片(汉字示例/字母+数字)

    protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...

  9. Python | 一键生成九宫格图片

    一键生成九宫格图片 首先我们准备几张图片: 将代码文件放在放置图片的地方,用软件打开: 点击运行,在当前目录下会生成一个文件夹: 打开新生成的文件夹: 打开对应图片的名称文件夹: 如果不想图片被分成9 ...

随机推荐

  1. 如何利用Pre.im分发iOS测试包

    大众创新万众创业,在移动互联网的风口,移动APP开发与测试发展方兴未艾,受到了越来越多的重视.相较 iOS,Android 的开发环境更加开放.Android 开发者要测试应用时,只需发个 APK 安 ...

  2. #研发解决方案介绍#Recsys-Evaluate(推荐评测)

    郑昀 基于刘金鑫文档 最后更新于2014/12/1 关键词:recsys.推荐评测.Evaluation of Recommender System.piwik.flume.kafka.storm.r ...

  3. sql server使用中遇到的问题记录

    一.sql server 不能连接远程服务器,但可以连接本地的数据库 我目前用的是sql server 2012 sp1,用着用着突然就不能连接远程服务器上的数据库了,崩溃了一天... 修复试了,卸载 ...

  4. SQL Server 2012实施与管理实战指南(笔记)——Ch4数据库连接组件

    4.数据库连接组件 访问数据库有多种不同的技术,包括ADO,ODBC,OLEDB,ADO.NET等这些都有一些共性.首先要建立连接(Connection),然后通过命令(Command)对数据库进行访 ...

  5. Lucene 4.x Spellcheck使用说明

    Spellcheck是Lucene新版本的功能,在介绍spellcheck之前,我们需要弄清楚Spellcheck支持几种数据源.Spellcheck构造函数需要传入Dictionary接口: pac ...

  6. ural One-two, One-two 2

     One-two, One-two 2 Time Limit:2000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u ...

  7. Unity 碰撞器

    Unity引擎的碰撞器 常见的有Box Collider,Capsule Collider等等 IsTrigger(触发器) 在这些碰撞器中有一个属性 Is Trigger(是否使用触发器) 触发器事 ...

  8. json注入

  9. 嵌入式Linux驱动学习之路(五)u-boot启动流程分析

    这里说的u-boot启动流程,值得是从上电开机执行u-boot,到u-boot,到u-boot加载操作系统的过程.这一过程可以分为两个过程,各个阶段的功能如下. 第一阶段的功能: 硬件设备初始化. 加 ...

  10. java 22 - 21 多线程之多线程的代码实现方式3

    JDK5新增了一个Executors工厂类来产生线程池,有如下几个方法 A.public static ExecutorService newCachedThreadPool() B.public s ...