现有以下五组木板图像,分别为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
识别结果如下: