python生成汉字图片字库,, pygame渲染字体来
python生成汉字图片字库,, pygame渲染字体来
最近做文档识别方面的项目,做汉字识别需要建立字库,在网上找了各种OCR,感觉都不好,这方面的技术应该比较成熟了,OCR的软件很多,但没有找到几篇有含金量量的论文,也没有看到哪位大牛公开字库,我用pygame渲染字体来生成字库,也用PIL对整齐的图片进行切割得到字库。
pygame渲染字体来生成字库
用pygame渲染字体我参考的这篇文章,根据GB2323-8标准,汉语中常用字3500个,覆盖了99.7%的使用率,加上次常用共6763个,覆盖99.99%的使用率。先生成一个字体图片,从网上找来3500个常用汉字,对每一个子按字体进行渲染:
Pythondef 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保存成图片,像下面这样:
密密麻麻的字,但非常整齐,不需要什么图片处理算法,只要找到空白的行和列,按行和列就可以进行切割,切割出来也好,只要保存有序切割,切出来的图片依然可以与字对应,下面是切割的代码:
Python#!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('1') 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]代码#!
- Python加pyGame设计的简单拼图游戏,pythonpygame,import pyga
- python通过PyGame模块播放声音,pythonpygame,import pygam
- python通过PyGame播放Midi和Mp3文件,pythonpygame,''' pg_midi_
- python通过PyGame模块播放声音,pythonpygame,import pygam
- python学习笔记(七) 类和pygame实现打飞机游戏,pythonpy
- Python资源大全中文版,,环境管理管理 Pyt
- Python通过Pygame绘制移动的矩形实例代码,pythonpygame
- Python编程pygame模块实现移动的小车示例代码,pythonpyg
- 使用pygame模块编写贪吃蛇的实例讲解,pygame实例讲解
评论关闭