Halcon 边缘提取之计算给定前景区域的连接背景分量 background_seg.hdev

本文介绍了一种使用Halcon进行图像处理的方法,包括边缘检测、背景分割及区域填充等步骤。通过对图像应用Sobel算子、阈值分割等操作,实现了有效提取目标区域并填充背景中的小孔。

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

引言

边缘提取,计算给定前景区域的连接背景分量


一、结果

1.1 读取图像

在这里插入图片描述

1.2 处理后结果

在这里插入图片描述


二、Halcon代码

* Determine the connected components of the background of given regions
* 
read_image (Image, 'fabrik')
* Detect edges
//sobel_amp — 使用 Sobel 算子检测边缘(幅度)
sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)
//threshold — 使用全局阈值分割图像
threshold (EdgeAmplitude, Edges, 5, 255)
background_seg (Edges, BackgroundRegions)
* Fill up holes in regions based on shape feature 'area'
fill_up_shape (BackgroundRegions, RegionFillUp, 'area', 1, 40)
dev_clear_window ()
dev_set_colored (6)
dev_display (RegionFillUp)

三、主要算子分析

1.sobel_amp (Operator)

sobel_amp — 使用 Sobel 算子检测边缘(幅度)。

sobel_amp (Image, EdgeAmplitude, 'thin_sum_abs', 3)

在这里插入图片描述

函数解析

sobel_amp(Image : EdgeAmplitude : FilterType, Size : )
//参数
	Image (input_object)            //input image.
	EdgeAmplitude (output_object)   //边缘幅度(梯度幅度)图像。
	FilterType (input_control)      //Filter type.
		Default value: 'sum_abs'
		List of values: 'sum_abs', 'sum_abs_binomial', 'sum_sqrt', 
		'sum_sqrt_binomial', 'thin_max_abs', 'thin_max_abs_binomial', 
		'thin_sum_abs', 'thin_sum_abs_binomial', 'x', 'x_binomial', 
		'y', 'y_binomial'
		List of values (for compute devices): 'sum_abs', 'sum_sqrt', 
		'x', 'y', 'sum_abs_binomial', 'sum_sqrt_binomial', 
		'x_binomial', 'y_binomial'
	Size (input_control)         //Size of filter mask.
		Default value: 3
		List of values: 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 
		31, 33, 35, 37, 39

sobel_amp 计算图像的一阶导数并用作边缘检测器。 该过滤器基于以下过滤器掩码:

在这里插入图片描述
根据所选的过滤器类型,这些掩码的使用方式不同。 (在下文中,a 和 b 表示针对一个特定像素将图像与 A 和 B 进行卷积的结果。)

在这里插入图片描述
这里,对于垂直最大值(掩码 A)和水平最大值(掩码 B),thin(x) 分别等于 x,否则为 0。因此,对于“thin_sum_abs”和“thin_max_abs”,梯度图像被细化。对于过滤器类型“x”和“y”,如果输入图像的类型为字节,则输出图像的类型为 int1,否则为 int2 类型。对于大小为 3x3 的 Sobel 算子,直接应用相应的滤波器 A 和 B,而对于较大的滤波器大小,输入图像首先使用大小为 2 的高斯滤波器(参见 gauss_image)或二项式滤波器(参见binomial_filter)进行平滑.上述FilterType的值选择了高斯滤波器。此处,必须使用 Size = 5、7、9、11 或 13。通过将“_binomial”附加到上述 FilterType 值来选择二项式过滤器。这里,Size 可以在 5 到 39 之间选择。此外,可以通过在 Size 中传递两个值来选择不同的列和行方向平滑量。这里,Size的第一个值对应的是掩码宽度(列方向平滑),第二个值对应二项式滤波器的掩码高度(行方向平滑)。二项式过滤器只能用于 byte、uint2 和 real 类型的图像。由于平滑减少了边缘幅度,在这种情况下,边缘幅度乘以因子 2 以防止信息丢失。所以,

在这里插入图片描述
对于 sobel_amp,使用 SIMD 技术实现了特殊优化 FilterType = ‘sum_abs’。 这些特殊优化的实际应用由系统参数“mmx_enable”控制(参见 set_system)。 如果’mmx_enable’ 设置为’true’(并且SIMD 指令集可用),则使用SIMD 技术执行内部计算。 请注意,SIMD 技术在大而紧凑的输入区域上表现最佳。 根据输入区域和硬件的能力,使用 SIMD 技术执行 sobel_amp 甚至可能比不使用 SIMD 技术花费更多的时间。

sobel_amp 可以在 OpenCL 设备上针对过滤器类型“sum_abs”、“sum_sqrt”、“x”和“y”(以及它们的二项式变体)执行。 请注意,当对 Size > 3 使用高斯过滤时,结果可能会因 CPU 实现而异。

2.threshold (Operator)

threshold — Segment an image using global threshold.

...
threshold (EdgeAmplitude, Edges, 5, 255)
...

在这里插入图片描述

函数解析

threshold(Image : Region : MinGray, MaxGray : )
	//参数
	Image (input_object)           //input image
	Region (output_object)         //Segmented region.
	MinGray (input_control)        //Lower threshold for the gray values.
		Default value: 128.0
		Suggested values: 0.0, 10.0, 30.0, 64.0, 128.0, 200.0, 220.0, 255.0
	MaxGray (input_control)       //Upper threshold for the gray values.
		Default value: 255.0
		Suggested values: 0.0, 10.0, 30.0, 64.0, 128.0, 200.0, 220.0, 255.0
		Restriction: MaxGray >= MinGray
		

3.background_seg (Operator)

background_seg — 确定给定区域背景的连通分量。

...
background_seg (Edges, BackgroundRegions)
...

在这里插入图片描述

函数解析

background_seg(Foreground : BackgroundRegions : : )
	//参数
	Foreground (input_object)            //Input regions.
	BackgroundRegions (output_object)    //Connected components of the background.
	

background_seg 确定前景中给定的前景区域的背景的连通分量。 该算子通常在边缘算子之后使用以确定被提取的边缘包围的区域。 使用 4-邻域确定连接的组件。

4.fill_up_shape (Operator)

fill_up_shape — 填充具有给定形状特征的区域中的孔。

// Fill up holes in regions based on shape feature 'area'
fill_up_shape (BackgroundRegions, RegionFillUp, 'area', 1, 40)
...

在这里插入图片描述

函数解析

fill_up_shape(Region : RegionFillUp : Feature, Min, Max : )
	Region (input_object)          //Input region(s).
	RegionFillUp (output_object)   //Output region(s) with filled holes.
	Feature (input_control)        //Shape feature used.
		Default value: 'area'
		List of values: 'anisometry', 'area', 'compactness', 'convexity', 
		'inner_circle', 'outer_circle', 'phi', 'ra', 'rb'
	Min (input_control)    //Minimum value for Feature.
		Default value: 1.0
		Suggested values: 0.0, 1.0, 10.0, 50.0, 100.0, 500.0, 1000.0, 10000.0
		Typical range of values: 0.0 ≤ Min
	Max (input_control)    //Maximum value for Feature.
		Default value: 100.0
		Suggested values: 10.0, 50.0, 100.0, 500.0, 1000.0, 10000.0, 100000.0
		Typical range of values: 0.0 ≤ Max
		

fill_up_shape 填充具有给定形状特征的输入区域区域中的那些空洞。 参数 Feature 确定要使用的形状特征,而 Min 和 Max 确定形状特征必须位于的范围内,以便填充孔。

四、与MFC相结合

在这里插入图片描述
详细过程参见MFC与HALCON混合编程三之滑动条控件_选择阈值—backgroundSeg

<think>好的,用户的问题是想将Halcon的detect_indent_fft.hdev示例程序转换为OpenCV C++实现,需要FFT检测的转换教程和示例代码。首先,我得回忆一下Halcon的这个示例是做什么的。根据提供的引用,这个示例使用快速傅里叶变换(FFT)来检测图像中的周期性缺陷,比如表面压痕。Halcon中的步骤可能包括图像预处理、FFT变换、频域滤波、逆变换以及缺陷分析。 接下来,我需要考虑OpenCV中对应的功能。OpenCV的FFT函数在C++中主要通过dft()函数实现,但使用时需要注意通道和复数矩阵的处理。用户提到的Halcon示例可能包含以下步骤:读取图像、转换为频域、滤波处理、逆变换回空间域,然后进行后处理分析。 首先,图像预处理部分可能需要高斯模糊来减少噪声,这在OpenCV中可以用GaussianBlur()。然后进行FFT变换,需要将图像扩展到适合的尺寸(通常是2的幂次,但OpenCV会自动处理,不过最好手动优化),转换到浮点类型,并进行频域变换。这里需要注意,Halcon的rft_generic可能生成实部虚部分开的图像,而OpenCV的dft()会生成复数矩阵,可能需要处理为双通道(实部和虚部)。 频域处理部分,Halcon示例可能创建高斯滤波器来抑制低频成分,突出缺陷。在OpenCV中需要构造类似的滤波器,可能是一个高斯带通或高通滤波器。然后将频域图像与滤波器相乘,这里涉及到复数乘法,需要注意频域的中心化(即移位后的频域,低频在中心)。 逆变换后,需要将结果转换回空间域,取绝对值并归一化,然后进行阈值处理或其他分析。例如,计算梯度或寻找最大最小值来确定缺陷位置。 还需要考虑Halcon中的优化选项,比如optimize_rft_speed,可能涉及图像补零或金字塔处理来加速FFT。在OpenCV中,可能需要手动调整图像尺寸到最优(如接近2的幂次)以提高计算效率。 此外,用户提供的引用中提到优化结果受硬件影响,所以在C++实现时要注意多线程或硬件加速选项,但OpenCV默认可能已经优化了这些部分。 现在,将这些步骤转化为代码。首先读取图像,转换为灰度,高斯模糊。然后扩展图像到最佳尺寸(可以用getOptimalDFTSize()),创建复数矩阵,进行dft。接着生成高斯带通滤波器,中心在频域中心,进行乘法。然后逆变换,处理结果,寻找缺陷区域。 可能的难点在于滤波器的构造,需要根据具体缺陷调整参数,比如高斯的标准差。此外,结果的后处理可能需要形态学操作或阈值处理来突出缺陷。 最后,测试代码时需要调整参数,比如高斯滤波器的半径,频域处理的阈值,以及后处理步骤,确保检测效果接近Halcon示例。</think>以下是将Halcon的`detect_indent_fft.hdev`转换为OpenCV C++实现的核心步骤与示例代码: --- ### 关键步骤解析 1. **图像预处理** - 高斯模糊消除高频噪声 - 转换为单通道灰度图 $$ \text{预处理公式:} I_{blur} = G_{\sigma} * I_{original} $$ (其中$G_{\sigma}$表示高斯核)[^2] 2. **频域变换** - 扩展图像至最优FFT尺寸(OpenCV自动优化) - 执行FFT并中心化低频分量 $$ \text{FFT移位公式:} F_{shift}(u,v) = (-1)^{u+v} \cdot F(u,v) $$ 3. **频域滤波** - 构建高斯带通滤波器抑制低频/高频干扰 $$ H(u,v) = e^{-\frac{D^2(u,v)}{2\sigma^2}} \quad (D为到中心的距离) $$ 4. **缺陷检测** - 逆FFT重建空间域图像 - 通过梯度计算增强缺陷特征 $$ \text{梯度幅值:} |\nabla I| = \sqrt{(\frac{\partial I}{\partial x})^2 + (\frac{\partial I}{\partial y})^2} $$ --- ### OpenCV C++ 实现代码 ```cpp #include <opencv2/opencv.hpp> cv::Mat detect_indent_fft(const cv::Mat& input) { // 1. 图像预处理 cv::Mat gray, blurred; cv::cvtColor(input, gray, cv::COLOR_BGR2GRAY); cv::GaussianBlur(gray, blurred, cv::Size(5,5), 0.8); // 2. 优化FFT尺寸 int opt_rows = cv::getOptimalDFTSize(blurred.rows); int opt_cols = cv::getOptimalDFTSize(blurred.cols); cv::Mat padded; cv::copyMakeBorder(blurred, padded, 0, opt_rows - blurred.rows, 0, opt_cols - blurred.cols, cv::BORDER_CONSTANT, cv::Scalar::all(0)); // 3. 执行FFT cv::Mat planes[] = {cv::Mat_<float>(padded), cv::Mat::zeros(padded.size(), CV_32F)}; cv::Mat complexImg; cv::merge(planes, 2, complexImg); cv::dft(complexImg, complexImg, cv::DFT_COMPLEX_OUTPUT); // 4. 构建高斯带通滤波器(示例参数) cv::Mat filter = cv::Mat::zeros(padded.size(), CV_32FC2); float D0 = 30.0f, sigma = 15.0f; cv::Point center(padded.cols/2, padded.rows/2); for(int i=0; i<padded.rows; ++i) { for(int j=0; j<padded.cols; ++j) { float D = cv::norm(cv::Point(j,i) - center); float val = exp(-(D*D - D0*D0)*(D*D - D0*D0)/(2*sigma*sigma*sigma*sigma)); filter.at<cv::Vec2f>(i,j) = cv::Vec2f(val, val); } } // 5. 频域滤波 cv::mulSpectrums(complexImg, filter, complexImg, 0); // 6. 逆FFT cv::idft(complexImg, complexImg, cv::DFT_SCALE | cv::DFT_REAL_OUTPUT); cv::Mat result; cv::split(complexImg, planes); cv::magnitude(planes[0], planes[1], result); cv::normalize(result, result, 0, 1, cv::NORM_MINMAX); // 7. 缺陷增强 cv::Mat grad_x, grad_y; cv::Sobel(result, grad_x, CV_32F, 1, 0); cv::Sobel(result, grad_y, CV_32F, 0, 1); cv::magnitude(grad_x, grad_y, result); return result; } ``` --- ### 参数调优建议 1. **高斯模糊参数**:$\sigma$值影响噪声抑制效果,建议范围0.5-1.5 2. **带通滤波器参数**: - $D_0$控制中心抑制区域半径(典型值:图像短边尺寸的5%-20%) - $\sigma$决定过渡带宽度(建议$\sigma = D_0/3$)[^2] 3. **后处理优化**:可增加形态学操作或动态阈值处理增强缺陷特征 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值