参考文章
https://www.jianshu.com/p/b3d8d4a8bb07
*关闭激活的图形显示窗口
dev_close_window()
*在程序运行过程中关闭(或开启)自动将图形输出对象输出到图形窗口
dev_update_window('off')
*------------------------------------------------------------------------------------*
*-----------------------------------显示图像------------------------------------------*
*------------------------------------------------------------------------------------*
*读取图像
read_image(img,'E:/Desktop/3_看图王.bmp')
*得到图像的尺寸
get_image_size (img, Width, Height)
*打开一个保留给定图像纵横比的新图形窗口,WindowHandle是输出
dev_open_window_fit_image (img, 0, 0, Width, Height, WindowHandle)
*设置不依赖操作系统的字体(参数:窗口句柄,字体大小,字体类型,是否黑体,是否倾斜)
set_display_font (WindowHandle, 12, 'mono', 'true', 'false')
*定义区域填充模式,设置'fill',region显示为填充,如果设置为'margin',则只显示轮廓
*在'margin'模式下,轮廓的外观会受到dev_set_line_width,set_line_approx和set_line_style的影响
dev_set_draw ('margin')
*定义输出轮廓线宽为4
dev_set_line_width (4)
*显示图像
dev_display (img)
*windowhandle窗口使用黑色字体在一个方框内显示按“F5”继续运行字体,并注册F5消息处理
*此过程在屏幕右下角显示“单击“运行”以继续”。(参数:窗口,文本颜色,true-文本将写入一个白色框中)
disp_continue_message (WindowHandle, 'red', 'true')
*停止运行
stop ()
*-------------------------------------------------------------------------------------*
*-------------------------segment image 步骤:图像分割---------------------------------*
*-------------------------------------------------------------------------------------*
*using a local threshold 使用局部阈值
*对Image进行7*7均值滤波 ,平滑一张图片
mean_image (img, ImageMean, 7, 7)
*使用局部阈值分割图像,用均值滤波图像作为二值化阈值图像,返回小于灰度值小于该点阈值-5的图像。
*由于背景不均一,目标体比背景局部亮/暗一些,无法确定全局阈值,需要通过其邻域找到一个合适的阈值进行分割
*参数:输入图像,包含本地阈值的图像,输出图像(分割区域),应用于阈值图像的偏移量,提取光、暗或类似区域。
dyn_threshold (img, ImageMean, RegionDynThresh, 5, 'dark')
*-------------------------------------------------------------------------------------*
*------------------------extract connected components 提取连通分量---------------------*
*-------------------------------------------------------------------------------------*
*由分割出来的DarkPixels(暗色像素)获得连通区域到ConnectedRegions
*计算区域的连通分量,得到的连通区域为:
connection (RegionDynThresh, ConnectedRegions)
*设置混合输出颜色为12种
dev_set_colored (12)
*显示图像
dev_display (ConnectedRegions)
*windowhandle窗口使用黑色字体在一个方框内显示按“F5”继续运行字体,并注册F5消息处理
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*-------------------------------------------------------------------------------------*
*-------------process regions 步骤:处理区域,借助形状特征选择符合条件的区域-------------*
*-------------------------------------------------------------------------------------*
* -> select large regions 选取大区域
*从ConnectedRegions中得到面积大于10小于1000的区域到SelectedRegions
*借助形状特征选择区域(参数:要检查的区域,符合条件的区域,形状特征,单个特征的链接类型,最小值,最大值)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 1000)
dev_display(img)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*-------------------------------------------------------------------------------------*
*---------------------visualize fractioned scratch 可视化划分划痕 X--------------------*
*-------------------------------------------------------------------------------------*
*设置一个或多个输出颜色
dev_set_color ('blue')
dev_display(img)
dev_display (SelectedRegions)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*-------------------------------------------------------------------------------------*
*------------------------------合并划痕区域,形态学膨胀操作-----------------------------*
*-------------------------------------------------------------------------------------*
*返回所有输入区域的并集,合并SelectedRegions的并集到RegionUnion
union1 (SelectedRegions, RegionUnion)
dev_display (RegionUnion)
*以3.5作为圆形区域扩张的半径,对RegionUnion扩张得到RegionDilation(形态学中的膨胀)
dilation_circle (RegionUnion, RegionDilation, 3.5)
dev_display(img)
dev_display (RegionDilation)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*-------------------------------------------------------------------------------------*
*------------------------------提取膨胀后图像骨架,并计算连通域-------------------------*
*-------------------------------------------------------------------------------------*
*由RegionDilation获取骨架给Skeleton
skeleton (RegionDilation, Skeleton)
dev_display (Skeleton)
*通过8邻接或四邻接方法将骨架链接后传给ConnectedRegions1
connection (Skeleton, ConnectedRegions1)
dev_set_colored (12)
dev_display (img)
dev_display (ConnectedRegions1)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
*-------------------------------------------------------------------------------------*
*----------------distinguish small and large scratches 区分大小划痕--------------------*
*-------------------------------------------------------------------------------------*
*从ConnectedRegions中选择符合条件的区域到SelectedRegions
*借助形状特征选择区域(参数:要检查的区域,符合条件的区域,形状特征,单个特征的链接类型,最小值,最大值)
*选择面积大于50小于1000的区域到Scratches
select_shape (ConnectedRegions1, SelectedRegions1, 'area', 'and', 50, 10000)
*选择面积大于1小于50的区域到Dots
select_shape (ConnectedRegions1, SelectedRegions2, 'area', 'and', 1, 50)
*划痕用红色标注
dev_display(img)
dev_set_color ('red')
dev_display (SelectedRegions1)
*点用蓝色标注
dev_set_color('blue')
dev_display (SelectedRegions2)
*-------------------------------------------------------------------------------------*
*----------------------------------文字显示划痕和点的个数-------------------------------*
*-------------------------------------------------------------------------------------*
*计算输入区域中连通域的个数
count_obj (SelectedRegions1, Numberballs)
*写入文本消息
*参数:窗口句柄,文本信息,Window表根据窗口坐标系给出文本位置,文本位置的行坐标,文本位置的列坐标,文字颜色,true表文字在白框里
disp_message (WindowHandle, '大于50小于10000的划痕数量:'+Numberballs, 'window', 0, 0, 'red', 'true')
count_obj (SelectedRegions2, Number)
disp_message (WindowHandle, '大于1小于50的划痕数量:'+Number, 'window', 50, 12, 'black', 'true')