Halcon 中,全局阈值分割是一种常用的图像分割方法,用于将图像中的目标区域与背景区域分离。我们将用全局分割来识别和计算出豆子的数量.以下图为例:
dev_get_window (WindowHandle)//获取到当前窗口的控制权
read_image(Image,'pellets.png')
*使用全局阈值分割图像
*设置灰度值时可以借助灰度直方图
*适用于斑点筛选
*分割之后会把满足的区域整理成一个Region
threshold (Image, Regions, 124, 209)
*连通性,目的是把Region连接起来,(满足阈值的斑点很多,都是独立的,通过连通性把这些斑点正好到一起)
connection(Regions,ConnectedRegions)
*筛选:根据特征结合条件选出来想要的
*SelectedRegions属于筛选之后的图像变量,没运行或者结果不对都无法正确赋值
*筛选针对的是特征,可以借助特征直方图
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 1000, 5000)
*圆形腐蚀:目的是为了让区域分开,原理是减少像素点,有可能会造成轮廓大小发生变化
erosion_circle(SelectedRegions,RegionErosion,5)
*由于腐蚀是单个进行的,所以RegionErosion中是多个独立的区域,还需要联通到一起,方便后续加工
connection (RegionErosion, ConnectedRegions1)
*由于腐蚀过程中损坏了原有的区域轮廓,需要还原原有轮廓的大小,通过膨胀算子,消除小物体平滑
*大物体的边界
dilation_circle (ConnectedRegions1, RegionDilation, 5)
*先侵蚀后膨胀属于形态学调整
dev_set_draw ('margin')
*把处理好的区域显示到Image上
dev_display(Image)
dev_display(RegionDilation)
*显示出来豆子的数量
*获取到之前膨胀区域的中心点(包含面积,x,y)
area_center (RegionDilation, Area, Row, Column)
*设置中心原点
*目的是为了在豆的中心标记一个+
gen_cross_contour_xld (Cross, Row, Column, 6, 0.785398)
*准备计数器:一个+ Number++
count_obj(Cross,Number)
*设置接下来要显示的颜色:这里类似于c#中的GDI,假如上面画笔是黑色,在这里改成粉色
dev_set_color('red')
*设置字号 2.字号 3.字体 4.是否加粗 5.是否倾斜
set_display_font (WindowHandle, 30, 'sans', 'true', 'false')
*设置显示的位置
set_tposition (WindowHandle, 10, 200)
write_string (WindowHandle, '豆数量'+Number)
思路:1.读取图片
2.使用全局阈值分割进行斑点筛选
3.连通之后进行特征筛选(面积)
4.图形腐蚀
5.膨胀
6.显示文字