机器视觉软件HALCON实验指导书目录实验1 HALCON 概述,应用范例实验2 HDevelop介绍,操作编程范例实验3 HALCON编程接口,高级语言编程实验4 HALCON数据结构,采集硬件接口实验5 HALCON采集硬件配置,图像采集实验6 HALCON二维测量,配准测量与识别定位实验7 HALCON一维测量,尺寸测量实验8 HALCON三维测量,3D重建测量实验1 HALCON 概述,应用范例实验2 HDevelop介绍,操作编程范例1 邮票分割文件名: stamps.dev第一个例子进行文件分析任务。
图5.1展示了部分邮票目录页。
它描述了两种不同的邮票:以图形描述为主和以文字描述为主。
为了使用这个例子,必须把文字描述转化为计算机所能理解的形式。
你可能使用OCR编程方式,你很快发现由于邮票的图形描述会导致大多数的可使用模块产生错误。
于是另一项任务必须要进行预处理:对所有的邮票进行转化(例如,把邮票转化为灰色有价值的纸),这样就可以使用OCR处理邮票的剩余部分了。
当创造一个应用程序来解决这种问题,对要处理的对象进行特征提取是非常有帮助的。
这个任务可以为新手提供解决的这类问题一些的经验。
●一般而言,特征提取有如下步骤:邮票比纸要黑。
●邮票包含图像的部分不重叠。
●邮票具有最大最小尺寸。
●邮票是长方形的。
图 5.1: Mi c he l图表的部分页.如果直接使用属性清单而非编程,任务会变得很简单。
可惜由于语言的含糊,这是不可能的。
所以你需要建构具有精确的语法和语义的语言,尽可能接近非正式的描述。
使用HDevelop语法,一个通常的程序看起来如下:dev_close_window ()read_image (Catalog, ’swiss1.tiff’)get_image_pointer1 (Catalog, Pointer, Type, Width, Height)dev_open_window (0, 0,Width/2, Height/2, ’black’, WindowID)dev_set_part (0, 0,Height-1, Width-1)dev_set_draw (’fill’)threshold (Catalog, Dark, 0, 110)dev_set_colored (6)connection (Dark, ConnectedRegions) fi l l_u p(ConnectedRegions, RegionFillUp) select_shape(RegionFillUp, StampCandidates, ’area’,’and’, 10000, 200000)select_shape (StampCandidates,Stamps, ’compactness’, ’and’, 1, 1.5)smallest_rectangle1 (Stamps, Row1, Column1, Row2, Column2)dev_display (Catalog)dev_set_draw (’margin’)dev_set_line_width (3)disp_rectangle1 (WindowID, Row1, Column1, Row2, Column2)由于一些为止的操作符合不熟悉的语法,这个程序咋看起来会很晦涩。
但如果仔细看一下这个操作符,你就会注意以下说明的直接联系。
threshold选择全部图像像素黑暗比值。
connection 合并所有选定像素触摸相互连通区。
selectshape选择区域面积(属性:'面积')在指定区间内。
sm allestrec tangle1计算每个区域的坐标(连续/栏)的包围矩形。
一旦用户熟悉了承操作符和语法、转换就变得很容易。
特别需要指出,对于程序来说,图像或者加工区是否被处理并不重要,你可以使用相同的方法处理他们。
. 由于中间数据结构的内存管理对用户来说是透明的,你可以不必理会它,你可以集中解决图像分析任务。
图5.2邮票分割处理的结果2毛细血管文件名: ve ss el. dev这个例子的任务是分割毛细血管。
尤其,你要把图5.3(图像左)的细胞区域的上、下部分从图像的中央区域区分开。
区界线很模糊,甚至以人的来认识他们都是困难的。
乍看之下,似乎很难找到一个分割准则: 在这两幅图的灰度值既无明显清晰的边界也无明显的不同。
所以用限定操作或边界操作并不是很有用。
解决这一问题的一个方法是利用区域的不同质地:细胞比有血液供应得部分的更有角质化。
强调这种差异,你可以用纹理变换。
变换是线性纹理过滤加大对某些频率所要求的典型纹理。
HALCON的相应操作叫做纹理法则。
你必须指明大小和过滤式。
双方属性确定的频率的性能。
在这个程序里过滤器”el”使用 5 ×5的大小。
在垂直方向和水平方向,它表现了一个平滑推导。
因此在垂直方向是加大结构。
你不可以直接使用计算机的处理结果(图5.3 右),因为他有太多的斑点。
因此,你可以通过一个主要的过滤器产生纹理图像。
通过这你可以的得到所谓的纹理能量(图5.4左)。
图5.4: 毛细血管纹理能源(左)和分割(右)。
选择的过滤面罩在这个计划是非常大的。
面具大小在水平方向和垂直方向为211和61。
采用不对称方式,因为在水平方向上血管是堵塞的。
因此你得到一个图像上下部分比中间部分明亮。
read_image (Image, ’vessel’)texture_laws (Image, Texture, ’el’, 5,5)mean_image (Texture, Energy, 211, 61)bin_threshold (Energy, Vessel)区分这些区域你只要找到合适的门槛。
在这种情况下,我们有两种不同的纹理—门限可以自动发现。
这是有操作符b i n th r e s h o l d完成的,这也同样门限的结果和这样的血管。
图5.4(右)显示了分割的结果。
3 颗粒文件名: p a r t i c l e .dev这个程序示例处理的图像是来自于一个医学程序的处理结果。
它显示载体上的微小颗粒(图 5.5左)。
图5.5:微小颗粒(左)大的物体(右)。
正如其他许多医学应用, 目前已存在的对象必须进行评估统计。
这意味着将有不同的对象按大小或其它属性提取和分类,这样你可以分析他们。
为解决这一问题迈出的重要一步,是相关物件的图像分割。
统计评价为您不妨看看合适的文献统计。
在我们的例子有两个类型的对象:--- 大的,明亮的颗粒--- 小的,暗的颗粒大的,明亮的颗粒由于它们的灰度值不同于它们的背景。
比背景明亮意味着要使用门限方式处理。
你唯一要决定的是指定门限是自动还是使用经验值。
在我们的例子里,一个固定的门限值由于好的对比是非常重要的。
因此,你要有一个好的计算方法:read_image (Particle,’particle’)threshold (Particle, Large, 110, 255)变量其包含所有像素灰度值超过110。
你可以从图5.5右边的图看到。
发现小的,暗的颗粒是很困难的。
指出门限的第一步努力说明没有固定的门限使用与所有的颗粒。
但是如果更仔细的观察你就会发现小的颗粒比它们周围的环境明亮,例如,你可以指定一个合时的门限值对小图像的部分区域是合适的。
现在,把这个发现转化为算法是容易的,一种决定门限的值的本地方法。
另一个可能的解决当地环境的定义由n阶窗口,这种方法在本例中使用。
窗外的平均值作为一个近似的背景强度。
这可以通过选择低通滤波,要么是平均要么是高斯滤波器过滤。
窗口尺寸大小决定于当地的环境,并应约两倍之多对象搜寻。
这样显示平均直径15像素,用口罩面积31。
由此所指定的象素比较原始灰度值的平均数。
减少噪音引起的问题加上一个常量(3)。
适当程序段看起来如下:mean_image (Particle, Mean, 31, 31)dyn_threshold (Particle, Mean, Small, 3,’light’)dynthreshold操作符比较两个像素的图像像素。
可以看到图5.6(左)分割结果。
我们看到,所有的物体被发现. 可惜,边缘的大型粒子和一些非常小的区域,由于噪音的出现也混合在一起出现。
我们一开始尝试压缩边界。
这样做的会产生一个超过允许最大值的常数。
你可以这样做:connection (Small, SmallSingle)select_shape (SmallSingle, ReallySmall, ’area’, ’and’, 1, 300)采用这种方法你也有可能清除掉一些非常小的物体。
你只需要使用selectshape增调用增加最小尺寸。
但是如果你再次检查分割结果,你会发现一些已经造成像素提取第一分割。
因此你应该寻找小颗粒以弥补大的不足。
为了避免分割大颗粒附近的小颗粒,这些都是建立在互补放大。
因此,我们如下修改的程序。
dilation_circle (Large, LargeDilation, 8.5)complement (LargeDilation, NotLarge)reduce_domain (Particle, NotLarge, ParticleRed)mean_image (ParticleRed, Mean, 31, 31)dyn_threshold (ParticleRed, Mean, Small, 3,’light’)图5.6 简单物体(左)和高级分割(右)这种方法显示出两个优点:图5.6 小物体:简单(左)和已经分割的(右)dilation_circle (Large, LargeDilation, 8.5)complement (LargeDilation, NotLarge)reduce_domain (Particle, NotLarge, ParticleRed)mean_image (ParticleRed, Mean, 31, 31)dyn_threshold (ParticleRed, Mean, Small, 3,’light’)这种方式有两种优势:第一,大颗粒的模型可以被用来提取小的颗粒。
这增加了分割的质量;第二,分割的进程被加速,因为分割的第二部分工作建立在部分图像之上。
图5.6的右边图像显示了分割结果。
可惜,图像仍然还有噪音。
为了去掉它们,你要么使用以前说过的使用面积来去除,要么使用opening操作符,我们推荐使用第二种方法,因为它能平滑图像的边界。
opening_circle (Small, SmallClean, 2.5)这里opening操作符使用循环结构,这个操作符所保存的区域最小是一个直径为2.5的区域。