博舍

笔迹鉴别 笔迹鉴定是机器还是人工做

笔迹鉴别

一、文字切割

字迹在经过初始处理后,被制作成黑白二值图保存。这个步骤比较简单,可以使用PhotoShop等工具进行处理。剩下的工作就是从字迹中将一个一个的汉字摘出来,用来制作纹理图片。我采用的方法是通过字切割的方式,当然也有一些文献采用另外的较简单的方式进行处理(比如只是去掉行间、文字间的空白)。

1、行切割

对于得到的黑白二值图进行统计处理。统计黑白点阵图中每行中黑色像素的数量,得到一统计向量,该向量中极小值所对应的位置就应当是分行的地方。代码相对简单,不再赘述。

2、字切割

行切割完成后,就需要将每行中的文字切割下来,这次是对每行文字的黑色像素进行纵向统计,黑色像素数量极小的地方就有可能是分字的地方。之所以说“可能”是因为有很多汉字是左右结构(比如“朋”字),在两个“月”字中间的区域对应的黑色像素数量也很小,甚至是0,因此需要采取某种偏旁部首合并策略,将可能的左右结构汉字重新合并到一起,作为一个汉字处理。另外在进行字切割时还应当将可能是标点符号的字符去掉,防止标点符号影响字迹的识别。

我的程序中首先对初步字切割的结果进行判别,剔除标点符号。标点符号往往宽度较小,同时像素统计值比较少。然后,采用自右向左的顺序进行偏旁部首合并(之所以选择自右向左是因为汉字中左窄右宽的文字比重较大,自右向左合并的成功性较大),如果经尝试合并后的文字宽度与字迹中平均文字宽度差不多的化,就进行合并处理。

当然有时候需要进行文字切分,当发现某个切分结果过宽时,就可能预示两个汉字挨得太紧,需要进一步切分开。

经过一番文字切分、偏旁部首合并策略的的调整,我的程序能够较成功的将字迹中的文字逐一切割下来。切割结果如下图所示:

3、关键代码

在文字切割部分中用到的关键代码主要是黑白图像的读取代码。我程序中主要使用的是PixelFormat.Format1bppIndexed格式的PNG图像,一个二进制位对应一个像素点,这样比PixelFormat.Format1bppIndexed格式的BMP文件要节省磁盘空间。有关此类图像的处理技巧,可以参考:《UsingtheLockBitsmethodtoaccessimagedata》。这里将部分行切分时用到的代码放上来:

#regionSetIndexedPixelandGetIndexedPixelforFormat1bppIndexedpngfileprotectedvoidSetIndexedPixel(intx,inty,BitmapDatabmd,boolpixel){intindex=y*bmd.Stride+(x>>3);bytep=Marshal.ReadByte(bmd.Scan0,index);bytemask=(byte)(0x80>>(x&0x7));if(pixel)p|=mask;elsep&=(byte)(mask^0xff);Marshal.WriteByte(bmd.Scan0,index,p);}privateboolGetIndexedPixel(intx,inty,BitmapDatabmd){intindex=y*bmd.Stride+(x>>3);bytep=Marshal.ReadByte(bmd.Scan0,index);bytemask=(byte)(0x80>>(x&0x7));if(((int)(p&mask))==0)returntrue;elsereturnfalse;}#endregionprivatevoidCalcBlackDotsOfLine(){Bitmapbm=newBitmap(this.ImageFileName);BlackDotsOfLine=newint[bm.Height];BitmapDatabmdn=bm.LockBits(newRectangle(0,0,bm.Width,bm.Height),ImageLockMode.ReadOnly,PixelFormat.Format1bppIndexed);for(inty=0;y

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。

上一篇

下一篇