序言
过几天要在弟子班的群里讲一下笔墨识别,涉及到字库制作的知识点,以是这期先做个文章讲解方便学员学习。
一、字库文件的制作
![[按键精灵]字库文件你打开看过吗?为啥你做的字库不好用?_字库_文字 科学 [按键精灵]字库文件你打开看过吗?为啥你做的字库不好用?_字库_文字 [按键精灵]字库文件你打开看过吗?为啥你做的字库不好用?_字库_文字 科学](http://www.iirqv.cn/zb_users/upload/2024/08/20240812203500172346610044854.jpeg)
字库文件的制作分为两种:自动天生和手动编写。
自动天生是常用的方法,手动编写比较麻烦基本不用,稍后我们讲事理的时候会讲到,如果你已经会制作字库,可以直接跳过第一部分,直接看最下面的字库事理。
自动天生字库的过程:
①利用抓抓工具,抓取含有要做字库的笔墨所在的屏幕画面
②、在抓抓截图上右键,点击选取范围
③、激活“选取范围”功能后,框选要做字库的笔墨,并确认范围
④、右键通过拾色功能选取笔墨笔画上的一个像素颜色。
这一步会得到一个二值化的笔墨图片,下图中间预览图
⑤、微调偏色的数值,使预览图中笔墨的笔画变得完全。
⑥、点击“制作字库”按钮,开始制作字库
⑦、提取点阵,根据笔墨字数选择“单个”或者“多个”,在提取点阵(多个)时,会哀求填写行间距和列间距。
这个行、列间距是指的两个字(笔画)之间的间隔最小值,比如两个字之间的空隙是2个像素,如果设置间距是1或者2,小于笔墨空隙,制作字库就会认为这是两个字,如果设置间距为3,那么制作字库时就会认为这是一个字。
⑧、提取点阵之后,会得到多个字库数据,点击它们,分别查看它们对应哪个字,并在笔墨定义位置填上这个字。
这一步是把二值化的图像和笔墨对应上,让脚本知道看到这个图像就代表这个笔墨。
每定义一个笔墨就点击右侧的添加到字库按钮,就可以保存到字库文件里面,字库文件是一个txt文本。
⑨利用字库文件
不才方有自动天生代码的按钮,须要笔墨识别便是点ocr脚本,须要找笔墨位置就点findstr脚本。
SetRowsNumber(0)//把稳:每次制作完字库后,须要自行把制作的字库文件添加到脚本“附件”中TracePrint SetDictEx(0, "Attachment:mq_soft.txt")TracePrint UseDict(0)//以上两句脚本只须要调用一次Dim ocrcharocrchar=Ocr(688,9,704,40,"FFFFFF-333333",0.9)Traceprint ocrchar
二、字库的事理
字库的浸染是把图像“笔墨化”,如下图所示,对付脚本来说它是一个黑白像素点组成的图片,对付我们人来说这个图是一个数字“2”,我们做字库便是见告脚本这个图代表数字“2”,往后碰着一样的图都要识别成数字“2”。
做字库之前先要有黑白图,这就要二值化处理,处理依据是比色,在自动天生字库的过程中有一个拾取颜色的操作,便是选中笔墨上一个像素点的颜色,这个实在便是用来比色的基准色,如果颜色和这个基准色相同(相似)便是用白色表示,反之用玄色表示,终极形成黑白二值化图片。
怎么用字库把这个黑白二值化图记录下来,打开一个字库文件看一下:
这个字库文件里面有3条字库数据,每一行是一条数据。
300FC07C03E03981871C17E040010000 $ 2 $ 0.0.40 $ 14
一条数据由4个部分组成,每一部分都有不同浸染,它们之间用 $ 分别隔,下面我们依次说一下:
①、第一部分300FC07C03E03981871C17E040010000
二值化转成十六进制的数据,末位补了一个0
先把图像二值化写出来:
玄色像素用0表示,白色像素用1表示,垂直方向从上往下依次开始
第一列:00110000000011
第二列:11110000000111
……
末了一列:0000000000000
然后把所有的连接在一起:
001100000000111111000000011111000000001111100000001110011000000110000111000111000001011111100000010000000000000100000000000000
每四位转成一个十六进制的数字,为啥是四位?由于2的四次方是16。
比如:
0011 => 30000 => 00000 => 01111 => F……
全部二进制都写完便是字库里面的十六进制数据。
这里有两个问题:
一是为啥要把所有列的二值化连接起来,由于每一列的数据不一定是4的倍数,如例子中一列是14个点,不能被4整除,就须要从下一列中补齐,利用连接的办法把所有列合并在一起,就可以方便得到4位二进制数据。
二是全部连接后的数据,如果不是4的倍数,那么就末位补0
比如我们这个便是每列16个像素,有9列,一共是126个
②、第二部分数字2
这一部分便是笔墨定义,也便是我们这条字库数据代表什么笔墨,这里便是代表数字2。
③、第三部分 0.0.40
0.0 是固定值,40是二值化中1的数量
④、第四部分 14
14是每一列的像素数
上面便是字库数据的4个组成部分,利用这4个数据就可以精准定义一个二值化的图像。
三、自己做的字库为啥常常不好用
举个例子,这是同一个屏幕上截图的两个2
看起来是不是一样的,但是如果我放大一下,就看到差别了。
第一个图有113个 “1”
第二个图有111个 “1”
无论从二值化的排列上,还是1的数量两者都不一样,以是两者的不能通用的,要想都能识别,就须要在字库文件中做两条字库数据。
很多人做字库都是一个字一条字库数据,这就导致“字库失落效”,要想做个“优质”的字库,就要每个笔墨做多条字库数据。
当然字库数据也不是随便做的,每次识别不到了,就给字库加上一条,当你把所有可能的二值化样子都做成字库数据,便是一个可用的字库了。
正文完=