HALCON获取区域的中心点、面积和最小外接圆半径

简介:这一篇将实现获取区域的中心点、面积和最小外接圆半径,并将数值标注到图像上


待处理图片:






1.ROI

 

首先我们需要获取ROI,这里使用自带的工具来实现,在ctrl+r读取目标图片后,在图片窗口点击ROI图标(通常在‘>>’符号里面)以便打开ROI窗口

 HALCON获取区域的中心点、面积和最小外接圆半径_第1张图片

 

打开窗口后,点击工具栏的图形绘制,绘制一个矩形,以框出大致的区域,之后点击右键,就可以记录这部分操作

 HALCON获取区域的中心点、面积和最小外接圆半径_第2张图片

 

之后点击ROI窗口工具栏最右边的插入程序代码按钮,以将这部分产生ROI矩形区域的算子插入到HALCON主程序窗口中。

 




最终得到的ROI是这样的。


HALCON获取区域的中心点、面积和最小外接圆半径_第3张图片

 

划分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.通过灰度阈值二值化区域

 

点击蓝色箭头处图标打开灰度直方图窗口,并将灰度直方图窗口【操作】一列的勾点亮(默认是红叉),从而使得图形窗口能够显示出合适的

 HALCON获取区域的中心点、面积和最小外接圆半径_第4张图片

 

 



 

HALCON获取区域的中心点、面积和最小外接圆半径_第5张图片

可以看到圆形区域实际上有一些噪点,这些未被选择的噪点会影响计算数据的准确度。之后我们会通过算子来解决这些噪点


完成二值化阈值的设置选择之后在对区域进行连接,这里使用connection算子

 

 

#find edge

threshold (ImageReduced, Regions, 115, 255)

connection (Regions, ConnectedRegions)


 

3.完善图形去除噪点

 

因为这里的图形都是规整的图形,所以我们可以通过选择形状算子select_shape和改变区域形状算子shape_trans来对图形区域的噪点进行处理从而得到接近理想,防止数据干扰的图形区域。

 

 

 HALCON获取区域的中心点、面积和最小外接圆半径_第6张图片

这一步操作之后就可以获得比较准确的图形区域的数据了



 

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进行变更(具体请参照说明文档和算子示例)。

 

 HALCON获取区域的中心点、面积和最小外接圆半径_第7张图片

 

 

#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



你可能感兴趣的:(影像相关)