GMM分类器颜色识别
原图(1)训练图(2)颜色分类目标图
代码结果
原图
(1)训练图
(2)颜色分类目标图
代码
dev_close_window
()
read_image
(Image
, 'color_fuses_00.png')
dev_open_window_fit_image
(Image
, 0, 0, -1, -1, WindowHandle
)
*颜色类型数组
FuseColors
:= ['Orange','Red','Blue','Yellow','Green']
*颜色类型所对应使用的画笔颜色
FuseHighlight
:= ['orange','red','blue','goldenrod','forest green']
*设置字体
set_display_font
(WindowHandle
, 12, 'mono', 'true', 'false')
dev_set_draw
('margin')
dev_set_color
('white')
dev_set_line_width
(2)
dev_display
(Image
)
*生成对应颜色的矩形位置
gen_rectangle1
(FuseOrange
, 195, 90, 230, 120)
dev_display
(FuseOrange
)
disp_message
(WindowHandle
, 'Orange Fuse', 'image', 160, 90 - 65, 'black', 'true')
gen_rectangle1
(FuseRed
, 191, 280, 226, 310)
dev_display
(FuseRed
)
disp_message
(WindowHandle
, 'Red Fuse', 'image', 160, 280 - 55, 'black', 'true')
gen_rectangle1
(FuseBlue
, 190, 470, 225, 500)
dev_display
(FuseBlue
)
disp_message
(WindowHandle
, 'Blue Fuse', 'image', 160, 470 - 60, 'black', 'true')
gen_rectangle1
(FuseYellow
, 192, 672, 227, 702)
dev_display
(FuseYellow
)
disp_message
(WindowHandle
, 'Yellow Fuse', 'image', 160, 672 - 70, 'black', 'true')
gen_rectangle1
(FuseGreen
, 197, 880, 232, 910)
dev_display
(FuseGreen
)
disp_message
(WindowHandle
, 'Green Fuse', 'image', 160, 880 - 65, 'black', 'true')
stop
()
*把颜色位置区域加载到空对象中
gen_empty_obj
(ClassObject
)
concat_obj
(ClassObject
, FuseOrange
, ClassObject
)
concat_obj
(ClassObject
, FuseRed
, ClassObject
)
concat_obj
(ClassObject
, FuseBlue
, ClassObject
)
concat_obj
(ClassObject
, FuseYellow
, ClassObject
)
concat_obj
(ClassObject
, FuseGreen
, ClassObject
)
* creat_class_gmm();
*含义:创建高斯混合模型;
*输入参数:
* NumDim:几个特征;
* NumClasses
:样本分类个数;
* NumCenters
:类中心的个数;
* CovarType
:协方差矩阵(
'Spherical','diag','full')
* Preprocessing
:预处理是否使用,及特征向量转换类型;
* NumComponents
:预处理参数,转换特征数;
* RandSend
:随机种子,初始化GMM;
*输出参数:
* GMMHandle
:高斯混合模型
*1、创建GMM分类器
create_class_gmm
(3, 5, 1, 'full', 'none', 3, 42, GMMHandle
)
*add_samples_image_class_gmm
* Image
:训练的图像(多通道)
* ClassRegions
:图像中用于训练的类区域
* GMMHandle
:高斯混合模型
* Randomize
:高斯噪声标准差
*2、增加训练样本(图片区),放入GMM 进行训练数据
add_samples_image_class_gmm
(Image
, ClassObject
, GMMHandle
, 0)
*train_class_gmm
**含义:训练高斯混合模型
*输入参数:
**GMMHandle:高斯混合模型
**MixIter
: 期望最大值算法中迭代最大数
**Threshold
:期望误差阈值,超过此值,计算取消。
**ClassPriors
:类的先验概率类型(
'training','uniform')
'uniform'表示使用相同的权重,
1/NumClasses
;'training'表示类发生的概率是依据样本中的概率推断。
**Regularize
:调整值,为了防止计算中出现奇异协方差矩阵。增加到协方差矩阵的对角线上的一个很小的值
*输出参数:
**Centers
:每个类的中心个数
**Iter
:每个类的迭代次数
*3、训练GMM模型
train_class_gmm
(GMMHandle
, 100, 0.001, 'training', 0.0001, Centers
, Iter
)
*4、创建一个查找表,关联高斯混合模型查找类级(创建定位对象)
create_class_lut_gmm
(GMMHandle
, ['rejection_threshold','bit_depth'], [0.05,6], ClassLUTHandle
)
*******对目标图像颜色分类
********
Imagepath
:= 'color_fuses_0'
for i
:= 0 to
3 by
1
read_image
(Image
, Imagepath
+i
)
*5、使用查找表在图像中搜索相关的类级,输出所有查找到的类级区域
classify_image_class_lut
(Image
, ClassRegions
, ClassLUTHandle
)
dev_display
(Image
)
dev_set_line_width
(3)
for j
:= 1 to
|Centers
| by
1
copy_obj
(ClassRegions
, ObjectsSelected
, j
, 1)
closing_circle
(ObjectsSelected
, RegionClosing
, 3.5)
connection
(RegionClosing
, ConnectedRegions
)
select_shape
(ConnectedRegions
, SelectedRegions
, 'area', 'and', 2500, 99999)
fill_up
(SelectedRegions
, RegionFillUp
)
area_center
(RegionFillUp
, Area
, Row
, Column
)
shape_trans
(RegionFillUp
, RegionTrans
, 'convex')
smallest_rectangle2
(RegionTrans
, Row1
, Column1
, Phi
, Length1
, Length2
)
dev_set_color
(FuseHighlight
[j
-1])
dev_display
(RegionTrans
)
for k
:=0 to
|Row1
|-1 by
1
set_tposition
(WindowHandle
, Row1
[k
] , Column1
[k
]-0.5*Length2
[k
])
write_string
(WindowHandle
, FuseColors
[j
-1]+' '+(k
+1))
endfor
endfor
disp_message
(WindowHandle
, '保险丝颜色识别结果_'+(i
+1)+':', 'window', 10, 10, 'black', 'false')
dump_window
(WindowHandle
, 'png', '保险丝颜色识别结果_'+(i
+1))
stop
()
endfor
结果