我做的《笔迹鉴别》是与文字无关的笔迹鉴别,简单的说就是你提供给我多个人手写的“一二三四”,然后再提供给我其中一个人写的“五六七八”,我就可以通过程序判断究竟是谁写的。待识别的文字与我手头掌握的文字资料可以是不同的汉字,这就是所谓的与文字无关的笔迹鉴别。当然仅仅提供四五个汉字是不行的,需要提前准备大量的笔迹素材才可以。
我主要采用“纹理识别”的方式进行笔迹鉴别,也就是将笔迹看作是某种纹理(就像布纹、木纹一样),纹理相同的就认为是笔迹相同。而目前纹理识别我使用的是“加窗傅立叶变换”Gabor变换,利用Gabor变换提取不同频率、不同方向的笔迹特征,最后使用KNN或SVM(支持向量机)对待测样本进行类别判别。
基本步骤如下:
** 笔迹图像预处理
1、 笔迹图像扫描2、 去除稿纸中的分割线,转换成黑白二值图(目前使用PhotoShop实现)
3、 中值滤波,去除图片中的椒盐噪声(目前使用MatLab实现)
4、 倾斜校正(尽管可以使用一些现成的算法,但目前使用手工倾斜校正)
** 文字切分、纹理制作
5、 行切分、字切分(根据象素的统计信息进行切分,对于汉字中常见的左右结构以及偏旁部首等设计了偏旁部首合并策略,确保汉字的完整性。此部分自己编程实现)6、 纹理图像的制作(对切分下来的汉字将文字长、宽归一化,制作纹理图像,自己编程实现)
** Gabor变换,提取纹理特征
7、 对纹理图像进行Gabor变换(自己编程实现。由于在时域进行二维离散卷积需要大量的运算时间,因此我通过二维傅立叶变换将其转换到频域求乘法,实验表明卷积求解效率提高了近50倍),提取纹理特征(一64维向量)。8、 对Gabor变换产生的结果进行数据库存贮,以备将来识别使用(为了简便起见,我目前使用VFP,如果将来数据量再大的话,可以考虑使用SQL Server等数据库)。
** 对待测样本进行鉴别
9、 对待处理样本采用同样的处理方法提取纹理特征,然后使用KNN临近聚类的方法或SVM进行分类。(KNN自己编程实现,SVM使用现成的LibSVM。当然也有C#版的LibSVM可用来融入自己的程序中)实验表明(我只采集了9个人的笔迹),识别率可以达到91.67%以上,采取某种措施后,9人笔迹鉴别的成功率可达到100%(目前由于笔迹采集有限,才达到100%,随着笔迹样本的增加,成功率可能有所下降)。
我会在随后的文章中将以上步骤中的关键技术和关键代码放上来供大家参考。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库