在上一篇博客Halcon学习笔记(八)——OCR识别初步模板识别与生成训练文件中,我们着重分析了利用模板进行OCR识别并形成自己的训练文件的主要例程,下面我们分析,当字符排列是圆形或者字体倾斜时如何处理。
第三讲 呈圆形排列或倾斜字符的OCR识别
ocr_cd_print_polar_trans例程 圆形排列的字符
如图
对于这样一幅呈圆形排列的数字字符,我们要怎么处理呢?
这个例程描述了如果打印的符号不是线性图像(比如呈环形排列)的处理方法,即通过极坐标转换变为直角坐标系。
这个例程中最值得分析的就是阈值分割部分和坐标转换部分。
第一步:阈值分割思路:先得到均值滤波后的图像mean_image
,利用ImageMean
和原图Image
做局部阈值分割dyn_threshold
。
这里我尝试过直接借助直方图工具做阈值化,由于感兴趣的区域与背景的灰度值相差很近,直接做阈值分割的效果很差,所以之后如果碰到类似的感兴趣区域与背景融合度很大的,可以尝试本例程的方法。
mean_image (Image, ImageMean, 211, 211)
dyn_threshold (Image, ImageMean, RegionDynThresh, 15, 'dark')
此时得到
接下来就是常规思路——打散
connection (RegionDynThresh, ConnectedRegions)
在打散之后就是选择区域,这里选用了根据给定shape
选择区域,可能的shape
有'max_area'
,'rectangle1'
,'rectangle2'
,这里根据最大面积选择区域。
select_shape_std (ConnectedRegions, SelectedRegions, 'max_area', 0)
此时最大区域如下,即我们感兴趣的区域。
这里采用生成轮廓区域的方法gen_contour_region_xld
,画出选择区域的边界轮廓,然后对生成的边界轮廓用圆进行拟合fit_circle_contour_xld
,返回这个圆的圆心坐标( Row, Column)
,半径Radius
,
gen_contour_region_xld (SelectedRegions, Contours, 'border')
fit_circle_contour_xld (Contours, 'ahuber', -1, 0, 0, 3, 2, Row, Column, Radius, StartPhi, EndPhi, PointOrder)
然后根据圆心坐标生成两个圆,即内圆和外圆,最后做差,得到圆环区域。
gen_circle (CircleO, Row, Column, Radius - 5)
gen_circle (CircleI, Row, Column, Radius - 30)
difference (CircleO, CircleI, Ring)