python生成汉字图片字库
最近做文档识别方面的项目,做汉字识别需要建立字库,在网上找了各种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生成汉字图片字库的更多相关文章
- python 生成随机图片验证码
1.安装pillow模块 pip install pillow (1)创建图片 from PIL import Image #定义使用Image类实例化一个长为400px,宽为400px,基于RGB的 ...
- python生成测试图片
直接代码 import cv2.cv as cv saveImagePath = 'E:/ScreenTestImages/' colorRed = [0,0,255] colorGreen = [0 ...
- Python数据展示 - 生成表格图片
前言 前一篇文章介绍了推送信息到企业微信群里,其中一个项目推送的信息是使用Python自动生成的表格,本文来讲讲如何用Python生成表格图片. 选一个合适库 Python最大的优点就是第三方库丰富, ...
- python生成随机图形验证码
使用python生成随机图片验证码,需要使用pillow模块 1.安装pillow模块 pip install pillow 2.pillow模块的基本使用 1.创建图片 from PIL impor ...
- python 将png图片格式转换生成gif动画
先看知乎上面的一个连接 用Python写过哪些[脑洞大开]的小工具? https://www.zhihu.com/question/33646570/answer/157806339 这个哥们通过爬气 ...
- [Python] 将视频转成ASCII符号形式、生成GIF图片
一.简要说明 简述:本文主要展示将视频转成ASCII符号形式展示出来,带音频. 运行环境:Win10/Python3.5. 主要模块: PIL.numpy.shutil. [PIL]: 图像处理 [n ...
- Python(三) PIL, Image生成验证图片
Python(三) PIL, Image生成验证图片 安装好PIL,开始使用. 在PyCharm中新建一个文件:PIL_Test1.py 1 # PIL 应用练习 2 # 3 # import PIL ...
- 012. asp.net生成验证码图片(汉字示例/字母+数字)
protected void Page_Load(object sender, EventArgs e) { //生成验证码图片的基本步骤 string checkCode = "新年快乐& ...
- Python | 一键生成九宫格图片
一键生成九宫格图片 首先我们准备几张图片: 将代码文件放在放置图片的地方,用软件打开: 点击运行,在当前目录下会生成一个文件夹: 打开新生成的文件夹: 打开对应图片的名称文件夹: 如果不想图片被分成9 ...
随机推荐
- js中Prototype属性解释及常用方法
1.prototype的定义 javascript中的每个对象都有prototype属性,Javascript中对象的prototype属性的解释是:返回对象类型原型的引用. 每一个构造函数都有一个属 ...
- Druid 数据库连接池监控配置(web项目)
Spring数据源配置: <!-- 数据源 --> <!--<bean id="dataSource" class="org.apache.com ...
- R语言Data Frame数据框常用操作
Data Frame一般被翻译为数据框,感觉就像是R中的表,由行和列组成,与Matrix不同的是,每个列可以是不同的数据类型,而Matrix是必须相同的. Data Frame每一列有列名,每一行也可 ...
- 找出如下数组中最大的元素和最小的元素, a[][]={{3,2,6},{6,8,2,10},{5},{12,3,23}}
int [][]a={{3,2,6},{6,8,2,10},{5},{12,3,23}}; //先对二维数组进行遍历:然后把二维数组合成一个数组 int[] k=new int[11]; int q= ...
- sql server 警报管理,实时监听数据库动向,运筹帷幄之中
工作这么多年了,无论是身边的同学还是同事,发现只要搞程序员的都有一个通病---懒.懒到谁都不愿意加班,尤其是"义务"加班.即使大家都不愿意加班,但是很多时候项目赶着上线或者上线之后 ...
- MongoDB学习——基础入门
MongoDB--基础入门 MongoDB是目前比较流行的一种非关系型数据库(NoSql),他的优势这里不废话,我们关注怎么使用它. 安装 下载,首先肯定要去下载,我们去官网下载,在国内,可能没FQ可 ...
- 使用 jsoup 解析HTML
// 参考资料: // http://www.jb51.net/article/43485.htm @Test public void AnalysisHTMLByString() { String ...
- 简易的GCC图形界面GCCUI
这个 GCCUI.EXE 是配合上一篇博文<用VC6开发嵌入式LINUX程序>说的:用VC6辅助开发LINUX程序的时候使用.把 gcc 编译器增加一个简易的图形界面,可以自动读取 vc6 ...
- RabbitMQ与Redis队列对比
本文仅针对RabbitMQ与Redis做队列应用时的情况进行对比具体采用什么方式实现,还需要取决于系统的实际需求 简要介绍 RabbitMQ RabbitMQ是实现AMQP(高级消息队列协议)的消息中 ...
- Server Tomcat v7.0 Server at localhost failed to start.临时解决办法
错误名:Server Tomcat v7.0 Server at localhost failed to start. 解决办法:去掉下面这句话: (通常在代码开头部分,public class前) ...