HALCON示例程序color_fuses.hdev通过颜色对保险丝进行分类
示例程序源码(加注释)
- 关于显示类函数解释
dev_update_window (‘off’) - 定义字符串变量并初始化
FuseColors := [‘Orange’,‘Red’,‘Blue’,‘Yellow’,‘Green’]
FuseTypes := [5,10,15,20,30] - 在hsv的H分量重Orange阈值为 10-30, Red阈值为 0-10以此类推
HueRanges := [10,30,0,10,125,162,30,64,96,128]
Count := 0
dev_close_window ()
dev_open_window (0, 0, 800, 600, ‘black’, WH)
while (Count <= 4)- 读入图片
read_image (Image, ‘color/color_fuses_0’ + Count)
dev_display (Image) - 设置光标位置,并打印字符串,也是显示类函数
set_tposition (WH, 12, 512)
write_string (WH, ‘color/color_fuses0’ + Count + ‘.png’) - 下边的两句话是将三通道彩色图片转换为HSV通道。第一步先将彩色图片分成RGB三通道图片,之后进行RGB向HSV转化。
decompose3 (Image, Red, Green, Blue)
trans_from_rgb (Red, Green, Blue, Hue, Saturation, Intensity, ‘hsv’) - 对S空间图像进行二值化操作
threshold (Saturation, Saturated, 60, 255) - 使用二值化后的区域来缩小H空间内的图像定义域,通俗点的话是把保险丝抠图扣出来
reduce_domain (Hue, Saturated, HueSaturated)
for Fuse := 0 to |FuseTypes| - 1 by 1- 通过程序开始时定义的H空间分割阈值进行二值化
threshold (HueSaturated, CurrentFuse, HueRanges[Fuse * 2], HueRanges[Fuse * 2 + 1]) - 分割连通域
connection (CurrentFuse, CurrentFuseConn) - 填充孔洞
fill_up (CurrentFuseConn, CurrentFuseFill) - 通过面积筛选保险丝
select_shape (CurrentFuseFill, CurrentFuseSel, ‘area’, ‘and’, 6000, 20000) - 求取区域的坐标
area_center (CurrentFuseSel, FuseArea, Row1, Column1)
dev_set_color (‘magenta’)
for i := 0 to |FuseArea| - 1 by 1
set_tposition (WH, Row1[i], Column1[i])
write_string (WH, FuseColors[Fuse] + ’ ’ + FuseTypes[Fuse] + ’ Ampere’)
endfor
set_tposition (WH, 24 * (Fuse + 1), 12)
dev_set_color (‘slate blue’)
write_string (WH, FuseColors[Fuse] + ’ Fuses: ’ + |FuseArea|)
endfor
stop ()
Count := Count + 1
endwhile
dev_update_window (‘on’)
- 通过程序开始时定义的H空间分割阈值进行二值化
- 读入图片
处理思路
这个例子是将三通道的RGB图像转化到HSV空间进行分割的例子,使用 decompose3 、trans_from_rgb 两个算子实现RGB图像转化到HSV空间作用,使用HSV空间内区域特征更加明显的特点进行分割。
后记
大家有什么问题可以向我提问哈,我看到了第一时间回复,希望在学习的路上多多结交良师益友。