halcon第十讲:基于训练学习的木板纹理识别

现有以下五组木板图像,分别为A,B,C,D,E,通过训练学习识别出它们:

*通过助手获取文件夹下所有图像
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
list_files ('C:/Users/Administrator/Desktop/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)


class:=['A','B','C','D','E']
Features:=[]

*【1】创建分类器,第一个参数为特征向量的维数,第二个为隐式结点的个数,第三为类别数
*创建分类器之前,先在下面提取特征向量,知道向量维数后在这创建一个分类器即可,不用在循环里每次都创建
create_class_mlp (36, 10, 5, 'softmax', 'normalization', 10, 42, MLPHandle)

*【2】提取特征向量并添加样本
for Index := 0 to |ImageFiles| - 1 by 1
    read_image (Image, ImageFiles[Index])
    rgb1_to_gray (Image, GrayImage)
    *提取特征向量,获取图像的共生矩阵,有能量,相关性,熵,对比度,将其当作这幅图像的特征,组成特征向量
    cooc_feature_image (GrayImage, GrayImage, 6, 0, Energy, Correlation, Homogeneity, Contrast)
    *增加特征向量,提取sobel边缘,计算其灰度直方图,把它也当作特征,8为量化因子,所谓量化,就是把经过抽样得到的瞬时值将其幅度离散,即用一组规定的电平,把瞬时抽样值用最接近的电平值来表示,越小得到的灰度特征值越多
    sobel_amp (GrayImage, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
    
    Features := [Energy,Correlation, Homogeneity, Contrast,AbsoluteHisto]
    Real_Features := real(Features)  
    *添加样本
    add_sample_class_mlp (MLPHandle,Real_Features, Index)    
endfor

*【3】训练分类器
train_class_mlp (MLPHandle, 200, 1, 0.01, Error, ErrorLog)

*【4】识别分类
for i:=0 to |ImageFiles| - 1 by 1
    read_image(Image,ImageFiles[i])   
    rgb1_to_gray (Image, GrayImage)
    cooc_feature_image (GrayImage, GrayImage, 6, 0, Energy, Correlation, Homogeneity, Contrast)
    sobel_amp (GrayImage, EdgeAmplitude, 'sum_abs', 3)
    gray_histo_abs (EdgeAmplitude, EdgeAmplitude, 8, AbsoluteHisto)
    Features := [Energy,Correlation, Homogeneity, Contrast,AbsoluteHisto]
    Real_Features := real(Features)  
    *分类
    classify_class_mlp (MLPHandle, Real_Features, 1, Class, Confidence)
    dev_display (Image)
    disp_message (WindowHandle, class[i], 'window', 12, 12, 'black', 'true')
    disp_continue_message (WindowHandle, 'black', 'true')
    stop()
endfor

识别结果如下:

猜你喜欢

转载自blog.csdn.net/qq_24946843/article/details/82108833