基于Halcon深度图的曲面圆柱凹坑缺陷处理方法

一、概述

可以选用海康机器人或深视智能的3D轮廓仪完成曲面圆柱表面缺陷的扫描,获取一张平铺的3D深度图进行处理。首先对采集的深度图通过高度平滑拟合出基准面差分提取下凹区域,再结合像素分辨率换算实际面积。

3D轮廓仪输出的数据包括点云(X/Y/Z)、深度图、亮度图三种数据,在做 "凹陷面积 + 深度" 定量检测(轮对颈这种金属圆柱面),优先用深度图;精度要求极高、要做圆柱展开 / 三维拟合时,再用原始点云;亮度图只适合辅助定位、区分油污 / 脏污,不能算面积和深度。

二、实现过程

  1. 基准面拟合

曲面圆柱即使经过机械加工,其表面也会存在微小的曲线起伏或安装倾斜。不能直接用一个固定常数做全局阈值分割。代码中采用 mean_image(核大小需大于最大缺陷尺寸的2倍)来提取背景基准线,确保只提取局部下凹

2.物理单位转换

3D轮廓仪输出的图像,其像素距离与实际物理尺寸存在比例关系:

X方向分辨率:通常与轮对旋转编码器的触发频率、轴颈直径相关。

Y方向分辨率:取决于3D激光相机的线激光X轴点间隔。

必须确保 PixelAreaSize(单像素面积)计算准确,否则会导致面积筛选误判。

3.深度与面积的双重过滤

算法中通过 threshold (ImageDiff, ..., 0.1, 99999) 先行过滤了深度不足 0.1mm (举例数据)的微小波动,随后通过面积元组 过滤 AreaReal >= 60.0(举例数值) 剔除了面积不达标的区域。

说明:这里计算面积时,需根据基准面的Z值,需先求出对应的XY像素坐标值之间的距离信息来求出面积。

三、逻辑代码

通过读取深度图图像的数据,实现的Halcon代码缺陷检测的代码如下所示

bash 复制代码
* 1. 读取或引入展开后的深度图像 (Z图)
read_image (ImageDepth, 'wheel_journal_depth_image.tif')

* 2. 预处理:去除无效点(噪点),填充缺失值
* 假设无效值为0,将其替换为周围均值或背景高度
threshold (ImageDepth, RegionValid, 0.1, 99999)
reduce_domain (ImageDepth, RegionValid, ImageReduced)

* 3. 拟合基准面(消除轴颈整体的微小倾斜或圆柱度偏差)
* 使用大核均值滤波或中值滤波模拟无缺陷的理想表面
mean_image (ImageReduced, ImageBackground, 151, 151)

* 4. 图像差分:寻找下凹区域
* 基准面减去原始深度图,得到正值代表下凹深度的图像
sub_image (ImageBackground, ImageReduced, ImageDiff, 1.0, 0)

* 5. 深度阈值分割:提取深度超过 0.1 毫米的区域
* 假设深度图的灰度值单位就是毫米(如果是数据精度需乘以算子系数)
ThresholdDepth := 0.1
threshold (ImageDiff, RegionDefectsRaw, ThresholdDepth, 99999)

* 6. 区域连通性分析与形态学去噪
connection (RegionDefectsRaw, ConnectedDefects)
* 使用闭运算消除内部空洞,开运算消除毛刺
closing_circle (ConnectedDefects, RegionClosed, 3.5)
connection (RegionClosed, ConnectedDefectsFinal)

* 7. 计算每个缺陷的实际物理面积并筛选
* ⚠️ 请根据相机实际标定参数修改以下两个像素分辨率(单位:毫米/像素)
PixelSizeX := 0.05  * X方向(圆周展开方向)每个像素代表的毫米数
PixelSizeY := 0.05  * Y方向(轴向)每个像素代表的毫米数
PixelAreaSize := PixelSizeX * PixelSizeY * 1.0

* 计算每个连通域的像素面积
area_center (ConnectedDefectsFinal, AreaPixels, Row, Column)

* 将像素面积转换为物理面积(平方毫米)
AreaReal := AreaPixels * PixelAreaSize

* 筛选出面积超过 60 平方毫米的缺陷
MinAreaMM2 := 60.0
tuple_find (AreaReal, expression(AreaReal >= MinAreaMM2), Indices)

if (size_of_tuple(Indices) > 0 and Indices != -1)
    select_obj (ConnectedDefectsFinal, SelectedDefects, Indices + 1)
    * SelectedDefects 即为最终输出的达标凹陷缺陷区域
else
    gen_empty_region (SelectedDefects)
endif
相关推荐
波动几何1 小时前
产品研发工作流重构
人工智能
南屹川1 小时前
【机器学习】机器学习工程化实战:从模型训练到生产部署
人工智能
机器之心1 小时前
DeepSeek陈德里与两个AI,合写了一篇论文
人工智能·openai
wrangler_csdn1 小时前
如何一键去除gemini生成图片右下角的水印?
人工智能·ai
Mr数据杨2 小时前
【CanMV K210】传感器实验 光敏传感器环境光照强度采集
人工智能·硬件开发·canmv k210
Geometry Fu2 小时前
《智能终端与边缘计算》第一章 概述
人工智能·边缘计算
有一个好名字2 小时前
CrewAI 入门指南01:从零开始构建多 Agent 协作系统
人工智能
吴佳浩2 小时前
用 Stitch 实现 AI 前端工程化:找回消失的UI美学(别再 Vibe 瞎Coding 了)
前端·人工智能·llm
生成论实验室2 小时前
Transformer架构上的语言模型自已评判“判断力缺失”
人工智能·深度学习·语言模型·自然语言处理·transformer