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


版权声明:本文为baidu_24565387原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。