数据地址
链接:https://pan.baidu.com/s/1yb8a6z1ogVplYLUMTfMcCw
提取码:5iwm
主程序
* 支持向量机的分类
**1、确认训练图片 是否存在**********************
Image_exist := false
Image_bulb_path := './img/halogen_bulb/halogen_bulb_01.png'
dev_get_preferences ('suppress_handled_exceptions_dlg', SaveMode)
dev_set_preferences ('suppress_handled_exceptions_dlg', 'true')
try
read_image (Image, Image_bulb_path)
dev_close_window ()
read_path := './img/halogen_bulb/'
* 文件存在
Image_exist := true
break
catch (Exception)
endtry
if (not Image_exist)
* 图片文件夹不存在
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
disp_message (WindowHandle, '没有找到图片', 'window', -1, -1, 'black', 'true')
stop()
endif
dev_get_preferences ('suppress_handled_exceptions_dlg', SaveMode)
**2、读取第一张图片*********************
read_image (Image_bulb, Image_bulb_path)
get_image_pointer1 (Image_bulb, Pointer, Type, Width, Height)
dev_clear_window ()
dev_open_window (0, 0, Width/2, Height/2, 'black', WindowHandle1)
set_display_font (WindowHandle1, 14, 'mono', 'true', 'false')
dev_display (Image_bulb)
**3、创建SVM *****************************
* 类型名称列表 合格,不合格,不存在
ClassNames := ['good', 'bad', 'none']
* 类型对应颜色
ClassColors := ['forest green', 'red', 'red']
* svm参数
Nu := 0.05
KernelParam := 0.02
NumFeatures := 7
* 创建SVM
create_class_svm (NumFeatures, 'rbf', KernelParam, Nu, |ClassNames|, \
'one-versus-one', 'normalization', 6, SVMHandle)
**4、添加样本到分类器************************
add_samples_to_svm (SVMHandle, read_path, ClassNames, WindowHandle1)
**5、训练分类器******************************
dev_clear_window ()
disp_message (WindowHandle1, 'Training...', 'window', -1, -1, 'black', 'true')
train_class_svm (SVMHandle, 0.001, 'default')
disp_message (WindowHandle1, 'Training completed', 'window', -1, -1, 'black', 'true')
disp_continue_message (WindowHandle1, 'black', 'true')
stop ()
**6、使用分类器******************************
dev_set_draw ('margin')
*列出文件夹目录下的所有文件
list_files (read_path, ['files','recursive'], Files)
*获取后缀PNG结尾的所有图像
Selection := regexp_select(Files,'.*[.]png')
*读取一张图像
read_image (Image, Selection[0])
*关闭窗口
dev_close_window ()
*获取图像的大小
get_image_size (Image, Width, Height)
*打开窗口
dev_open_window (0, 0, Width / 2, Height / 2, 'black', WindowHandle)
*设置字体信息
set_display_font (WindowHandle, 14, 'mono', 'true', 'false')
for Index := 0 to |Selection| - 1 by 1
classify_class_img_path (Image, Region, SVMHandle, Selection[Index], Class)
*显示图像
dev_display (Image)
*设置输出对象颜色
dev_set_color (ClassColors[Class])
*显示阈值区域
dev_display (Region)
disp_message (WindowHandle, 'Classified as:' + ClassNames[Class], 'window', -1, -1, 'black', 'true')
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endfor
* 清除内存里的分类器
clear_class_svm (SVMHandle)
子程序 --添加图片到分类器
add_samples_to_svm (SVMHandle, read_path, ClassNames, WindowHandle1)
参数说明
SVMHandle, SVM分类器句柄
read_path, 读取图片总文件夹地址
ClassNames, 分类名称(文件夹名称)
WindowHandle1 显示句柄
for ClassNumber := 0 to |ClassNames| - 1 by 1
*列出目录下的所有文件
list_files (ReadPath + ClassNames[ClassNumber], 'files', Files)
*获取后缀为PNG的所有文件
Selection := regexp_select(Files,'.*[.]png')
for Index := 0 to |Selection| - 1 by 1
*读取图像
read_image (Image, Selection[Index])
dev_display (Image)
*图像阈值
threshold (Image, Region, 0, 40)
dev_display (Region)
* 提取region的特征
calculate_features(Region, Features)
* 添加样品 放入SVM
add_sample_class_svm (SVMHandle, Features, ClassNumber)
endfor
endfor
return ()
子程序 – 提取区域特征
calculate_features (Region, Features) 调用
参数
Region, 区域(连通域)输入(图片类型)
Features 输出特征(7个特征数组)
* 面积
area_center (Region, Area, Row, Column)
* 紧密度
compactness (Region, Compactness)
* 二阶矩
moments_region_central_invar (Region, PSI1, PSI2, PSI3, PSI4)
* 凸度
convexity (Region, Convexity)
* 7个特征
Features:=real([Area, Compactness, PSI1, PSI2, PSI3, PSI4, Convexity])
return ()
子程序 – 图片的分类
classify_class_img_path (Image, Region, SVMHandle, Selection[Index], Class)
Image, 输出图片
Region, 输出图片区域
SVMHandle, 输入SVM分类句柄
img_path, 输入图片路径
Class 输出 图片类型
read_image (Image, img_path)
*对图像阈值
threshold (Image, Region, 0, 40)
*计算区域的特征值
calculate_features (Region, Features)
*用SVM分类器进行分类
classify_class_svm (SVMHandle, Features, 1, Class)
return ()