Halcon算子
0.图像基本操作
Halcon算子
0.图像基本操作
- read_image
- get_image_size
- rgb1_to_gray
- threshold
- connection
- select_shape
1.图像预处理
1.ROI区域
图像裁剪
- gen_rectangle1
- reduce_domain
2.图像增强
直方图均衡化
- equ_histo_image 直方图均衡化
- gray_histo 计算灰度分布,生成直方图
- gen_region_histo 由直方图转换为区域
增强对比度
- emphasize
- scale_image_max
处理失焦图像
-
锐化算子:Sobel、Canny、Laplace算子
-
冲击滤波器:shock_filter
3.平滑去噪
- 均值滤波:mean_image
- 中值滤波:median_image
- 高斯滤波:gauss_filter
4.光照不均匀
对于彩色图像,分离通道,分别直方图均衡化,合并
- 分离通道:decompose3
- 直方图均衡化:equ_histo_image
- 合并通道:compose3
一些细节
- 增强对比度:illuminate
- 照亮暗处
- 暗化亮处
2.图像分割
1.阈值处理
全局阈值
- threshold
自适应阈值
- auto_threshold
可以根据直方图进行自适应阈值,可以进行多重阈值处理,有几个波峰就会分成几个区域。
因为要根据直方图确定阈值,增加了高斯滤波来平滑直方图。sigma越大,平滑的越好,分割出的区域越少
自动全局阈值分割
- binary_threshold
内部集成不同的方法进行分割
可以选择提取较亮还是较暗的区域,适用于在较亮的背景上提取较暗的字符
局部阈值分割
- dyn_threshold
思路:将原图用平滑滤波处理,用原图减去平滑后的图,剩下的就是分割后的图了
这里的平滑后的图需要我们给出,等于它只做了个减运算
其他阈值分割方法
- var_threshold
基于局部的均值和标准差
- char_threshold
一般用来提取字符,取的是亮背景下的黑暗的字符,一般按照灰度值峰值的百分比取值
- dual_threshold
双阈值处理
2.区域生长法
获得具有相似灰度的相连区域
- regiongrowing
- regiongrowing_mean
3.分水岭算法
适用于复杂背景下的目标分割
- watersheds
如果前景较亮而背景暗,可以先将颜色反转 invert_image 再进行分水岭分割
3.颜色与纹理
1.图像的颜色
- RGB
- 灰度
- HSI/HSV
- Hue色调
- Saturation饱和度
- Value纯度
- Intensity亮度
Bayer图像转RGB图像
- cfa_to_rgb
根据输入图像的Bayer图像类型获得RGB图像
Bayer图像类型取决于第一行前两个像素类型
插值方法:biliner/biliner_dir/biliner_enhanced
颜色空间转换
- trans_from_rgb
- trans_to_rgb
- create_color_lut
- 颜色查找表
2.颜色通道的处理
访问通道
- access_channels
通道数量
- count_channels
通道分离与合并
-
decompose3
-
image_to_channels
- 把多通道图像分解成多个单通道图像的数组
-
compose3
-
channels_to_image
3.实例:利用颜色信息提取前背景相似的区域
read_image (Image, 'data/m105')
*将原始图像进行通道分离,得到红绿蓝三个分量的图像
decompose3 (Image, Red, Green, Blue)
*将RGB三个分量的图像转化为H(色调)、S(饱和度)、V(明度)的图像
trans_from_rgb (Red, Green, Blue, ImageResultH, ImageResultS, ImageResultI, 'hsv')
*对饱和度图像阈值处理,分割出高饱和度区域,即字符区域的大致范围
threshold (ImageResultS, High, 192,255)
*区域分割,
reduce_domain (ImageResultH, High, ImageReduced)
*并进行膨胀操作
dilation_circle (ImageReduced, RegionDilation, 3.5)
*开运算,使边缘更清晰
opening_circle (RegionDilation, RegionChars, 5.5)
dev_clear_window ()
dev_display (RegionChars)
4.纹理滤波器
texture_laws
4.形态学处理
1.腐蚀膨胀
结构元素structElement
可以由各种生成算子创建并指定尺寸(gen_circle/gen_rectangle1/gen_eclipse/gen_region_polygon)
腐蚀
原本属于一个区域,因为腐蚀而分开的区域还属于一个区域
- erosion_circle / erosion_rectangle1
- erosion1 预定义的自定义结构元素腐蚀
- erosion2 上一个基础上,结构元素的参考的可以是任意一点
- erosion_golay
- erosion_seq
膨胀
原本不相连的区域,即使膨胀后相连重叠,还是不属于一个区域
- dilation_circle / dilation_rectangle1
- dilation1 预定义的自定义结构元素膨胀
- dilation2 上一个基础上,结构元素的参考点可以是任意一点
- dilation_golay
- dilation_seq
2.开闭运算
开闭运算都不会明显改变主体部分的形态
开运算
- opening
- opening_circle
- opening_rectangle1
- opening_golay
- opening_seq
闭运算
- closing
- closing_circle
- closing_rectangle1
- closing_golay
3.顶帽/底帽运算
顶帽
原始二值图像减去开运算的结果
得到的是开运算中被移除的杂点
- top_hat
底帽
闭运算减去原始二值图像的结果
得到的是闭运算中填补的区域
- bottom_hat
应用
适合前景目标较小 或 背景面积较大的场景
4.基于灰度图像的形态学
对于像素的处理
-
gray_erosion_rect
-
gray_erosion_shape
-
gray_dilation_rect
-
gray_dilation_shape
-
gray_opening
-
gray_opening_rect
-
gray_opening_shape
-
gray_closing
-
gray_closing_rect
-
gray_closing_shape
5.实例:木材计数
区域合并
- concat_obj
示例代码
5.区域与特征提取
1.区域形状特征
面积与中心点
- area_center
补充
- select_obj 一个图像集合或者区域集合,在for循环中依次选取每个对象、
- set_tposition 设置输出文字的起始坐标点
- write_string 输出文字内容
封闭区域(孔洞)的面积
- area_holes
返回一个区域中所有空洞区域的面积之和
传入的参数区域是包含孔洞的区域,而不是孔洞本身,这里与area_center不同
补充
- dev_open_window_fit_image 打开一个适应图像大小的窗口
- disp_message 显示字符串
根据特征值选择区域
- select_shape
一般结合【特征直方图】使用,根据特征选择出不同区域
- select_shape_std
根据特征值创建区域
- inner_circle 最大内接系列
- smallest_rectangle2 最小外接系列
2.灰度特征
-
gray_features
-
min_max_gray
平均值与偏差
- intensity
- mean
- deviation
灰度区域的面积和重心
- area_center_gray
与area_center类似,但灰度图像的中心是它的重心,而不是几何中心
根据灰度特征值选择区域
- select_gray
3.纹理特征
创建灰度共生矩阵
- gen_cooc_matrix
用共生矩阵计算灰度值特征
- cooc_feature_matrix
灰度值特征
- 能量Energy
- 灰度共生矩阵中元素平方和
- 能量越大,灰度变化越稳定;反应了纹理变化的均匀程度
- 相关性Correlation
- 表示纹理在行或列方向的相似程度
- 相关性越大,相似程度越高
- 局部均匀性Homogeneity
- 反映图像局部纹理的变化量
- 值越大,表示局部变化越小
- 反差Contrast
- 矩阵值的差异程度,间接表现了图像的局部灰度变化幅度
- 反差值越大,纹理深浅越明显
创建共生矩阵并导出灰度值特征
- cooc_feature_image
类似于连续执行 cooc_feature_matrix 与 cooc_feature_matrix 两个算子
补充
- dev_set_window 通过窗口句柄选中接下来将要操作的窗口
- dev_set_line_width 线宽
- dev_set_draw 设置ROI区域的显示方式(填充/边缘)
- dev_set_color 颜色
- disp_message 图片控件上显示文字信息
实例:提取图像的纹理特征
dev_close_window ()
*读取输入的图片
read_image (Image, 'data/board')
*将输入的彩色图像转为黑白图像
rgb1_to_gray (Image, GrayImage)
get_image_size (GrayImage, Width, Height)
*创建一个与输入图像同样大小的窗口
dev_open_window (0, 0, Width/4, Height/4, 'black', WindowID)
*设定画笔宽度
dev_set_line_width (5)
*创建两个窗口用于显示参数计算的结果
dev_open_window (0, 512, 320, 320, 'black', WindowID1)
dev_open_window (512, 512, 320, 320, 'black', WindowID2)
*分别设置两个矩阵,选择不同的两部分区域
gen_rectangle1 (Rectangle1, 200,10, 380, 190)
gen_rectangle1 (Rectangle2, 580, 650, 730, 800)
*分别对两个矩形求取灰度共生矩阵Matrix1和Matrix2
gen_cooc_matrix (Rectangle1, GrayImage, Matrix1, 6, 0)
gen_cooc_matrix (Rectangle2, GrayImage, Matrix2, 6, 0)
*分别对Matrix1和Matrix2提取灰度特征参数
cooc_feature_matrix (Matrix1, Energy1, Correlation1, Homogeneity1, Contrast1)
cooc_feature_matrix (Matrix2, Energy2, Correlation2, Homogeneity2, Contrast2)
*采取另一种方式,直接对矩阵2的图像求灰度特征参数,结果与上面两步计算出的参数是一致的
cooc_feature_image (Rectangle2, GrayImage, 6, 0, Energy3, Correlation3, Homogeneity3, Contrast3)
*显示图像窗口和两个矩形的灰度共生矩阵
dev_set_window (WindowID)
dev_set_draw ('margin')
dev_display (GrayImage)
dev_display (Rectangle1)
dev_set_color('yellow')
dev_display (Rectangle2)
dev_set_window (WindowID1)
dev_display (Matrix1)
*以字符串的形式,分别在两个矩阵的对应窗口上显示灰度特征值的计算结果
String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: ']
dev_set_color('red')
disp_message (WindowID1, String$'-14s' + [Energy1,Correlation1,Homogeneity1,Contrast1]$'6.3f', 'window', 12, 12, 'white', 'false')
dev_set_window (WindowID2)
dev_display (Matrix2)
dev_set_color('yellow')
String := ['Energy: ','Correlation: ','Homogeneity: ','Contrast: ']
disp_message (WindowID2, String$'-14s' + [Energy2,Correlation2,Homogeneity2,Contrast2]$'6.3f', 'window', 12, 12, 'white', 'false')
6.边缘检测
1.像素级边缘提取
边缘提取一般流程
- 获取图像
- 选择ROI区域
- 提取边缘
- 边缘处理
- 细化较粗的边缘
- 合并非连续的边缘等
- 显示结果
- skeleton
Sobel算子
- sobel_amp 计算边缘梯度的幅度
- 参数3是卷积核的类型,有多种可供选择的值
- 参数4是卷积核尺寸,尺寸越大,检测到的边缘越粗,细节越少
- sobel_dir 计算边缘幅度以及方向
edge_image算子
edge_image算子能返回精确的边缘梯度和方向,但所花的时间长一些
- edge_image
- 参数4可以选择不同的边缘滤波算子
edge_color算子
提取彩色图像的边缘
derivate_gauss算子
将图像与高斯的导数进行卷积,并计算从中得出的各种特征
不仅可以提取边缘,还可以
- 平滑图像
- 提取角点等
laplace算子
拉普拉斯laplace算子是对图像求二阶段,边缘处产生零点,过零检测结合zero_crossing算子使用
孤立的点的响应比边缘更强烈,所以在检测前先去噪
laplace_of_gauss算子
将高斯低通滤波器与laplace算子相结合,简化成简单的高斯拉普拉斯算子,自带平滑效果
2.亚像素边缘提取
Halcon中用XLD (eXtended Line Descriptions) 表示亚像素的轮廓和多边形,类似于矢量图,与像素概念不同
edges_sub_pix算子
在其输入参数Filter中设置边缘提取算法名字,就可以完成边缘提取
常用的滤波算子有
- canny
- lanser2 平滑力度不同,不影响计算时间
- sobel_fast 速度快,但对噪声敏感,适用于噪声小但有速度要求的方面
滞后阈值的理解
滞后阈值有两个阈值,一高一低。高于高阈值的像素,认为是边缘;低于低阈值的像素认为一定不是边缘;位于两阈值之间的像素看它们的位置,若和边缘像素相连,则认为是边缘,否则不是
edges_color_sub_pix算子
彩色多通道图像的亚像素边缘提取
支持的滤波器算子较少,有Deriche/Shen/Canny/Sobel_fast以及一些以 “_junctions” 结尾的滤波器
lines_gauss算子
提取出的线段类型是亚像素精度的XLD轮廓
lines_color算子
彩色边缘提取,提取出的线段类型是亚像素精度的XLD轮廓
3.轮廓处理
1.轮廓的生成
- edges_sub_pix
- edges_color_sub_pix
- lines_gauss
- lines_color
轮廓属性查询
- query_contour_attrib_xld
- query_contour_global_attrib_xld
2.轮廓的处理
轮廓分割
- segment_contours_xld
- 分割出来的线段/圆弧可以通过select_obj来选择
- segment_polygons_xld + split_contours_xld
轮廓筛选
- select_shape_xld
- select_contours_xld
- select_xld_point 鼠标交互选择轮廓
轮廓连接
- union_collinear_contours_xld 共线
- union_straight_contours_xld 同方向的邻近轮廓
- union_adjacent_contours_xld 端点相邻
- shape_trans_xld
- union2_closed_contours_xld
轮廓拟合
- fit_line_contour_xld 拟合直线
- 配合 gen_contour_polygon_xld 查看结果
- fit_circle_contour_xld 拟合圆
- 使用 gen_circle_contour_xld 查看拟合结果
- fit_rectangle2_contour_xld 拟合矩形
- 使用 fit_rectangle2_contour_xld 查看结果
- fit_ellipse_contour_xld 椭圆
- gen_ellipse_contour_xld
7.模板匹配
1.模板匹配的种类
基于灰度值
计算目标图像与模板图像之间
- 像素灰度差值的绝对值总和(SAD方法)
- 平方差总和(SSD方法)
应用
- 不适应光照发生变化的情况
- 不能用于多通道图像的匹配
基于相关性
把每个模板区域内的像素按照列顺序组成行向量,在检测图像上寻找与模板最匹配的区域
通过计算两区域向量的夹角,衡量匹配的概率
优点
- 适应光照变化
- 对小范围遮挡缺失具有鲁棒性
- 适用于聚焦不清晰的图
- 适用于形状变形
不足
- 上述变化程度比较大则会导致匹配失败
基于形状
以物体边缘的梯度相关性作为匹配标准。主要是提取了ROI种的边缘特征,结合灰度信息创建模板,生成图像金字塔,逐层搜索
优点
- 对于多种干扰因素不敏感,
- 不适合旋转和缩放比例较大的情况
2.图像金字塔(略)
降采样前先进行平滑处理,避免降采样后的锯齿纹路
3.模板图像
从参考图像特定区域创建模板
选择一块ROI区域作为模板图像,通常就是一系列ROI创建算子
- gen_rectangle1/2
- gen_circle
- gen_region_polygon
- etc..
用 reduce_domain 剪裁下这部分图像、
从XLD轮廓创建模板
- 使用图像处理方法提取出目标的轮廓区域
- gen_contour_region_xld创建区域的XLD轮廓
- create_shape_model_xld根据输入的轮廓创建模板
- 检测时,使用find_shape_model检测符合条件的轮廓区域
- 显示结果,使用dev_display_shape_matching_results
4.模板匹配的流程
基于灰度值的模板匹配
1.创建模板
- create_temple
- create_temple_rot
带rot的算子增加了适应旋转的功能,在目标旋转后依然能搜索到
返回一个TemplateID
2.匹配
一系列匹配算子
- best_match/fast_match
- 后缀带mg系列:金字塔匹配
- 带rot系列,支持旋转
- etc.
3.释放模板资源
- clear_template
补充
- adapt_template 根据图像大小调整模板,如不调用,会被隐式调用
基于相关性的模板匹配
1.图像预处理以及创建ROI区域
2.创建模板
用裁剪后的图像创建归一化的互相关模型
- create_ncc_model
- numLevels是金字塔层级,设为auto时自动确定
- AngleStart/AngleExtent是检测图像的旋转角度范围
- AngleStep检测旋转角度的步长,设为auto时自动确定
- metric是识别模板的条件
- use_polarity是必须匹配前背景黑白极性相同的
- ignore_global_polarity忽略极性
- ModelID是句柄
3.模板匹配
- find_ncc_model
- MinScore指定返回匹配的分数最小值,适当提高可以增加匹配速度
4.释放模板资源
- clear_ncc_model
基于形状的模板匹配
1.图像预处理以及创建ROI区域,剪裁出模板区域
2.调整参数
- inpect_shape_model
创建模板之前,可以使用inpect_shape_model算子列出模板图像的各层金字塔图像以及提取出的边缘形状,根据图像可以调整NumLevels(金字塔层级)和Contrast(点的最小对比度)参数
3.创建模板
- create_shape_model
- 如果模型特别大,可以用Optimization对模型进行优化
- Metric参数有四个选项
- use_polarity 不同的极性不匹配在一起
- ignore_global_polarity 忽略极性
- ignore_local_polarity 适合光照变化多的情况下使用
- ignore_color_polarity 适合多通道图像
4.搜索目标
- find_shape_model
可以用dev_display_shape_matching_results绘制匹配结果
5.清除模板
- clear_shape_model

浙公网安备 33010602011771号