halcon简介
halcon在工业视觉中属于很棒的。
学习halcon需要具备 软件、图像处理、光学 三个部分的知识。图像处理一般的套路就是 获取图像>分割区域>特征提取。
halcon文件所在位置:
Users / Shared / Library / Application Support / halcon 13 / example / hdevelop/
我们做项目的图片路径就在 example/images/
里面
一、嵌入式工业读码器
包括DM码、QR码、vericode码
二、 图像采集的原理,以及准确成像的专业方法
-
1.2 相机的接口类型
USB、IEEE1394、Gigabit Ethernet(千兆网) -
1.3 小试halcon
首先,安装相机驱动(一些品牌halcon自带驱动),比如balser安装pylon驱动,打开halcon界面,选择助手,打开新的Image Acquisition,选择资源,自动检测接口,然后点击右边的按钮选择一个接口,选择后把选项 资源 切换到 连接,再点击连接框里面的一个连接,表示相机和软件建立连接,再点击 实时,相机实时采集数据了。
三、 Blob分析与形态学
① Blob
区域是一种非常重要的概念。
区域是blobs这一数据类型在halcon中的一种贴切的表达形式。
采集图像-区域分割,最后通过特征(如圆度、面积、矩形度等)筛选,这一过程被称为Blob(binary large objects)分析。
② 形态学
形态学是对区域大小调整的一种非常重要的方法和概念。形态学包括「开运算、闭运算、腐蚀、膨胀」
形态学需要引入一个新的概念,即结构元素。
- 开运算可以去除小区域以及原区域中突出的细节部分;
- 闭运算可以填补相邻区域以及空洞;
- 腐蚀,会有一个结构元素,即一个形状的像素组合,以这个结构元素的中心点像素来计算保留处,这个结构元素在目标元素中逐行移动,若目标元素中的形状和结构元素相同,这个目标元素中对应中心点像素保留。
- 膨胀,与腐蚀相反,即参照一个结构元素,这个结构元素我们可以设定中心点,需要膨胀的位置,然后顺着图像一格一格走,只要有和中心点有交集,即可按结构元素膨胀。
开运算就是先腐蚀再膨胀,闭运算就是先膨胀再腐蚀。参考
-
灰度直方图。在图像处理中使用非常频繁,比如分开绿豆和红豆,可以拍照后选择灰度,红色和绿色灰度不同,通过直方图选择灰度范围,即可选择出红豆或绿豆。
-
特征直方图。比如圆度、面积、
实战案例-区分红豆和绿豆
-
1.首先打开一张图片,点击确定,打开图片后,按住command不放,在图片界面会出现 当前的像素坐标和 灰度值
-
2.获取图片后,按照套路开始图片分割,我们打开灰度直方图,直接点上方的按钮,选择合适的灰度范围。按照下图操作完后,点击单步跳过函数
整个程序的编写和思考如下:
* 1. 采集图像
read_image (HalconTest01, '/Users/jkx/Desktop/halcon_test01.png')
* 2. 分割图像
threshold (HalconTest01, Regions, 43, 247) // regions区域,表示选中43-247中间的灰度
dev_set_draw('margin') // 画出边缘
dev_display(HalconTest01) // 显示halconTest01这个图片,主要是生成 HalconTest01 这个变量
dev_display(Regions) // 显示 分割过的 Regions 图片,此时可以看到图片背景有杂质,下一步要去除杂质
* 3. 采用开运算,消除图像杂质,先构建结构元素,结构元素中心点坐标我们可以不用管
gen_circle(Circle, 200, 200, 20) // 200,200 是结构元素的坐标,不管,后面是半径,根据你杂质的大小选择,否组杂质清不干净
opening (Regions, Circle, RegionOpening) // 开运算,表示打开 Regions这个对象,依照结构元素Circle这个对象,且生成新的RegionOpening对象
dev_clear_window()
dev_display(HalconTest01)
dev_display(RegionOpening)
* 4. 分离区域,将一个区域分解成多个区域
connection(RegionOpening, ConnectedRegions) //这次分离只分离开部分,后面优化可以删掉这条
gen_circle(Circle1, 200, 200, 21.5) // 腐蚀,结构元素更大,确保连在一起的豆子被分割开,Circle1是对象
erosion1 (ConnectedRegions, Circle1, RegionErosion, 1) // ConnectedRegions, Circle1, RegionErosion, 1 ,括号里是函数的参数,这些参数是对象,RegionErosion是新的对象,halcon的套路是函数参数里靠后的是新生成的对象,输入、结构元素、输出
connection (RegionErosion, ConnectedRegions1) // 分离开这些豆子
* 5. 再次清屏,为了更好的展示效果
dev_display(HalconTest01)
dev_display(RegionErosion)
* 6. 数一数有多少个被腐蚀后的参数
count_obj(ConnectedRegions1, Number)
* 7. 膨胀,恢复原来的样子
dilation1 (ConnectedRegions1, Circle1, RegionDilation1, 1)
* 8. 再次清屏,显示效果,为了便于理解,程序才这么啰嗦,实际可简化
dev_clear_window ()
dev_display (HalconTest01)
dev_display (RegionDilation1)
* 9. 插入特征直方图,区分豌豆和绿豆
select_shape (RegionDilation1, SelectedRegions, 'circularity', 'and', 0.571, 0.743)
dev_set_line_width (2)
dev_display (HalconTest01)
dev_display (SelectedRegions) // 和上面的不能倒顺序,倒顺序就只能显示Halcon01,不能显示 SelectedRegions
count_obj (SelectedRegions, Number1) // 数一下豌豆的数量
set_tposition (200000, 24, 12) // 设置显示文字的位置
write_string (200000, '豌豆的个数是:' + Number1) // 显示的内容
* dev_clear_window ()
* dev_display (HalconTest01)
difference (RegionDilation1, SelectedRegions, RegionDifference) // 差值运算,这里小错误,虽然差值了,很多元素看不见了,但是还存在,所以结果还是67,需要再次处理
select_shape (RegionDifference, SelectedRegions1, 'area', 'and', 855, 4895)
count_obj (SelectedRegions1, Number2)
set_tposition (200000, 24, 12)
new_line (200000)
write_string (200000, '绿豆的个数是:' + Number2) // 显示绿豆数
③ 颜色空间
主要分为以下几点:Halcon支持的颜色空间、通道与颜色空间的转化、通道与区域分割方法、案例讲解
一般来说,我们得到一幅图像可以拆分为RGB(红黄蓝三通道分量交织,按BGRB排序)随后我们可以由RGB得到HSV空间图像。
而且,通道图像和 颜色空间图像 都是 8bit 灰度图像。
-
色调 H
用角度来度量,取值为 0~360度,从红色开始逆时针计算,红色为0,绿色为120,蓝色为240,它们的补色黄色为60,青色180,品红300. -
饱和度 S
饱和度表示颜色接近光谱的程度,一种颜色可以看出光谱色和白色混合的结果,其中光谱色越大,饱和度越高,颜色越艳丽,类似油画里的白矾,颜色加上白矾,它的保护度就降低了。 -
明度 V
明度表示颜色的 明亮程度,对于光源色,明度值取决于发光体的光亮度,对于物色体,此值和物体的折射比和反射比相关,一般取值从0%(黑)到100%(白)。
四、 几何定位+仿射变换+视觉测量
定位三方法:Blob定位、模板匹配、深度学习
仿射变换:就是一种特殊的几何变换,是一种投影,常见的有 旋转、平移、缩放
(就是矩阵间的运算)
Blob分析 模板匹配
五、MPL深度学习(多层神经网络)
比如对于不同的物品,A、B、C,我们可以通过纹理区分ABC,得出3个不同的值,再比如我们 通过周长区分ABC,又得出3个不同的值,那边把这些特征集合在一起构成特征向量
, 不同物品的特征向量值不一样,可以划分出ABC,这个划分的过程就是靠分类器完成的,而训练的过程就是根据 特征向量的不同,把他们训练成某类物品并归类分类。
MPL:Multi-Layer Perceptron
halcon视觉总结
一般来说,对于2D项目,无外乎这样的套路:
- 图像采集
- 预处理,主要有两种方法,
对比度
和去噪
- 预处理,主要有两种方法,
对比度:
scale_image (灰度缩放算子,在灰度直方图里操作,线性拉伸灰度)
emphsize (增强算子)
grey_range_rect (增加灰度动态范围的算子)
equ_histo_image (直方图均匀化,让图片灰度分布更均匀)
去燥:
mean_image (均值滤波)、高斯滤波、中值滤波
- 图像分割
二值化、形状选择、形态学
- 图像分割
- 特征识别 和 求取计算
- 显示与通讯
halcon中涉及的图像处理十大理论知识
- 图像处理基础知识
- 图像的灰度变换
- 图像增强(预处理:增强对比度 和去噪(均值、中值、高斯滤波))
- 图像的几何变换(仿射变换、投影变换、极坐标变换等)
- 图像分割(边缘提取、Blob分析等)
- 图像的频域(缺陷划痕检测等)
- 图像的形态学(膨胀、腐蚀、开运算、闭运算等)
- 图像的复原(这点halcon涉及不多,主要是刑侦用)
- 运动图像(运动检测,差分、光流法)
- 图像配准(模板匹配等)
六、硬件知识
购买工业相机必须要知道的参数
- 分辨率(Resolution):相机每次采集图像的像素点数。对于数字工业相机一般是直接与光电传感器的像元数对应的,对于模拟相机则是取决于视频制式,PAL制为768576,NTSC制为640480。
- 像素深度(Pixel Depth):即每像素数据的位数,一般常用的是8Bit.例如,一幅彩色图像的每个像素用R,G,B三个分量表示,若每个分量用8位,那么一个像素共用24位表示,就说像素的深度为24,每个像素可以是16 777 216(2的24次方)种颜色中的一种。在这个意义上,往往把像素深度说成是图像深度。表示一个像素的位数越多,它能表达的颜色数目就越多,而它的深度就越深。
- 最大帧率(Frame Rate)/行频(Line Rate):即相机采集传输图像的速率,对于面阵相机一般为每秒采集的帧数,对于线阵相机为每秒采集的行数。
- 曝光方式(Exposure)和快门速度(Shutter):对于线阵相机都是逐行曝光的方式,可以选择固定行频和外触发同步的采集方式,曝光时间可以与行周期一致,也可以设定一个固定的时间;面阵工业相机有帧曝光、场曝光和滚动行曝光等几种常见方式。数字工业相机一般都提供外触发采图的功能,快门速度一般可到10微秒,高速工业相机还可以更快。
- 像元尺寸(Pixel Size):像元大小和像元数共同决定了相机靶面的大小。目前数字工业相机像元尺寸一般为3-10μm,一般像元尺寸越小,制造难度越大,图像质量也越不容易提高。
- 光谱响应特性(Spectral Range):指该像元传感器对不同光波的敏感特性,一般响应范围是350-1000nm,一些相机在靶面前加了一个滤镜,滤除红外光线,如果系统需要对红外感光时可去掉该滤镜。
打光和镜头
《工程光学》 打光、选型、镜头
附录:以上是工业上的,其实在显微镜等超高精度的视觉中,除了要考虑相机图像分辨率,还要考虑 光学系统分辨率,这里一般精度在 nm 级别,可 参考文章
与公司算法工程师的交流:
-
问:卷积在图像算法中能干嘛?
答:可以用来滤波,也可以来模板匹配 -
问:图像中 均值滤波、高斯滤波、中值滤波,这些感冒?
答:去噪声。比如中值滤波可以去椒盐噪声, 自然界的噪声高斯噪声多,用高斯滤波去除,等等。补充:频域高通滤波锐化图像,即图像中的边界轮廓越明显,丢失了信息丰富的低频部分;频域低通滤波平滑图像,即图像中轮廓被淡化。 -
问:卷积是对图片进行平滑处理吗?
答:卷积可以理解为一种方法、一种操作,卷积就是按照块滑动处理,比如去一些图像毛刺。Halcon中的 开运算、闭运算、膨胀、收缩、也可以理解 为一种卷积。 -
问:傅里叶变换在图像中的意义是?
答:傅里叶变换用途很大,比如有时候噪声很难再时域中去除,在频域中 很好去除,另外,傅里叶可以用来压缩图像,图像打包后变成频域,解压再变成时域。 -
涉及具体数学,傅里叶到底对图片做什么?
答:图片其实可以理解为三维空间 图,xy 为空间位置,z为灰度值,通过傅里叶变换后,新的三维空间图像 xy 为不同方向的频率,z为幅值(待定)
图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯
度
这就得出了一个结论:傅里叶变换后的白色部分(即幅度较大的低频部分),表示的是图像中慢变化的特性,或者说是灰度变化缓慢的特性(低频部分)。
傅里叶变换后的黑色部分(即幅度低的高频部分),表示图像中快变化的特性,或者说是灰度变化快的特性(高频部分)。
网友评论