Halcon一维函数的使用之auto_threshold

本文介绍Halcon12.0中一维函数的应用实例,重点讲解了auto_threshold、gray_histo等关键函数的功能及使用方法。通过实际代码示例,帮助读者理解如何利用这些函数进行图像分割和灰度值分布计算。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

引言

学习Halcon例程,了解函数的功能特性


1、一维函数的使用——auto_threshold.hdev

以下是halcon12.0中的例程代码

dev_close_window ()                     //关闭窗口
read_image (Aegypt1, 'egypt1')			//读取图像
get_image_size (Aegypt1, Width, Height) //获取图像的宽高
dev_open_window (0, 0, Width, Height, 'black', WindowID)   //打开一个图像大小的窗口
set_display_font (WindowID, 14, 'mono', 'true', 'false')   //窗体
dev_set_colored (6)            //设置多种输出颜色
dev_clear_window ()            //清除活动图形窗口的内容。
Sigma := 4
auto_threshold (Aegypt1, Regions, Sigma)   //使用从直方图确定的阈值分割图像
gray_histo (Aegypt1, Aegypt1, AbsoluteHisto, RelativeHisto) //计算灰度值分布
disp_continue_message (WindowID, 'black', 'true')
stop ()             //停止程序执行
dev_clear_window () //清除活动图形窗口的内容
create_funct_1d_array (AbsoluteHisto, Function)  //创建一个一维函数
smooth_funct_1d_gauss (Function, Sigma, SmoothedFunction) //使用高斯平滑一维函数
dev_set_color ('red')           //设置一种或多种输出颜色
//将输入函数 Function 拆分为 x 和 y 值的元组
funct_1d_to_pairs (SmoothedFunction, XValues, YValues) 
gen_region_histo (Histo1, YValues, 255, 255, 1)  //将直方图转换为区域
dev_display (Aegypt1)    //在当前图形窗口中显示图像对象
dev_set_color ('white')  //设置多种输出颜色
gen_region_histo (Histo2, RelativeHisto, 255, 255, 1)  //将直方图转换为区域

2、分析关键函数功能作用

2.1 auto_threshold (Operator)——根据直方图确定的阈值分割图像

函数原型:

auto_threshold(Image : Regions : Sigma : )
//其中,
Image (input_object)
Regions (output_object)  --在自动确定的间隔内具有灰度值的区域
Sigma (input_control)    --Sigma 用于直方图的高斯平滑
	//Default value: 2.0
	//Suggested values: 0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0
	//Typical range of values: 0.0 ≤ Sigma ≤ 100.0 (lin)
	//Minimum increment: 0.01
	//Recommended increment: 0.3
	//Restriction: Sigma >= 0.0

解析:
auto_threshold 使用多个阈值分割单通道图像。
首先,确定灰度值的绝对直方图。
然后,从直方图中提取相关的最小值,这些最小值被连续用作阈值操作的参数。用于字节图像的阈值为 0、255,以及从直方图中提取的所有最小值(在直方图使用标准差为 Sigma 的高斯滤波器平滑后)。
对于每个灰度值区间,生成一个区域。因此,区域的数量是最小值的数量 + 1。对于 uint2 图像,类似地使用上述过程。然而,这里的最高阈值是 65535。此外,对于 uint2 图像,Sigma 的值(实际上)是指具有 256 个值的直方图,尽管内部使用了更高分辨率的直方图。这样做是为了方便在图像类型之间切换,而无需更改参数 Sigma。
对于浮点图像,阈值是图像中的最小和最大灰度值以及从直方图中提取的所有最小值。
这里,参数Sigma的缩放是指图像的原始灰度值。 Sigma 的值越大,提取的区域就越少。如果要提取的区域表现出相似的灰度值(同质区域),则此运算符很有用。

example

read_image (Image, 'fabrik')
median_image (Image, Median, 'circle', 3, 'mirrored')
auto_threshold (Median, Seg, 2.0)
connection (Seg, Connected)

在这里插入图片描述

2.2 gray_histo (Operator)——计算灰度值分布

函数原型

gray_histo(Regions, Image : : : AbsoluteHisto, RelativeHisto)
//其中
Regions (input_object)   --要计算直方图的区域  
Image (input_object)     --将要计算的灰度值分布的图像
inglechannelimage → object (byte* / cyclic* / direction* / int1* / int2 / uint2 / int4 / real) *allowed for compute devices
AbsoluteHisto (output_control)  --灰度值的绝对频率
RelativeHisto (output_control)  --频率,归一化为该区域的面积。

在这里插入图片描述

解析:
算子 gray_histo 为区域内的图像 (Image) 计算灰度值的绝对 (AbsoluteHisto) 和相对 (RelativeHisto) 直方图。

两个直方图都是 256 个值的元组,其中 — 从 0 开始—包含图像各个灰度值的频率。

AbsoluteHisto 用整数表示灰度值的绝对频率,RelativeHisto 表示相对值,即绝对频率除以图像面积的浮点数。

‘real’-, ‘int2’-, ‘uint2’-, 和 ‘int4’-images 转换成’byte’-images(首先确定图像中最大和最小的灰度值,然后原始灰度值是 线性映射到区域 0…255),然后如上所述进行处理。 直方图也可以通过运算符 set_paint(::WindowHandle,‘histogram’ : ) 和 disp_image 直接作为图形返回。

2.3 create_funct_1d_array (Operator)

函数原型

create_funct_1d_array( : : YValues : Function)
//其中
YValues (input_control)    --X value for function points
Function (output_control)  --Created function

create_funct_1d_array 从一组 y 值 YValues 创建一个一维函数。然后可以使用一维函数的运算符处理和分析生成的函数。 YValues 解释如下:YValues 的第一个值是零处的函数值,第二个值是一处的函数值,依此类推。因此,这些值定义了等距 x 值(距离为 1)处的函数,从 0 开始.

或者,运算符 create_funct_1d_pairs 可用于创建函数。 create_funct_1d_pairs 还允许通过明确指定它们来定义具有非等距 x 值的函数。因此,要获得与 create_funct_1d_array 相同的定义,可以将 x 值的元组传递给 create_funct_1d_pairs,该元组的长度与 YValues 相同,并且包含从 0 开始并在每个位置增加 1 的值。但是请注意,create_funct_1d_pairs 导致函数的不同内部表示需要更多存储(因为存储了所有 (x,y) 对),有时无法像 create_funct_1d_array 创建的函数那样有效地处理。

2.4 smooth_funct_1d_gauss (Operator)——使用高斯函数平滑等距一维函数。

函数原型

smooth_funct_1d_gauss( : : Function, Sigma : SmoothedFunction)
//其中
Function (input_control)   --Function to be smoothed
Sigma (input_control)      --用于平滑的高斯函数的 Sigma
	Default value: 2.0
	Suggested values: 0.5, 1.0, 2.0, 3.0, 4.0, 5.0
	Typical range of values: 0.1 ≤ Sigma ≤ 50.0 (lin)
	Minimum increment: 0.01
	Recommended increment: 0.2

解析
算子 smooth_funct_1d_gauss 用高斯函数平滑一维函数。 该函数必须是等距的,即使用 create_funct_1d_array、sample_funct_1d 或类似方法创建。 在函数边界,函数值被镜像。

注意平滑参数Sigma不能大于(Length-2)/7.8,Length是Function的控制点数。 Length 的值可以,例如,用 num_points_funct_1d 确定。

2.5 funct_1d_to_pairs (Operator) ——访问函数的 x/y 值

函数原型

funct_1d_to_pairs( : : Function : XValues, YValues)
//其中
Function (input_control)    --Input function
XValues (output_control)    --X values of the function
YValues (output_control)    --Y values of the function

功能:
funct_1d_to_pairs 将输入函数 Function 拆分为 x 和 y 值的元组。

2.6 gen_region_histo (Operator)——将直方图转换为区域

在这里插入图片描述
函数原型

gen_region_histo( : Region : Histogram, Row, Column, Scale : )
//其中
Region (output_object)      --Region containing the histogram
Histogram (input_control)   --Input histogram
Row (input_control)  
	/*直方图中心的行坐标。
	  默认值:255
      建议值:100、200、255、300、400
      值的典型范围:0 ≤ Row ≤ 511
    */
Column (input_control) 
/*
Column coordinate of the center of the histogram.
Default value: 255
Suggested values: 100, 200, 255, 300, 400
Typical range of values: 0 ≤ Column ≤ 511
*/
    
Scale (input_control)  
/*
直方图的比例因子。
默认值:1
值列表:1、2、3、4、5、6、7
典型值范围:1 ≤ Scale ≤ 10 (lin)
最小增量:1
推荐增量:1
*/
  

功能:
gen_region_histo 将使用 gray_histo、gray_histo_range 或 tuple_histo_range 创建的直方图转换为区域。 三个控制参数的作用与disp_image和set_paint中相同。

<think>嗯,用户想了解Halcon一维函数分析。首先,我需要回忆Halcon的相关文档和功能模块。Halcon主要用于机器视觉,一维函数分析可能涉及图像处理中的曲线或信号处理。 一维函数分析在Halcon中通常处理什么?应该是处理图像中的一维数据,比如沿着某条线提取的灰度值,或者投影后的数据。用户可能想用这些数据进行边缘检测、峰值查找或波形分析。 接下来,要明确基本概念,比如一维函数指的是数组形式的数据,可能来自图像的剖面线。Halcon提供了哪些算子呢?可能有derivate_funct计算导数,用于找边缘;smooth_funct平滑数据;或者zero_crossing找过零点。 然后是典型应用场景,比如测量应用中的边缘检测,OCR中的字符分割,或者缺陷检测中的异常点识别。需要举例说明,比如用derivate_funct找边缘位置。 操作步骤可能需要先获取一维数据,比如用get_region_contour或gen_profile,然后预处理,平滑去噪,再进行导数或极值分析,最后提取特征点。 注意事项方面,数据预处理很重要,参数调整影响结果,可能要根据实际情况选择不同的导数算子或平滑方法。还需要考虑计算效率和实时性。 最后,给出一个代码示例会有帮助。比如读取图像,提取剖面线,平滑,求导,找峰值。但用户可能不熟悉具体算子,需要确保示例准确,比如使用gen_profile_parallel,smooth_funct,derivate_funct,然后tuple_find找极大值。 检查是否有遗漏点,比如Halcon的数据结构,一维函数作为数组处理,可能用tuple操作。同时,是否需要强调与二维分析的区别,一维更高效,适合线性数据。 可能用户的实际问题是什么?比如他们可能在处理线扫描相机的数据,或者需要优化现有的检测算法。需要确保回答覆盖关键算子和步骤,帮助用户入门。</think>Halcon中的一维函数分析是机器视觉中处理灰度值曲线、信号波形等一维数据的重要工具。以下从原理到实践的详细解析: #### 一、基本概念 一维函数Halcon中表现为数组形式的数据集合,例如: - 图像沿直线或曲线的灰度剖面($f(x)$) - 投影统计结果(如行/列方向积分) - 时序信号波形 #### 二、核心算子 1. **导数计算** `derivate_funct(Function, DerivativeType, Derivative)` 通过选择`DerivativeType`实现不同微分运算: - 'first':一阶导数 $\frac{df}{dx}$ - 'second':二阶导数 $\frac{d^2f}{dx^2}$ - 'gauss':高斯导数(抗噪优化) 2. **平滑处理** `smooth_funct(Function, Mode, Factor, Smoothed)` 常用模式: ```python 'gauss' # 高斯滤波 'median' # 中值滤波 'mean' # 均值滤波 ``` 3. **极值检测** `local_min_max_funct(Function, Mode, Percent, MinDistance, MinMaxPositions)` #### 三、典型应用场景 1. **边缘检测** $$ \text{边缘位置} = \arg\max\left(\left|\frac{df}{dx}\right|\right) $$ 通过一阶导数极值定位边缘 2. **缺陷检测** 二阶导数过零点检测表面异常: $$ \frac{d^2f}{dx^2} = 0 \Rightarrow \text{曲率变化点} $$ 3. **字符分割** 投影分析示例: ```python project_region(Region, Image, Mode, Projection) ``` #### 四、完整操作流程 ```python * 读取图像并提取ROI read_image(Image, 'particle') threshold(Image, Region, 128, 255) * 生成一维剖面 gen_profile_parallel(Image, Profile, 20, 50, 200, 50) * 高斯平滑(σ=3) smooth_funct(Profile, 'gauss', 3, Smoothed) * 计算一阶导数 derivate_funct(Smoothed, 'first', Derivative) * 寻找正负跳变边缘 tuple_find(Derivative, '>', 10, PositiveEdges) tuple_find(Derivative, '<', -10, NegativeEdges) ``` #### 五、参数优化建议 1. **平滑系数选择** 经验公式: $$ \sigma = \frac{\text{特征宽度}}{3} $$ 避免过度平滑导致特征丢失 2. **导数阈值设定** 动态计算基准: ```python mean_derivative := mean(Derivative) std_derivative := dev(Derivative) threshold := mean_derivative + 3*std_derivative ``` #### 六、进阶技巧 1. **多尺度分析** 组合不同σ值的高斯导数实现尺度空间分析 2. **亚像素插值** 使用三次样条插值提高极值定位精度: $$ x_{sub} = x_i - \frac{f'(x_i)}{f''(x_i)} $$ 3. **动态阈值适应** 基于局部对比度调整检测灵敏度: ```python local_contrast := max(Smoothed) - min(Smoothed) threshold := 0.2 * local_contrast ``` #### 七、性能优化 1. 优先使用`gen_profile_parallel`并行处理 2. 对长信号采用分块处理 3. 使用`optimize_mode`切换执行模式: ```python set_system('optimize_mode', 'speed') ``` 实际应用时需结合具体场景调整参数,建议通过Halcon的变量检查工具实时观察数据变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值