适用范围:
此算子适合文字识别(OCR)或者切割里增强点状印刷字体的区域,也适合某些材质上点状缺陷的分割。
代码解释:
* This example program shows how to use dots_image to segment a dot print.
dev_update_pc ('off')
dev_update_window ('off')
dev_update_var ('off')
read_image (Image, 'needle1')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
* Since the needle1 image would be fairly easy to segment, we will make life a
* little harder by adding a background texture to the image.
**********加载增加噪音背景图像,增加分割难度***********************
read_image (ImageNoise, 'angio-part')
***********切割背景图尺寸与需要切割文字的图像大小一致
crop_part (ImageNoise, ImagePart, 0, 0, Width, Height)
***********叠加噪音背景图像到原图***********************
mult_image (Image, ImagePart, ImageResult, 0.015, 0)
* Use dots_image to enhance the dot print.
***********1、Diameter=5,适用直径为5的点滤波器核进行滤波************
***********2、FilterType='dark',选择增强图片中黑色的区域***********
***********3、PixelShift=2,增加输出图像的对比度************
dots_image (ImageResult, DotImage, 5, 'dark', 2)
***********二值化,分割出文字部分区域***************
threshold (DotImage, Region, 80, 255)
* The following code connects the individual dots into characters.
***********对选中的区域进行90度方向的闭合联通操作***************
closing_rectangle1 (Region, RegionClosing1, 1, 5)
***********对选中的区域进行0度方向的闭合联通操作***************
closing_rectangle1 (RegionClosing1, RegionClosing2, 5, 1)
***********生成45度闭合操作结构元素***************
gen_rectangle2 (Rectangle45, 10, 10, rad(45), 3, 0)
***********对选中的区域进行45度方向的闭合联通操作***************
closing (RegionClosing2, Rectangle45, RegionClosing3)
***********生成135度闭合操作结构元素***************
gen_rectangle2 (Rectangle135, 10, 10, rad(135), 3, 0)
***********对选中的区域进行135度方向的闭合联通操作***************
closing (RegionClosing3, Rectangle135, RegionClosing4)
***********以上4个闭合操作分别对区域进行8个方向联通的闭合操作,让字符点与点之间得以有效连接
***********切割区域内的各个联通分量子区域到区域数组**************
connection (RegionClosing4, ConnectedRegions)
***********对于子联通区域数字进行面积、高度的阈值区域筛选,只保留需要的大文字区域****
select_shape (ConnectedRegions, SelectedRegions, ['area','height'], 'and', [100,20], [700,40])
* Since the closings may have resulted in merged characters, we need to
* separate them again.
***********文字水平方向可能由于被联通在一起,使用水平宽度距离及偏差比例参数进行二次分割
***********确保文字不存在联通的情况
***********参数Distance为参考文字区域正常宽度距离值输入即可,只有当子区域的宽度大于Distance的1.5倍时才会进入此分区算子的实际分区操作,宽度不满足条件的区域不做任何处理
***********参数Percent为分割后的区域相对于Distance宽度的最大偏移量:Distance*Percent*0.01
partition_dynamic (SelectedRegions, Partitioned, 25, 20)
* Finally, we compute the characters' original shapes.
***********切割区域与原图文字区域取交集,得到文字在原始图上的区域,消除上面8联通闭合操作的膨胀区域
intersection (Partitioned, Region, Characters)
dev_display (ImageResult)
dev_set_colored (6)
dev_display (Characters)
知识点解析:
1、gen_rectangle2生成带角度的矩形结构元素
参数Length1文档解释为Half width,直译过来其实理解不太正确,这里应该是宽度中间位置的像素宽度,实际生成矩形的宽度是:2*Length1-1,为奇数,确保Length1位置在宽度的正中间,示例中输入3的宽度是:2*3-1=5
参数Length2的理解同上,只是方向为宽度方向。
效果图:
gen_rectangle2 (Rectangle, 10, 10, rad(45), 4, 0)
gen_rectangle2 (Rectangle, 10, 10, rad(45), 0, 4)
gen_rectangle2 (Rectangle, 10, 10, rad(45), 4, 4)
2、partition_dynamic:将输入区域水平划分为具有近似距离宽度的区域
gen_rectangle1 (Rc1, 0, 0, 100, 100)
partition_dynamic (Rc1, Prc, 10, 10)
宽度最大偏移:10*10*0.01=1