图像分类识别算法(基于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:/Urs/Administrator/Desktop/vsoontech/缺陷检测/DetectModule_halcon/⽅位验证',['files','follow_links'], ImageFiles)
tuple_regexp_lect (ImageFiles,['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_ca'], ImageFiles)
list_files ('C:/Urs/Administrator/Desktop/vsoontech/缺陷检测/DetectModule_halcon/⽅位验证 - test',['files','follow_links'], ImageFiles_test)
tuple_regexp_lect (ImageFiles_test,['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$','ignore_ca'], 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','fal')
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来分类,识别⼀幅图中的各个物件和各种颜⾊。
数据
`