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_matrixcooc_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
posted @ 2023-02-06 14:32  元素-  阅读(1179)  评论(0)    收藏  举报