Halcon开发笔记001 尺寸测量实例分析

课题需要对图像中的缺陷进行尺寸评价,开发环境是Halcon。

选择使用最小外接矩形方法,原因主要是

  1. 可获得的评价参数多:长度,宽度,角度,长宽比,面积
  2. 通过长宽比参数可以判定缺陷形状

获取最小外接矩形的过程:
Halcon开发笔记001 尺寸测量实例分析_第1张图片
这里是做测试的原图

  1. 图像分割
    选取合适的阈值比较困难。考虑到是工厂环境,采光可能不均匀,也为了测试方便(主要使用手机拍照,光源是环境光和手机闪光灯), 采用动态阈值分割法,Halcon提供了一个函数:

dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset,
LightDark : )

其中第一个参数是原始图片,第二个参数是包含本地阈值的图片(用来获取灰度参考值),第三个参数是分割后得到的区域输出,第四个参数是阈值偏移量,第五个参数是问你需要暗的区域还是亮的区域。

这里有个问题,什么是包含本地阈值的图片?这里可以使用一个函数,先获取一张经过平均阈值处理的图片。

mean_image(Image : ImageMean : MaskWidth, MaskHeight : )

大概思路是使用高斯滤波,将每几个点的灰度值联系起来,取其平均值,比如在下图中,中间位置的灰度值取决于相邻八个点的灰度值,这样对图像中每个点进行处理,最终可以得到一张经过平滑处理的图像。
Halcon开发笔记001 尺寸测量实例分析_第2张图片
Halcon开发笔记001 尺寸测量实例分析_第3张图片
这里是经过均值滤波之后的图像

现在我们可以感性理解一下dyn_threshold这个函数:通过对比原图和局部临域之间的灰度值差,对每个局部小块获取一个局部的阈值,这样下来,对于局部灰度差异值大的图像来说可以很好地完成分割。
Halcon开发笔记001 尺寸测量实例分析_第4张图片
这里是经过动态阈值分割之后的图像

  1. 获取最小外接矩形
    其实Halcon已经将这种非常常用的处理算法打包,直接调用函数:

smallest_rectangle2(Regions : : : Row, Column, Phi, Length1, Length2)

Halcon开发笔记001 尺寸测量实例分析_第5张图片红框就是我们生成的最小外接矩形了

  1. 如果获得了多个最小外接矩形怎么办?
    在我本次的例子中虽然很顺利的生成了唯一的最小外接矩形,但是在大多数阈值分割不够完善的图像中,很容易生成多个最小外接矩形。这个时候就要考虑重新选择阈值分割的参数。
  2. 我们获取到的尺寸是物体的实际尺寸吗?
    很遗憾,到了这一步我们并没有得到物体的实际尺寸,因为在图像中没有任何一个已知尺寸的条件下,我们无法得到真实尺寸。这里得到的数值实际上是图像中的像素值,像素值可以通过dpi换算成尺寸,但是这个尺寸仅仅指的是图片在1:1打印后的尺寸,我们需要在图片中画下一个标尺,通过换算得到实际尺寸。
    在我的课题中,有一部分是测量系统的硬件设计,镜头到物体的距离将是一个固定值,所以我可以在硬件确定后通过测试得到一个转换公式,以此获得实际尺寸。
dev_close_window() 

dpi:=72
*这里做出说明,dpi是根据相机变化的参数,需要自行调整
read_image (image, 'D:/毕业设计/image/40x40.jpg') 
get_image_size(image, Width, Height)
dev_open_window(0, 0, Width/4, Height/4, 'black', WindowHandle) 
mean_image (image, ImageMean, 101, 101) 
dyn_threshold (image, ImageMean, Region, 1, 'dark') 
*使用动态阈值分割图像

connection(Region, ConnectedRegions)
*合并像素相连区成为一个Element

select_shape (ConnectedRegions, SelectedRegions, 'height', 'or', 1000, 100000)
*SelectedRegions:=Region
*选择具有特定特征的区域

smallest_rectangle2(SelectedRegions, Row, Column, Phi, Length1, Length2) 

tuple_max(Length1,MaxLength1)

for Index := 0 to |Length1|-1 by 1
    if(Length1[Index]==MaxLength1) 
        MaxLength2:=Length2[Index]
        MaxRow:=Row[Index]
        MaxColumn:=Column[Index]
        MaxPhi:=Phi[Index]
    endif
endfor
//将最大的最小外接矩形提取出来


dev_set_color('pink')
dev_set_line_width(5)

dev_set_draw('margin')
dev_set_color('red')
gen_rectangle2(Rectangle, MaxRow, MaxColumn, MaxPhi, MaxLength1, MaxLength2) 
disp_message(WindowHandle,'宽度为:'+MaxLength2/dpi*25.4, 'window',0,0, 'black', 'true') 
disp_message(WindowHandle,'长度为:'+MaxLength1/dpi*25.4, 'window', 0,100, 'black', 'true')
disp_message(WindowHandle,'角度为:'+MaxPhi, 'window',0,200, 'black', 'true') 

你可能感兴趣的:(Halcon)