图片与数据
链接:https://pan.baidu.com/s/1ZliPyW1VdGTBWMiniCkvYg
提取码:sif0
处理流程
1、彩色图片拆分3色图片
2、利用颜色分量图片不同 过滤水平干扰线等
3、链接被干扰的字符区域 并填充数据,获取字符连通域
4、绘制白底黑字的图片
5、字符连通域,白底黑字图片、字符识别
完整代码
*
* 使用彩色图片 识别数字 ocrcolor.hdev
***** 加载显示图片******************************
read_image (Image, './img_color/color_form_01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowID)
dev_display (Image)
dev_set_line_width (3)
dev_set_draw ('margin')
dev_update_window ('off')
***** 加载字符集(0-9)******************************
read_ocr_class_mlp ('./Industrial_0-9_NoRej', OCRHandle)
* 循环读取图片
NumImages := 8
for img := 1 to NumImages by 1
***** 1、加载图片******************************
read_image (Image, './img_color/color_form_0' + img)
* 均值滤波
mean_image (Image, Mean, 3, 3)
* 彩色图片通道拆分
decompose3 (Mean, Red, Green, Blue)
***** 2、使用绿色图片寻找 数字前景图(二值化图)******************************
* 二值化 非数字不清楚特点
threshold (Green, ForegroundRaw, 0, 220)
* 前景图片中截取区域图片(截取四个边)
clip_region (ForegroundRaw, Foreground, 3, 3, Height - 4, Width - 4)
***** 3、获取字符区域二值图******************************
* 红色文字区域截取
reduce_domain (Red, Foreground, RedReduced)
* 绿色文字区域截取
reduce_domain (Green, Foreground, GreenReduced)
* 图片相减(红色灰度图-绿色灰度图)*2 + 128
sub_image (RedReduced, GreenReduced, ImageSub, 2, 128)
* 图片均值滤波
mean_image (ImageSub, ImageMean, 3, 3)
* 二值化阈值(暗区) 自动获取低阈值连通域(暗区阈值 1-15的二值化图)
binary_threshold (ImageMean, Cluster1, 'smooth_histo', 'dark', UsedThreshold)
* 前景图片(字符+暗区) - (暗区)= 字符区域
difference (Foreground, Cluster1, Cluster2)
* 组合暗区与字符区域
concat_obj (Cluster1, Cluster2, Cluster)
* 同时做开运算
opening_circle (Cluster, Opening, 2.5)
* 外接矩形(字符区域,暗区)
smallest_rectangle1 (Opening, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
* 通过宽度判断 字符区域
WidthCluster := Column2 - Column1 + 1
if (WidthCluster[0] > WidthCluster[1])
select_obj (Opening, NumberRegion, 2)
else
select_obj (Opening, NumberRegion, 1)
endif
* 链接字符二值区域 (宽度 1 高度20 的 卷积核)
closing_rectangle1 (NumberRegion, NumberCand, 1, 20)
* 获取非字符区域
difference (Image, NumberCand, NoNumbers)
* 连通域分析
connection (NumberRegion, NumberParts)
* 字符区域计算均值与偏差
intensity (NumberParts, Green, MeanIntensity, Deviation)
* 灰度膨胀 填充延展区域 使用平均灰度
expand_gray_ref (NumberParts, Green, NoNumbers, Numbers, 20, 'image', MeanIntensity, 48)
* 组合数字区域
union1 (Numbers, NumberRegion)
* 连通域分析
connection (NumberRegion, Numbers)
* 填充连通域
fill_up_shape (Numbers, RegionFillUp, 'area', 1, 100)
* 开运算
opening_circle (RegionFillUp, FinalNumbersUnsorted, 3.5)
* 字符连通域排序
sort_region (FinalNumbersUnsorted, FinalNumbers, 'character', 'true', 'row')
dev_set_color ('blue')
dev_display (Image)
dev_display (FinalNumbers)
* 统计数量
count_obj (FinalNumbers, NumNumbers)
* 重新组合数字连通域
union1 (FinalNumbers, NumberRegion)
* 计算非字符区域
difference (Image, NumberRegion, NoNumbers)
** 根据区域绘制 白底黑字的图片
* 区域绘制图片 非字符区域 填充白色
paint_region (NoNumbers, Green, ImageOCRRaw, 255, 'fill')
* 区域绘制图片 字符区域 填充黑色
paint_region (NumberRegion, ImageOCRRaw, ImageOCR, 0, 'fill')
***** 4、数字识别******************************
* FinalNumbers 字符连通域
* ImageOCR 白底黑字的 数字图片
do_ocr_multi_class_mlp (FinalNumbers, ImageOCR, OCRHandle, RecChar, Confidence)
***** 5、显示结果******************************
set_display_font (WindowID, 27, 'mono', 'true', 'false')
* 组合字符 sum(字符数组)=字符串
*
disp_message (WindowID, sum(RecChar), 'window', 32, 24, 'blue', 'false')
* 暂停与显示信息
if (img < NumImages)
set_display_font (WindowID, 16, 'mono', 'true', 'false')
disp_continue_message (WindowID, 'black', 'true')
stop ()
endif
endfor
dev_update_window ('on')