简介:这一篇将实现获取区域的中心点、面积和最小外接圆半径,并将数值标注到图像上
待处理图片:
1.ROI
首先我们需要获取ROI,这里使用自带的工具来实现,在ctrl+r读取目标图片后,在图片窗口点击ROI图标(通常在‘>>’符号里面)以便打开ROI窗口
打开窗口后,点击工具栏的图形绘制,绘制一个矩形,以框出大致的区域,之后点击右键,就可以记录这部分操作
之后点击ROI窗口工具栏最右边的插入程序代码按钮,以将这部分产生ROI矩形区域的算子插入到HALCON主程序窗口中。
最终得到的ROI是这样的。
划分ROI将减免不必要的亮度区域,以便于之后的通过灰度直方图将图片中的圆形和方形划分开来
#display
read_image (FindCenter,'C:/Users/sinzo/Desktop/halcon/class 1/find center.bmp')
gen_rectangle1 (ROI_0, 22, 502.786, 919,938.467)
reduce_domain (FindCenter, ROI_0,ImageReduced)
get_image_size (ImageReduced, Width,Height)
dev_open_window_fit_image (ImageReduced, 0,0, Width/3, Height/3, WindowHandle)
dev_display (ImageReduced)
2.通过灰度阈值二值化区域
点击蓝色箭头处图标打开灰度直方图窗口,并将灰度直方图窗口【操作】一列的勾点亮(默认是红叉),从而使得图形窗口能够显示出合适的
可以看到圆形区域实际上有一些噪点,这些未被选择的噪点会影响计算数据的准确度。之后我们会通过算子来解决这些噪点
完成二值化阈值的设置选择之后在对区域进行连接,这里使用connection算子
#find edge
threshold (ImageReduced, Regions, 115, 255)
connection (Regions, ConnectedRegions)
3.完善图形去除噪点
因为这里的图形都是规整的图形,所以我们可以通过选择形状算子select_shape和改变区域形状算子shape_trans来对图形区域的噪点进行处理从而得到接近理想,防止数据干扰的图形区域。
这一步操作之后就可以获得比较准确的图形区域的数据了
4.获取数据
主要是调用算子,常用算子有
*中心点:
area_center (RegionTrans_circle, Area, Row,Column)
*周长:
fuzzy_perimeter (RegionBorder,ImageReduced, 0, 255, Perimeter)
*通过公式计算得到半径和圆周:
CRadius:=sqrt(Area/3.1415926)
CCircumference := CRadius*2*3.1415926
5.显示数据
计算出的数据都会显示在控制变量窗口,要把数据叠加显示到图形窗口,或者是标注出圆心的位置,需要用到几个函数
一个是disp_circle,显示圆形,我们可以用这个算子标注出圆心位置。生成图形的颜色可以使用dev_set_color进行变更(具体请参照说明文档和算子示例)。
#display data
for index := 0 to |Number| by 1
disp_circle(WindowHandle,Row[index], Column[index], 10)
dev_set_color('white')
set_tposition (WindowHandle, Row[index], Column[index])
write_string (WindowHandle, 'Center:'+Row[index]+','+ Column[index])
set_tposition (WindowHandle, Row[index]+30, Column[index])
write_string (WindowHandle, 'Area:'+Area[index])
set_tposition (WindowHandle, Row[index]+60, Column[index])
write_string (WindowHandle, 'Perimeter:'+Perimeter[index])
dev_set_color('blue')
endfor