Halcon图像分类例程解析——classify_metal_parts.hdev[超详细版,已替换本地函数,可直接复制使用]

HALCON重要例程精讲——图像分类

重要性:图像分类在生活与工程上有着特别广泛的应用。而MLP分类器是分类器中最合适的分类器之一,本例程则堪称图像分类的经典模板。读懂并掌握这个例程对于提高HALCON图像分类水平、解决实际分类问题能力有着质的提升。

图像分类的一般流程

(1)准备样本图片
(2)对样本图片进行处理(如二值化、图像分割等),提取出目标区域
(3)分析目标特征,选取可以用来将不同类别区分开来的几种特征值作为特征向量以训练分类器
(2)创建分类器
(3)训练分类器
(4)检测待测目标对象,分类器根据训练得到的类别的边界条件判断检测对象属于哪个分类
(5)清除分类器,释放内存

总的来说,针对不同的分类任务,需要选择一组合适的特征和合适的分类器,以及合适的训练样本。

笔者对程序中每一个步骤都进行了详细的说明,希望大家可以通过彻底学习这个例程,全面了解图像分类的思想,操作与具体实现步骤。程序及讲解如下:

dev_update_off ()
dev_close_window ()
dev_open_window (0, 0, 640, 480, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_colored (6)
dev_set_draw ('margin')
dev_set_line_width (3)
*
*一、创建mlp分类器。
*用于训练和分类的特征向量维度数为6,神经网络中隐藏层为5,共需要对3种类别进行分类,其他参数参考文章2.1 MLP分类器的关键算子
create_class_mlp (6, 5, 3, 'softmax', 'normalization', 3, 42, MLPHandle)
* 
*二、添加样本到分类器
*循环读取每一个图片文件,对每一个图片进行二值化图像分割,获取每个区域的特征向量与各自所对应的类别作为样本添加入分类器
FileNames := ['nuts_01','nuts_02','nuts_03','washers_01','washers_02','washers_03','retainers_01','retainers_02','retainers_03']
*这里按照图片顺序将每张图片的类别ID(即add_sample_class_mlp中的Target)存放在数组Classes当中,方便在循环中自动根据图片顺序选择相应的类别ID
Classes := [0,0,0,1,1,1,2,2,2]
*对于每一张图片,将进行以下操作
for J := 0 to |FileNames| - 1 by 1
    read_image (Image, 'rings/' + FileNames[J])
    dev_display (Image)
    dev_set_colored (6)
    *segment (Image, Objects)
     *二值化分割图像,提取图像中较暗的部分("dark"),即零件部分,'max_separability'表示在直方图中对最大的可分性进行分割,
     *UsedThreshold是算法自动计算出用于图像分割的阈值,作为输出参数返回
    binary_threshold (Image, Objects, 'max_separability', 'dark', UsedThreshold)
    *合并像素相连部分成为一个个区域
connection (Objects, ConnectedRegions)
*填充每个区域(零件)中的孔或和缝等,形成新的实心区域。
fill_up (ConnectedRegions, Objects)
   dev_display (Objects)
   *设置字体颜色,显示当前循环位置,方便观察
    dev_set_color ('black')
    disp_message (WindowHandle, 'Add Sample ' + J + ', Class Index ' + Classes[J], 'window', 10, 10, 'black', 'true')
*    add_samples (Objects, MLPHandle, Classes[J])
   *计算区域的个数,也就是一张图像中零件的个数。
      count_obj (Objects, Number)
      *对于一张图片中的每一个处理后的实心区域(零件),将进行以下操作
 for k := 1 to Number by 1
*选择第k个区域(零件),计算该区域的相关特征参数,作为特征向量准备输入给分类器
     select_obj (Objects, Region, k)
   * get_features (Region, Features)
    select_obj (Region, SingleRegion, 1)
*与圆的相似度Circularity,roundness则由区域的轮廓与区域中心之间的平均距离(Distance)及与平均距离的偏差(Sigma)组合公式而来。
 circularity (SingleRegion, Circularity)
 roundness (SingleRegion, Distance, Sigma, Roundness, Sides)
 *这个算子用于计算区域几何特性,输出4个代表区域几何特性的参数。
 moments_region_central_invar (SingleRegion, PSI1, PSI2, PSI3, PSI4)
*前面通过三个算子得到了Circularity,roundness, PSI1, PSI2, PSI3, PSI4共6个参数,使用这六个特征参数组合成特征向量Features
 Features := [Circularity,Roundness,PSI1,PSI2,PSI3,PSI4]
*将得到的特征向量作为样本添加进分类器,并指明对应的类别ID,即Classes[J]
    add_sample_class_mlp (MLPHandle, Features, Classes[J])
endfor
*一张图片中多个区域处理的循环结束
    disp_continue_message (WindowHandle, 'black', 'true')
    stop ()
endfor
* 多张图片的处理的循环结束

* 三.利用添加好的样本特征向量组,训练分类器
dev_clear_window ()
dev_set_color ('black')
disp_message (WindowHandle, 'Training...', 'window', 10, 10, 'black', 'true')
*开始训练分类器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
*训练完成后,清除分类器中的样本数据,释放占用内存资源
clear_samples_class_mlp (MLPHandle)
*出现文字提示训练完成
disp_message (WindowHandle, 'Training... completed', 'window', 10, 10, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
* 
* 四.实现分类器分类功能
*dev_set_draw ('fill')
*对于每一张图片,进行目标区域的获取与每一个区域特征向量的获取,输入给分类器进行类别的判断
for J := 1 to 4 by 1
    read_image (Image, 'rings/mixed_' + J$'02d')
    dev_display (Image)
    dev_set_color ('black')
    dev_set_draw ('margin')
    disp_message (WindowHandle, 'Classifiy Image' + J, 'window', 10, 10, 'black', 'true')
    *segment (Image, Objects)
     *对每张图片进行区域分割,得到每个零件的区域并进行填充,具体步骤含义参考创建mlp分类器时的相同代码
     binary_threshold (Image, Objects, 'max_separability', 'dark', UsedThreshold)
connection (Objects, ConnectedRegions)
fill_up (ConnectedRegions, Objects)
    *classify (Objects, MLPHandle, Classes)
     *完成对每个区域(也就是每一个零件)的提取后,分别计算每个区域的特征向量并输入给分类器进行分类,分类结果存储在Classes数组当中
     count_obj (Objects, Number)
Classes := []
for k := 1 to Number by 1
    *下面计算特征向量步骤与创建mlp分类器部分相应代码相同,自行向前查阅。
    select_obj (Objects, Region, k)
    *get_features (Region, Features)
    select_obj (Region, SingleRegion, 1)
circularity (SingleRegion, Circularity)
roundness (SingleRegion, Distance, Sigma, Roundness, Sides)
moments_region_central_invar (SingleRegion, PSI1, PSI2, PSI3, PSI4)
Features := [Circularity,Roundness,PSI1,PSI2,PSI3,PSI4]
*得到特征向量Features输入分类器,进行分类,返回一个最可能的结果Class,并给出置信度Confidence
    classify_class_mlp (MLPHandle, Features, 1, Class, Confidence)
*该语法含义是将每次循环中class的值添加入Classes当中,相当于很多语言中的数组的.push()方法,以此将分类结果class存储在数组Classes
*当中,如Class为0,则对应第一类,Class为2,则对应第三类。
    Classes := [Classes,Class]
endfor
*结束对一张图片中所有区域(零件)的分类
stop()

*下面是针对每张图片分类完成后的结果,进行可视化显示
   disp_obj_class (Objects, Classes)
    count_obj (Objects, Number)
    *采用三种不同颜色放在数组中,根据类别ID(0,1,2),来选择数组中的颜色
Colors := ['yellow','magenta','green']
for l := 1 to Number by 1
    select_obj (Objects, Region, l)
    dev_set_color (Colors[Classes[l - 1]])
    dev_display (Region)
endfor
    if (J < 4)
 * 判断四张图片未处理完时,每一张处理完成后,暂停进行提示,再手动进入下一张的处理
        disp_continue_message (WindowHandle, 'black', 'true')
        stop ()
    endif
endfor
*四张图片全部处理完成
stop ()
* 
*5.清除分类器,释放分类器所占用的内存
clear_class_mlp (MLPHandle)
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值