Halcon 字符分割的一般方式
OCR识别的关键:字符分割
进行OCR字符识别之前,关键的一步在于图像预处理时,能够将字符很好的切分出来。
一般预处理包括:增强图像的灰度值scale_image()、阈值分割threshold()、区域连通connection()、开运算清除噪点opening_rectangle1()、形状选择select_shape()选择字符区域。
问题:通过以上步骤后,有些字符还是会粘连在一起,无法分割开,该如何操作?
方法一:针对当前粘连的字符,做进一步的腐蚀膨胀操作(opening_rectangle1())
缺陷:字符粘连区域细小时可操作性强,粘连区域较大时,腐蚀的同时也会使原字符区域受到影响,造成无法识别。
方法二:针对当前粘连的字符,做区域分割操作
1.计算当前粘连的字符区域的宽度
2.根据单个字符的最大宽度,估算出当前粘连的字符区域内包含多少个字符
3.根据包含的字符个数N,将粘连的字符区域等分成N个小区域。假设每个小区域内包含一个字符。
缺陷:字符区域不是等间距分布,因此等间距去分割字符区域时,可能会造成区域内有字符部分区域的干扰。
部分操作如下:
sort_region (SelectedRegions2, SortedRegions1, 'character', 'true', 'row')
count_obj( SortedRegions1,Count)
* 单个字符最大宽度
maxWidth:=135
* postion
rowResult :=[]
colResult:=[]
* result
classResult:=[]
read_ocr_class_mlp ('Pharma.omc', OCRHandle)
for index:=1 to Count by 1
select_obj (SortedRegions1, ObjectSelected, index)
*reduce_domain (ImageReduced4, ObjectSelected, ImageReduced)
* 选择的Sigma值越大,将提取的区域越少
*auto_threshold (ImageReduced, Regions1,2)
*connection (Regions1, ConnectedRegions9)
select_shape (ObjectSelected, SelectedRegions7, 'height', 'and', 100, 220)
select_shape (SelectedRegions7, SelectedRegions1, 'area', 'and',2000, 27000)
smallest_rectangle1 (SelectedRegions1, Row12, Column12, Row22, Column22)
width :=Column22-Column12
if (|width|==1 and width>=maxWidth)
* 计算粘连的字符个数
num := width*1.0/maxWidth
if(num-1>=0)
count :=int(num+1)
else
count :=int(num)
endif
for index2 :=1 to count by 1
gen_rectangle1 (Rectangle2, Row12, Column12+(index2-1)*width/count, Row22, Column12+index2*width/count)
reduce_domain (SelectedRegions7, Rectangle2, ImageReduced2)
connection (ImageReduced2, ConnectedRegions10)
select_shape (ConnectedRegions10, SelectedRegions, 'height', 'and', 100, 185)
do_ocr_multi_class_mlp (SelectedRegions, ImageEquHisto1, OCRHandle, Class2, Confidence2)
rowResult :=[rowResult,Row12]
colResult :=[colResult,Column12+(index2-1)*width/2]
classResult :=[classResult,Class2]
endfor
else
do_ocr_multi_class_mlp (SelectedRegions1, ImageEquHisto1, OCRHandle, Class2, Confidence2)
rowResult :=[rowResult,Row12]
colResult :=[colResult,Column12]
classResult :=[classResult,Class2]
endif
endfor