图像分类识别算法(基于halcon)

背景:s10缺陷中间件检测需要对各个面进行检测,每个面的检测内容不同(上顶面对电源线及排线检测/底面对电源线/左侧对散热区螺纹检测/左侧需要对颜色次序排序进行识别),每一个面都有一套算法,面临的一个问题是网络相机不能按次序拍照,其节点每次都是混乱的,故需要通过图像算法识别拍摄的是哪一个检测面。

算法思路:

本来想用模板匹配来实现,按照匹配度完成对预设的4个模型进行判别,考虑到模板匹配的耗时。后来选择简单的分类器来实现图片分类。
1.拍四张不同方位的标准照片,flag 0 1 2 3。
2.选择了多层感知机分类器。
4.图片预处理(crop,sobel、emphasize),选取合适点的特征表征(这步比较关键,特征的选取根据图片来分析,分类结果好坏取决决于此)
5.四张照片训练模型得到模型句柄信息。
6.读取模型,映射分类。`

代码实现

*通过助手获取文件夹下所有图像
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
list_files ('C:/Users/Administrator/Desktop/vsoontech/缺陷检测/DetectModule_halcon/方位验证', ['files','follow_links'], ImageFiles)
tuple_regexp_select (ImageFiles, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles)
list_files ('C:/Users/Administrator/Desktop/vsoontech/缺陷检测/DetectModule_halcon/方位验证 - test', ['files','follow_links'], ImageFiles_test)
tuple_regexp_select (ImageFiles_test, ['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_case'], ImageFiles_test)
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*创建模板
read_image (Image_corp, ImageFiles[0])
dev_display (Image_corp)
disp_message (WindowHandle, '请创建模板并以鼠标右击结束', 'window', -1, -1, 'white', 'false')
draw_rectangle1 (WindowHandle, Row1, Column1, Row2, Column2)
gen_rectangle1 (Rectangle, Row1, Column1, Row2, Column2)
class:=['A','B','C','D']
Features:=[] 
*1】创建分类器,第一个参数为特征向量的维数,第二个为隐式结点的个数,第三为类别数
*创建分类器之前,先在下面提取特征向量,知道向量维数后在这创建一个分类器即可,不用在循环里每次都创建
create_class_mlp (41, 10, 4, 'softmax', 'normalization', 10, 42, MLPHandle)
*2】提取特征向量并添加样本
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    rgb1_to_gray (Image, GrayImage1)
    reduce_domain (GrayImage1, Rectangle, GrayImage)   
    sobel_amp (GrayImage, EdgeAmplitude1, 'sum_abs', 3)  
     emphasize (EdgeAmplitude1, EdgeAmplitude, 10, 10, 1.5)
    *提取特征向量,获取图像的共生矩阵,有能量,相关性,熵,对比度,将其当作这幅图像的特征,组成特征向量
    cooc_feature_image (EdgeAmplitude, EdgeAmplitude, 6, 0, Energy, Correlation, Homogeneity,      Contrast)
    *增加特征向量,提取sobel边缘,计算其灰度直方图,把它也当作特征,8为量化因子,所谓量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,越小得到的灰度特征值越多
  gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
  region_features(EdgeAmplitude,['convexity','circularity','area','row','column'],Value)
  Features := [Value,Energy,Correlation, Homogeneity, Contrast,AbsoluteHisto]
   Real_Features := real(Features)  
   *添加样本
   add_sample_class_mlp (MLPHandle,Real_Features, Index)    
endfor
 stop()
*3】训练分类器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)
 
*4】识别分类
for i:=0 to |ImageFiles_test| - 1 by 1
    read_image(Image,ImageFiles_test[i])   
    rgb1_to_gray (Image, GrayImage1)
    reduce_domain (GrayImage1, Rectangle, GrayImage)
    sobel_amp (GrayImage, EdgeAmplitude1, 'sum_abs', 3)
    emphasize (EdgeAmplitude1, EdgeAmplitude, 10, 10, 1.5)
    cooc_feature_image (EdgeAmplitude, EdgeAmplitude, 6, 0, Energy, Correlation, Homogeneity, Contrast)    
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
    region_features(EdgeAmplitude,['convexity','circularity','area','row','column'],Value)
    Features := [Value,Energy,Correlation, Homogeneity, Contrast,AbsoluteHisto]
    Real_Features := real(Features)  
    *分类
    classify_class_mlp (MLPHandle, Real_Features, 1, Class_test, Confidence)
    dev_display (Image)
    disp_message (WindowHandle, Class_test, 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop()
endfor 

总结

1.本文选择了41个特征,灰度共生矩阵的4个特征值、5个人为划定的特征值、36个灰度直方图分布特征。不同于深度学习通过大量数据来自动提取数据特征,机器学习的分类器的一个好处在于:在图片质量好的情况下,可以依靠人为选取区分度高的特征来作为输入特征训练,对于要求不是很高的需求仅需少量的图就可以满足。
2.此例和halcon的一个颜色和工件分类器的示例有些不同,本例的输入是各个特征值来判定该图片的类别,而他们是在同一幅图中分割成object来分类,识别一幅图中的各个物件和各种颜色。

数据

代码及数据

`

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值