字模提取详细解读

合集下载

img2lcd 字模提取原理

img2lcd 字模提取原理

img2lcd 字模提取原理
哎呀,你这问题可有点意思啊,要用四川话、陕西话、还有北京话混合着来回答。

那我就试试看,咱们先聊聊这img2lcd字模提取原理吧。

咱们先从四川话开始。

说起这个img2lcd,那可不简单哦,它的原理就像咱们四川的火锅一样,得一层层地揭开才能看到里面的好东西。

你要先有个图片,就像火锅里得有各种食材一样,然后img2lcd就能帮你把这个图片里的字模给提取出来,就像火锅里把食材煮熟了捞出来一样。

再来说说陕西话。

陕西的汉子们都知道,咱这地方讲究实在。

img2lcd字模提取原理也是这么回事,你得实实在在地给它一个图片,它才能实实在在地给你提取出字模来。

这原理就像咱陕西的黄土高原一样,你得脚踏实地,才能看到它的真实面貌。

最后咱们来聊聊北京话。

在北京,人们讲究的是个明白。

img2lcd字模提取原理就是让你明白,原来图片里的字模可以这么简单地提取出来。

就像北京的四合院一样,看似复杂,其实结构清晰,一目了然。

所以说啊,这个img2lcd字模提取原理,就像咱们各地的方言一样,各有各的特色,但都是为了让人更好地理解和使用。

不管你是四川人、陕西人还是北京人,都能通过这个原理,轻松地把图片里的字模提取出来。

这就是它的神奇之处,也是它的魅力所在。

汉字字模提取技术

汉字字模提取技术
K y r s D t txc aatr e wo d o r h rce ma i Ve tr o t co n f T u T p n AP n t n r e y ef t o I u ci s f o
随着嵌 入式技术 的发展 , 各类智能 电子装置 日益增多 , 在这
pi t n o t f i e o oio vr t o n l p n il,o ot u eet ci e o s n l - l a o i e o t mps i o a aiy fo t e r cpe t f t fh r t nm t d dr a c i p n ov w n h c t n f e f f i i n o ot x a o h a et e c n l e. dt h o g s e o i
每个汉字 的字模生 成后 , 照区位码的顺序存储构成 点阵 阵 占 3 个 字 节 。 按 2 字库 文件 。使 用时需要打开字库文件 , 通过一定方法计算 出某 个汉 字字模 的存 储位置 ,然后从 该位置读 出若 干字节 的点 阵 数据 。
1计 算 区位 码 、 设 汉 字机 内码 的两 个 字 节 为 H L , H L 区码 q , 码 为 w , h位 h则
1 阵 字模 , 个 点 阵 由 2 6个 点 组 成 , 行 切 分 每 行 1 6点 每 5 按 6位 占
个 字 节 为 ( 6进 制 )0 07 4 FF 08 0A 。 1 :0 88 4 E5 05 O 8
2 计算汉字点阵数据存储位置偏移量 、
偏 移 量 是 指 字模 首 字 节距 离 文 件 头 的相 对 位 置 ,其 计 算原

个 n Xn的点阵字符 ,其生成方法就是 在一个具有 nXn 个小

汉字字模存储和提取的方法

汉字字模存储和提取的方法

汉字字模存储和提取的方法
汉字字模的存储和提取是汉字信息处理系统中的重要环节,常用的方法有以下几种:
1. 存储在程序存储器中:这是在程序不大或单片机无外部扩展数据存储区功能的情况下使用的方法。

2. 通过外扩的EEPROM存储汉字字模数据:采用哈佛结构的单片机,如8051单片机及其派生产品,程序存储器(ROM)和数据存储器(RAM)可分别寻址。

将提取的汉字字模数据存放在EPROM或EEPROM内,并设定该芯片的片选地址,只要知道某个汉字字模数据在该芯片的存储位置,通过程序计算出偏移地址,即可实现显示功能。

3. 使用外扩的EEPROM存储整个汉字库:某些高端单片机,如Motorola 的M68300系列32位单片机,寻址范围可达8M。

以上信息仅供参考,如有需要,建议查阅计算机科学和电子工程相关书籍或咨询专业人士。

字模提取详细解读

字模提取详细解读

/*打开字库文件 asc16*/ if((ASC=fopen("asc16","rb"))==NULL){ printf("Can't open asc,Please add it?"); getch(); exit(0); } offset = *(c)*16+1; fseek(ASC,offset,SEEK_SET); fread(buff, 16, 1, ASC); /*通过 ascii 码算出偏移量*/ /*将文件指针移动到偏移量的位置*/ /*从偏移量的位置读取32个字节*/
英文字模的信息,我们就先得到这个字符的 ASCII 码。 以得到字符"A"的字模信息为例: 假如我们要得到的字母 A 的字模信息,我们得到"A"的 ASCII 值为 65,我们就 可以算出字符"A"的字模信息在 ASC16文件中的偏移量=(65*16)+1=1041字 节(注意这个数字,我们将在后面用程序进行验证),我们只需要从 ASC16文件 中1041字节开始读取16个字节就可以得到 "A"的字模信息了。
#include "stdio.h"
/********************************** * 得到英文字符的字模信息,存入数组 * 参数:
* *
*c:要得到字模信息的字符指针 buffer[]:存储得到字模信息的数组
* 无返回值 ***********************************/ void getAscCode(char *c,char buff[]) { unsigned long offset; FILE *ASC;

字模提取方法举例详解

字模提取方法举例详解

1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 1 1 2 2 3 3 4 4 5 5 6 6 7 7 88逐列式:0x00,0x10,0x04,0x10,0x04,0x90,0xF4,0x5F, 0x54,0x35,0x54,0x15,0x54,0x15,0x5F,0x15, 0x54,0x15,0x54,0x15,0x54,0x35,0xF4,0x5F,0x04,0x90,0x04,0x10,0x00,0x10,0x00,0x00,/*"真",1*/ 逐行式:0x80,0x00,0x80,0x00,0xFE,0x3F ,0x80,0x00, 0xF8,0x0F,0x08,0x08,0xF8,0x0F,0x08,0x08, 0xF8,0x0F,0x08,0x08,0xF8,0x0F ,0x08,0x08,0xFF,0x7F,0x10,0x04,0x08,0x08,0x04,0x10,/*"真",0*/ /* (16 X 16 , 宋体 )*/字模中每一点使用一个二进制位(Bit)表示 字模提取有两种排列方式:逐列式、逐行式 逐列式:即从左端起,每列开头第1个点最后一个点。

逐行式:即从第1列起,每行第1个点到最后一个点。

两种取码方式:阴码、阳码 阴码:亮为1,灭为0 阳码:亮为0,灭为1下面以16*16点阵取“真”字为例,有逐列式和逐行式两段程序,且都为阴码。

程序中是十六进制,在字模提取时转换为二进制,逐列式:从第1列开始,每列16位,且从低位到高位,需2个十六进制数,如第列:0x00,0x10,转二进制:0000 0000;0001 000;对应方格中相应的位。

依次类推24*24点阵取模方法。

彩屏字模提取说明

彩屏字模提取说明

彩屏字模提取说明1、打开软件“航太电子资料\5.常用软件\取字模软件\PCtoLCD2002.exe”,点开选项,进行如下配置:2、配置完成后即可输入需要的汉字或英文,点击生成字模生成下面的数组3、复制生成的数组到工程文件“ch_enlib.c”的结构体数组struct CnCharType code cn_char[] 下面如下所示:struct CnCharType code cn_char[] ={0x02,0x00,0xFA,0x00,0x0B,0xE0,0x8C,0x20,0x58,0x40,0x51,0x00,0x21,0x00,0 x21,0x00,0x52,0x80,0x52,0x80,0x84,0x40,0x08,0x20,"欢",//00x84,0x00,0x59,0xE0,0x11,0x20,0x11,0x20,0xD1,0x20,0x51,0x20,0x55,0x20,0 x59,0x20,0x51,0x60,0x41,0x00,0x41,0x00,0xBF,0xE0,"迎",//10x11,0x00,0x11,0x00,0x2F,0xE0,0x21,0x00,0x6F,0xE0,0xA9,0x20,0x2F,0xE0,0 x29,0x00,0x25,0x00,0x22,0x00,0x25,0x80,0x28,0x60,"使",//20x00,0x00,0x7F,0xC0,0x44,0x40,0x44,0x40,0x7F,0xC0,0x44,0x40,0x44,0x40,0 x7F,0xC0,0x44,0x40,0x44,0x40,0x44,0x40,0x81,0xC0,"用",//30x21,0x00,0x78,0x80,0x4F,0xE0,0x68,0x00,0x58,0x00,0x4B,0x80,0xFA,0x80,0x4A,0x80,0x6A,0x80,0x5A,0xA0,0x4C,0xA0,0x98,0x60,"航",//40x04,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0x04,0x00,0x0A,0x00,0x0A,0x00,0 x12,0x00,0x11,0x00,0x29,0x00,0x44,0x80,0x80,0x60,"太",//50x08,0x00,0x08,0x00,0xFF,0x80,0x88,0x80,0x88,0x80,0xFF,0x80,0x88,0x80,0 x88,0x80,0xFF,0x80,0x88,0x20,0x08,0x20,0x07,0xE0,"电",//60x00,0x00,0x3F,0x80,0x01,0x00,0x02,0x00,0x04,0x00,0x04,0x00,0xFF,0xE0,0 x04,0x00,0x04,0x00,0x04,0x00,0x04,0x00,0x1C,0x00,"子",//70x20,0x80,0x11,0x00,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0x44,0x40,0x7F,0xC0,0 x04,0x00,0xFF,0xE0,0x04,0x00,0x04,0x00,0x04,0x00,"单",//80x01,0x00,0x21,0x00,0x21,0x00,0x21,0x00,0x3F,0xE0,0x20,0x00,0x20,0x00,0 x3F,0x80,0x20,0x80,0x40,0x80,0x40,0x80,0x80,0x80,"片",//90x20,0x00,0x27,0x80,0x24,0x80,0xF4,0x80,0x24,0x80,0x74,0x80,0x6C,0x80,0 xA4,0x80,0x24,0x80,0x24,0xA0,0x28,0xA0,0x30,0x60,"机",//100x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0 x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00," ",//空字符};4、在后面即可直接使用该汉字了,本字模是12*12大小的,用户可以根据实际需要,参考demo程序,改成其他大小的字模。

(33条消息)汉字常用特征的提取方法详解

(33条消息)汉字常用特征的提取方法详解

(33条消息)汉字常用特征的提取方法详解汉字模板制作:汉字模板即是对字模图片进行特征提取,将特征数据存放到存储器上构成模板。

模板制作与提取待识别汉字特征需要将原始汉字图片进行归一化,可增加特征的鲁棒性。

汉字数据尺度归一化到为64*64,归一化方法很多,最常用的是基于重心的归一化,不做详细介绍。

网格特征:在实际中,为了增加特征的鲁棒性,常常采用网格技术。

即统计汉字某一区域内特征的总和,这样可以削弱局部干扰。

网格结构主要是等分网格和弹性网格。

等分网格即是把原图像按尺寸平均分割为若干小网格,弹性网格则根据笔画密度划分原始图像。

弹性网格对字符位置偏移、扭曲更加不敏感,是目前使用最多的网格结构,考虑到“一” “l”等极端过窄字符,限制弹性网格弹力范围。

汉字的网格特征:汉字常用特征有:粗外围特征、外轮廓特征、内轮廓特征、方向线素特征。

其中粗外围、外轮廓用于粗分类,外轮廓、内轮廓、方向线素用于细分类。

1)粗外围特征该特征用于描述汉字较粗糙的结构信息。

首先对原汉字进行细化处理,得到汉字的骨架图像。

常用的图像细化算法均可,推荐使用R方法其速度较快。

R算法的一个链接:/detail/jy02660221/9584580原图像与骨架图像首先对骨架图像进行内部区域填充处理。

若该点为白色(非笔画区域),则检测其上下左右四个方向是否有笔画,若都有笔画则认为该点为内部区域,将白色置为黑色,依次处理完所有白点。

然后将填充图分成4*4共16个小块,统计每一小块黑色点数(笔画)数量,构成16维粗外围特征。

特征提取示意如下。

填充图及粗外围特征2)外轮廓特征该特征用于描述汉字外部轮廓信息。

原汉字二值图像沿上下左右4个方向进行扫描。

为了提高对字符形变的鲁棒性,本文用弹性网格对扫描区域进行划分,统计该部分第一次碰到笔画的面积。

如下图(箭头表示的扫描方向) ,每个方向被分为了 4 个区域,每个区域阴影面积即是 1维特征。

那么经该处理后,得到 4*4=16 维特征。

Windows矢量字体字模的提取

Windows矢量字体字模的提取
至 此 "汉 字 的 点 阵 化 过 程 就 完 成 了 "接 下 来 就 应 该 提 取字模%
[[ 位 图 的 宽 度 不 是 j 的 整 数 倍 "
[[ 所 以 只 需 要 h7"[j " ‘ 个 字 节 来 存 储 字 模 [[ 将 字 模 数 组 全 置 d
" 提取字模
提 取 字 模 要 用 到 的 是 Q"%F7I"# 函 数 " 定 义 为 9&h&e !
TS)QSX, 结 构 的 指 针 ! 具 体 定 义 为 VQSX, :-/?G/ " Q%#G+#("-/gGH:SXO, TS)QSX, ! Y1Y>L # 代 码 如 下 %
VQSX, ;X/&Q%#GE:-/?G/Q%#G+#("-/gGHaY%[>%#GL )
至 此 字 体 创 建 就 完 成 了 # 直 接 调 用 O/Y/GSij/gG 函 数 就
武汉大学电子信息学院 !"#$$%&’
摘 要 ! 利 用 !"#$%&’ 提 供 的 丰 富 的 字 体 库 ! 调 用 !"#() *+, 函 数 ! 将 矢 量 汉 字 文 本 转 化 为 位
图 ! 以提取汉字字模 ! 用于电子系统的信息显示 " 关键词 ! !"#-%&’ 矢量字体 !"#() *+, 函数 汉字字模 位图
在 yEVF;C*W 消 息 中 " 调 用 Q"%k7G- ) )K2E j 的 整 数 倍 " 所 以 [[ 只 需 要 h7"[j 个 字 节 来 存 储 字 模
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

offset = (94*(qh-1)+(wh-1))*32L;/*计算该汉字在字库中偏移量*/ fseek(HZK,offset,SEEK_SET); fread(buff,32,1,HZK); /*将文件指针移动到偏移量的位置*/ /*从偏移量的位置读取32个字节*/
printf("qh:%d,wh:%d,offset:%ld\n\r",qh,wh,offset); }
前不久,在网上看到一个生成点阵字的网站。觉得很有意思! 到底什么是点阵字,点阵字和字模之间有什么关系?
让我们先看一个点阵汉字和一个英文字母:
** ************************** ** ** ** ** ** **
************************** ** ** ** ** ** ** **
一个专门的文件中,这个文件在 UCDOS 和 CCDOS 中都有, 文件名是 HZK16。 也就是16x16点阵的汉字字模信息,所谓16x16,就是说这个汉字在横向有16 个点,和纵向16个点的区域里显示。还有 24x24,32x32等。 我们也可以在 UCDOS 下找到英文字模的信息文件,文件名是 ASC16,这里记 录了英文字符的字模信息。ASC16文件记录的英文字符是 8x16点阵的。这些记 录字符字模信息的文件通常也叫字库文件。
看一个 C 程序示例:
程序代码
main() { unsigned char *s,*e="A",*c="王"; clrscr(); printf("English char ="); s=e; while(*s!=0) /*C 的字符串以0为结束符*/ { printf("%3d,",*s); s++; } printf("\nChinease char="); s=c; while(*s!=0) { printf("%3d,",*s); s++; } getch(); }
ASC16文件的大小刚好为 4K (4,096 个字节),每一英文字符横向有8个点, 纵 向有16个点。也就是说要描述一个英文字符的点阵信息,必须要 16*8=128bit=16Byte。而英文字符是一个字节表示,所能表示的最字符数为 2 的8次方,也就是256个字符(ASCII 中是从0到 255)。256个字符*16(每个字符 要16个字节) = 4096 字节。 刚好为 ASC16文件的大小。因此,我们要读取
***********************************/ void getHzKCode(char *c,char buff[]) { unsigned char qh,wh; unsigned long offset; FILE *HZK;
/*打开字库文件 hzk16*/ if((HZK=fopen("hzk16",&##39;t open haz16,Please add it?"); getch(); exit(0); } /*区码=内码(高字节)-160 位码=内码(低字节)-160*/ qh wh = *(c) -0xa0; = *(c+1) -0xa0; /*10进制的160等于16进制的 A0*/ /*获得区码与位码*/
#include "stdio.h"
/********************************** * 得到英文字符的字模信息,存入数组 * 参数:
* *
*c:要得到字模信息的字符指针 buffer[]:存储得到字模信息的数组
* 无返回值 ***********************************/ void getAscCode(char *c,char buff[]) { unsigned long offset; FILE *ASC;
******************************
........ ...#.... ..###... .##.##..
##...##. ##...##. #######. ##...##. ##...##. ##...##. ##...##. ........ ........ ........ ........ ........
printf("ASCII:%d,offset:%d \n\r",*c,offset); }
/********************************** * 得到汉字字符的字模信息,存入数组 * 参数: * * *c:要得到字模信息的字符指针 buffer[]:存储字模信息的数组
* 无返回值
/********************************** * 根据字模信息输汉字字符 * 参数: * * * *mat:字模指针 *c1 :字模中为1的点显示的字符,也就是前景字符 *c2 :字模中为0的点显示的字符,也就是背景字符
让我们先来认识一下区位码: 1981年 5月,我国国家标准总局颁布了《信息交换用汉字编码字符集》 (GB2312-80) ,简称国家标准汉字编码,也叫国标码。国标码共收进标准字 符7445个。其中一级汉字3755个,二级汉字3008个,共计6763个汉字。 由 于汉字的字符多,一个字节(即8位二进制代码)不足以表示所有的常用汉字。 汉字国标码的每个汉字或符号在计算机中都使用2个字节( 16位二进制)代码 来表示。
现在我们知道,可以从区位码得到汉字,也可以从汉字反查出区位码。那么我 们如何从内码得到区位吗? 汉字内码与区位码之间有一个简单的数学关系:
内码高字节 = 区码+A0H = 区码 +160 内码低字节 = 位码+A0H = 位码+160
这个转换关系,我也不清楚原因,有谁知道还望指点。网上的大师们说这样转 换,咱们就这样转换吧。
汉字字模: 现在让我们来认识一下什么是字模, 所谓字模就是是汉字 (或者字符) 的形态。 字模中保存了汉字的点阵信息,记录组成一个字符的点在何处显示,在何处不 显示。我们只要得到汉字的字模,我们就可以很容易的程序来控制,把这个字 符画出来。 我们刚刚得到的仅仅是汉字的内码, 并根据汉字内码得到区位码,由区位码查 表得到汉字。那么我们如何来得到汉字的字模了? 用过 UCDOS( 或者 CCDOS , 估计现在只有少数人还知道 UCDOS 是什么东东) 的人应该知道,通过 UCDOS 可以让 DOS 系统下正确的显示中文目录。不通 过 UCDOS 之类的软件,在纯 DOS 下,我们看到的中文目录会是一堆的乱码, 而英文目录能够正确显示,这是什么原因了。 这是因为,英文的字模信息是一般固化在 ROM 里。中文字模信息一般记录在
英文字模的信息,我们就先得到这个字符的 ASCII 码。 以得到字符"A"的字模信息为例: 假如我们要得到的字母 A 的字模信息,我们得到"A"的 ASCII 值为 65,我们就 可以算出字符"A"的字模信息在 ASC16文件中的偏移量=(65*16)+1=1041字 节(注意这个数字,我们将在后面用程序进行验证),我们只需要从 ASC16文件 中1041字节开始读取16个字节就可以得到 "A"的字模信息了。
而每一个汉字占32个字节,因此我们得到“王”字在字库文件(HZK16) 中的偏移 量为: 4220*32=135040字节 (注意这个数字, 我们在后面将用程序进行验证 )。 我们只需要从 HZK16文件中135040字节开始读取32个字节就可以得到“王 ”字 的字模信息了。
完整的原程序代码如下:
在 GB2312-80代码表中,纵向分为0~93,共 94行。将行号称为区号,列号称 为位号,分别有94个区和94个位。区号和位号用十进制表示,不足两位前面 补0。这样每个汉字或符号都可用 4位十进制表示。这就是我们常说的区位码。 每一区共有94个汉字,而位记录该汉字在该区中的具体位置。(记得我们以前 读书的时候,报考计算机考试,填写姓名都要我们用区位码填,我们都拿着自 己的姓名一个个去查, 我们查的那个东东就是区位码。 现在想想, 真是心寒呀。 还好,我后来就没有查了,弄了个 excel 的宏。把班上人的姓名全部放到一个 excel 中,然后一点鼠标,哈哈 …… 区位码全自动出来了)。
/*打开字库文件 asc16*/ if((ASC=fopen("asc16","rb"))==NULL){ printf("Can't open asc,Please add it?"); getch(); exit(0); } offset = *(c)*16+1; fseek(ASC,offset,SEEK_SET); fread(buff, 16, 1, ASC); /*通过 ascii 码算出偏移量*/ /*将文件指针移动到偏移量的位置*/ /*从偏移量的位置读取32个字节*/
同样,我们来看一下汉字字模。 汉字是16*16的所以描述一个汉字字模信息的大小为: 16*16=256bit=32Byte,汉字是按照区位码的顺序来排列的。 我们以得到”王“字的字模信息为例: 我们先得到”王“字的内码为:205,245,根据内码与区位码的转换关系得到 ” 王“字的区位码为:45,85。 由前面区位码介绍中, 我们知道, 每一区有94个汉字, 位号表示在该区的位置。 因此“王”字中区位码中的位置为: 94*(区号 -1) + (位号-1) = 94*((45-1)+(85-1)) = 4220。
我们刚刚输出“王 ”的内码为:205(高字节),245(低字节)。 由上面的换算关系, 可以得到“王”字的区位码为: 区码=205-160=45 位码=245-160=85
查一下区位码表,4585所表示的汉字正好是“王”。 也可以打开输入法,选择内码输入法,然后选择区位码,输入4585,就会输 出“王”字。
相关文档
最新文档