(本系列只需要modelsim即可完成数字图像的处理,每个工程都搭建了全自动化的仿真环境,只需要双击top_tb.bat文件就可以完成整个的仿真,大大降低了初学者的门槛!!!!如需要该系列的工程文件请关注知识星球: 成工fpga, https://t.zsxq.com/DMeqH,关注即送200GB学习资料,链接已置顶!)
上篇我们完成了车牌字符分割定位的预处理,本篇就完成车牌字符的分割。
车牌字符的上下边界比较容易定位,其实在30课的图像字符定位中基本完成了字符上下区域的定位,这儿进一步进行精细的定位。在车牌字符以外的区域,图像数据全是0,在有字符的区域,相邻图像数据开始有0和1的变化,我们假设一行图像数据中有threshold次相邻图像数据的变化,如果第一次达到这个要求,那这一行就是字符的上边界,如果最后一次达到这个要求,那这一行就是字符的下边界。

在\src\char_segmentation文件夹下新建char_horizontal_location.sv文件,完成字符上下边界的定位。boarder_flag信号用来判断上下边界,当boarder_flag==0且jump_cnt达到threshold,那这一行就是上边界,如果boarder_flag==1且jump_cnt达到threshold,那这一行就是下边界,当然下边界会一直更新,到最后一行我们把最后更新的那行当成下边界。

车牌的字符有7个加一个点,左右边界就是把这八个区域分割开。看图片,把八个字符分开还是挺容易的,字符直接都是空白的区域,我们可以将每列的数据相加求和,最后对相邻两列的数据进行比对和判断,如果上一列是0,这一列不是0,那这一列就是一个字符的左边界;如果上一列不是0,这一列是0,那这一列就是一个字符的右边界。同时要盘点一个字符左右边界的宽度,如果宽度太小也可以是误判,比如"川""沪""皖"等左右结构的字。
在\src\char_segmentation文件夹下新建char_vertical_location.sv文件,如下用组合逻辑实时计算字符的宽度和左右边界。

如下完成一幅图像每列数据的求和,并在最后一行时候就求和的结果从数组中读出来。

如下实现了一个字符左右边界的判断和记录,需要注意的就是一些特殊的字符和第二字符点的判断。

新建一个char_sgm_out.sv,用来实现将每个字符的区域在图片上显示出来。

在\src\char_segmentation文件夹下新建char_segmentation.sv,例化车牌字符分割相关的模块。如下所示。

在top文件中例化plate_location模块和char_segmentation模块。

在tb_image_sim文件中,完成图片的绘制。

双击sim文件夹下的top_tb.bat文件,完成系统的自动化仿真。

最后打开img文件夹下的output文件夹,可以看到分割的图片。

并不是所有的图片的字符都能识别并正确的分割,如下的一幅图片,由于底部的信号没有完全消除,导致字符1左边多识别了一个字符,从而将第一个字符"京"挤出来存储的数组。

卷大多数图片还是能正确分割的,如下所示。


