视觉成长之路Halcon——颜色检测:GMM分类器

视觉成长之路Halcon——颜色检测:GMM分类器

  • 前言
  • 一、算子介绍
  • 二、程序
  • 总结


前言

通过系统案例学习GMM分类器在颜色识别中的应用


一、算子介绍

1、gen_rectangle1通过两个坐标生成矩形——程序中通过该算子生成矩形框区域,该区域为分类器样本。
    1.1、rectangle:存放区域        
    1.2、Row1:左上角点X坐标
    1.3、Column1:左上角点Y坐标 
    1.4、Row2:右下角点X坐标
    1.5、Column2:右下角点Y坐标    
2、gen_empty_obj 生成一个空元组——用来存放样本。
    2.1、EmptyObject:存放元组的变量名
3、concat_obj 合并两个元组——程序中有5个样本,把他们都加入生成的空元组中
    3.1、Objects1:元组1
    3.2、Objects2:元组2
    3.3、ObjectsConcat:(元组1+元组2)
4、create_class_gmm 创建GMM分类器
    4.1、NumDim:图片通道数,对应采集样本图片的通道数,RGB为3通道,灰度图为单通道。
    4.2、NumClasses:一共添加训练样本的个数。
    4.3、NumCenters:样本中心点的数量
    4.4、CovarType:协方差矩阵类型(spherical单位矩阵、diag对角矩阵、full正定矩阵)
    4.5、Preprocessing:预处理模式
    4.6、NumComponents:预处理参数,模式为[size=11.3333px]none和[size=11.3333px]normalization[size=11.3333px]时参数无效
    4.7、RandSeed[size=13.3333px]:随机种子初始化GMM。                     
5、add_samples_image_class_gmm为GMM分类器添加样本
    5.1、Image:样本来源的图片
    5.2、ClassRegions:样本的类
    5.3、GMMHandle:GMM分类器的句柄
    5.4、Randomize:[size=11.3333px]高斯噪声的标准偏差
6、train_class_gmm训练GMM分类器
    6.1、GMMHandle:GMM分类器的句柄
    6.2、MaxIter:期望最大值算法中迭代最大次数(默认)
    6.3、Threshold:期望误差阈值,超过此值,计算取消(默认)
    6.4、ClassPriors:类的先验概率类型(默认)
    6.5、Regularize:调整值(默认)
7、clear_class_gmm清除GMM分类器
8、create_class_lut_gmm创建基于GMM的LUT表格,把GMM的内容存入LUT表格是的运算更加快速,更进一步计算
    8.1、GMMHandle:GMM分类器的句柄
    8.2、GenParamNames:进一步处理的模式名称([size=11.3333px]bit_depth色彩深度,[size=11.3333px]class_selection样本选择,[size=11.3333px]rejection_threshold拒绝阈值)可多选
    8.3、GenParamValues:处理模式的参数
    8.4、ClassLUTHandle:LUT表格句柄
9、classify_image_class_lut使用LUT找表对字节图像进行分类
    9.1、Image:读取的图片
    9.2、ClassRegions:找到的区域类
    9.3、ClassLUTHandle:LUT句柄
10、clear_class_lut清除LUT表格

二、程序

代码如下:

* In this example five different color fuses are segmented with
*在这个例子中需要分割种颜色
* a look-up table classifier (LUT) based on a Gaussian Mixture
*用高斯混合的分类器(GMM)结合LUT表
* Model (GMM).
*


*使程序运行更加流程迅速
dev_update_off ()
*关闭窗口
dev_close_window ()
*打开窗口。左上角坐标(0,0)窗体长宽(800*600)底色(白色)窗口句柄(存放在WindowHandle)
dev_open_window (0, 0, 800, 600, 'white', WindowHandle)
*设置区域显示模式。设置区域显示模式(margin线框)
dev_set_draw ('margin')
*变量:图片路径
ImageRootName := 'color/color_fuses_0'
*元组:熔断色类型[5A、10A、15A、20A、30A]
FuseTypes := [5,10,15,20,30]
*元组:熔断丝颜色[橘色、红色、蓝色、黄色、绿色]
FuseColors := ['Orange','Red','Blue','Yellow','Green']
*元组:熔断丝高光[橘色、红色、蓝色、金色、绿色]
FuseHighlight := ['orange','red','blue','goldenrod','forest green']
*元祖:显示文编移动[85,65,75,85]
DisplayTextShift := [85,65,75,85,85]
*设置区域显示。设置区域显示(白色)
dev_set_color ('black')
*设置区域描边线宽。设置区域描边线宽(2个像素)
dev_set_line_width (2)
*从路径读取图片。
read_image (Image, ImageRootName + '0')
*显示图片
dev_display (Image)
* 
* Define ROIs for the training data of the classifier
*为训练分类器定义感兴趣的区域(ROI)
*
*设置显示的字体。(窗口的句柄,大小14,字体font,粗体ture,斜体false)
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
*生成矩形。(存放地址,左上坐标X195,左上坐标90,右下坐标230,右下坐标120)
gen_rectangle1 (FuseOrange, 195, 90, 230, 120)
*显示矩形
dev_display (FuseOrange)
*显示文本信息。(窗口句柄,文本信息'Orange Fuse',基于image图片的显示,坐标X160,坐标Y90-65,文字颜色黑色,是否要框)
*——基于window窗体的显示,改变图片的大小,文本不改变位置。基于image图片的显示,改变图片大小,文本随之改变
disp_message (WindowHandle, 'Orange Fuse', 'image', 160, 90 - 65, 'black', 'true')
gen_rectangle1 (FuseRed, 191, 280, 226, 310)
dev_display (FuseRed)
disp_message (WindowHandle, 'Red Fuse', 'image', 160, 280 - 55, 'black', 'true')
gen_rectangle1 (FuseBlue, 190, 470, 225, 500)
dev_display (FuseBlue)
disp_message (WindowHandle, 'Blue Fuse', 'image', 160, 470 - 60, 'black', 'true')
gen_rectangle1 (FuseYellow, 192, 672, 227, 702)
dev_display (FuseYellow)
disp_message (WindowHandle, 'Yellow Fuse', 'image', 160, 672 - 70, 'black', 'true')
gen_rectangle1 (FuseGreen, 197, 880, 232, 910)
dev_display (FuseGreen)
disp_message (WindowHandle, 'Green Fuse', 'image', 160, 880 - 65, 'black', 'true')
*生成一个空的任意类型的元组叫Classes
gen_empty_obj (Classes)
*合并两个任意类型的元祖
concat_obj (FuseOrange, FuseRed, Classes)
concat_obj (Classes, FuseBlue, Classes)
concat_obj (Classes, FuseYellow, Classes)
concat_obj (Classes, FuseGreen, Classes)

*显示文本提示‘开始训练感兴趣的区域’
disp_message (WindowHandle, 'ROIs for the training data', 'window', 12, 12, 'black', 'true')
*右下角文本提示‘按F5继续’
disp_continue_message (WindowHandle, 'black', 'true')
*程序暂停
stop ()
 1. 
 2. Create the GMM classifier, add the samples, and train it
*创建GMM分类器,添加ROI样本,并训练
 3. *创建GMM分类器(图片通道数,样本个数,样本中心点数量,协方差矩阵类型,预处理类型,转换特征数量,随机种子,句柄)
create_class_gmm (3, 5, 1, 'full', 'none', 10, 42, GMMHandle)
*给分类器添加样本(样本来源的图片,样本的元祖,句柄,训练中心点随机种子)
add_samples_image_class_gmm (Image, Classes, GMMHandle, 0)
*显示提示文本‘GMM分类器开始训练’
disp_message (WindowHandle, 'Training GMM classifier...', 'window', 48, 12, 'black', 'true')
*训练GMM分类器
train_class_gmm (GMMHandle, 100, 0.001, 'uniform', 0.001, Centers, Iter)
 4. 


 5. Create the GMM-based LUT classifier
*创建基于GMM的LUT表格,把GMM的内容存入LUT表格是的运算更加快速,更进一步计算
disp_message (WindowHandle, 'Creating LUT classifier...', 'window', 84, 12, 'black', 'true')
*创建基于GMM的LUT表格,通过模式进一步学习。(GMM句柄,[通过色彩位深度,拒绝阈值],[色彩位深度的值,拒绝阈值的值],LUT句柄)
create_class_lut_gmm (GMMHandle, ['bit_depth','rejection_threshold'], [6,0.03], ClassLUTHandle)
*清除GMM分类器
clear_class_gmm (GMMHandle)
 6. 
 7. Segment images with LUT classifier
*分割图片通过LUT表
*循环查找3张图片
for Img := 0 to 3 by 1
    read_image (Image, ImageRootName + Img)
    *统计一次时间
    count_seconds (T1)
    *使用查找表对字节图像进行分类
    classify_image_class_lut (Image, ClassRegions, ClassLUTHandle)
    *统计第二次时间
    count_seconds (T2)
    *计算耗时多少MS
    TimeToClassify := (T2 - T1) * 1000
    dev_display (Image)
    dev_set_line_width (3)
    *循环查找5个样本
    for Fuse := 1 to 5 by 1
        * 
        * Perform post-processing on returned classes
        *对分类好的图像进行处理
        *把分类好的图像拷贝出来(分类完成后存放的类,拷贝存放的类,第几个开始,拷贝多少个)
        copy_obj (ClassRegions, ObjectsSelected, Fuse, 1)
        *圆形闭运算——平滑区域边缘
        closing_circle (ObjectsSelected, RegionClosing, 3.5)
        *连接区域,把相连的区域合并,不相连的分开
        connection (RegionClosing, ConnectedRegions)
        *借助形状特征查找区域。——查找面积在250099999范围内的区域
        select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 2500, 99999)
        *填充区域中的孔洞
        fill_up (SelectedRegions, RegionFillUp)
        *得到区域的面积和中心点
        area_center (RegionFillUp, Area, Row, Column)
        *改变区域的形状
        shape_trans (RegionFillUp, RegionTrans, 'convex')
        dev_set_color (FuseHighlight[Fuse - 1])
        dev_display (RegionTrans)
        * 
        *统计区域的数量
        count_obj (RegionTrans, Number)
        for j := 1 to Number by 1
            disp_message (WindowHandle, FuseColors[Fuse - 1] + ' ' + FuseTypes[Fuse - 1] + ' A', 'image', Row[j - 1] - 10, Column[j - 1] - DisplayTextShift[Fuse - 1], FuseHighlight[Fuse - 1], 'true')
        endfor
    endfor
    disp_message (WindowHandle, TimeToClassify$'.1f' + ' ms', 'window', 12, 12, 'black', 'true')
    if (Img < 3)
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
 8. 
*清除LUT表格
clear_class_lut (ClassLUTHandle)
disp_message (WindowHandle, 'No more lines to execute', 'window', 50, 12, 'black', 'true')

总结

GMM分类器的使用步骤
1、创建ROI区域样本
2、合并所有ROI区域样本
3、创建GMM分类器
4、添加样本到GMM分类器
5、训练
6、LUT表格可以增加GMM分类器的运算速度,和更进一步的计算
7、对分类后的图像进一步处理

你可能感兴趣的:(笔记,图像处理)