找回密码
 立即注册
首页 业界区 业界 halcon 入门教程(六) 缺陷检测

halcon 入门教程(六) 缺陷检测

骛扼铮 2025-6-3 14:53:09
原文作者:aircraft
原文链接:https://www.cnblogs.com/DOMLX/p/18785484
 
 
 有兴趣可以多看其他的halcon教程
 halcon 学习教程目录
 
 
 
 
          本篇主要讲一些常见的缺陷检测方法,目前只会讲一些,后面有空的话会不断的补充完整。因为缺陷的种类实在太多太多了,各种各样的缺陷可能都要用各种不同的检测方法去检测,所以想要精通缺陷检测特别难,基本大家都是熟悉自己经常遇到的缺陷领域。
 
第一种:就是最常见的Blob分析加上特征提取(本篇也会多给一些这个示例。因为确实是最基础也是最常用的,用的好你可能百分之八九十的缺陷都可以检测,主要还是看对这块的理解)
 
第二种:图像匹配定位后再加Blob分析,可以结合本篇的Blob分析和我下一篇的:halcon 入门教程(六) 图像匹配(基于形状的模板匹配)与缺陷检测区域定位
 
第三种:建立模板区域的差异模型,原理就是后面所有的产品都与一个标准品做差异模型,可以差异的程度对其判断NG,OK。可以看我这篇博客理解:halcon 入门教程 (七) halcon中是怎么实现半导体/Led中的GoldenDie的检测方法的 基于局部可变形模板匹配 variation_model模型或者用差异模型去提取缺陷的位置,然后再用深度学习分类去分类,再或者提取了缺陷的位置裁剪了给深度学习的目标检测去检测,都行,都是可行的思路
 
第四种:光度立体法(基本属于2.5d的视觉范围了,适用于一些物体表面有凹凸情况下的检测,通过多个角度方向的打光图片,来获取伪3d的信息进行缺陷检测)
 
第五种:图像匹配定位后再加测量(比如一些钢管,或者元器件表面的某个东西的长度,宽度,厚度,半径之类的达不达标),可以结合halcon 入门教程(六) 图像匹配(基于形状的模板匹配)与缺陷检测区域定位 和 halcon 入门教程(三) 测量量测相关(点到线距离,线到线距离,轮廓线距离,一维测量,圆形测量,矩形测量等)这两篇来看,组合起来基本就是这种检测方法了。
 
第六种:机器学习和深度学习的缺陷检测(基本都是通过标记好的和坏的训练集,给神经网络程序训练学习,学习成功后,后面只要传入该产品图,或者某个区域图,便可以直接给出判断好坏,甚至处理一下可以把具体缺陷都标注显示出来)
有兴趣可以看看我这篇博客:halcon 深度学习教程(一)分类检测 (工业里如何使用halcon深度学习去检测分类产品)和
halcon 深度学习教程(三) 目标检测之水果分类 (halcon深度学习缺陷检测方法) (工业里如何使用halcon深度学习去进行缺陷检测或者分类产品) 

 
 
第七种:空域和频域分析(适用于一些像皮革,木材,纹理石板之类的对比度低的产品上去进行检测)
 
第八种:三维重建后再加特征提取(属于3d视觉的领域了,会多一些诸如高度或者说深度信息)
 
 
 
然后这边说一下目前主流的工业的缺陷检测基本主流就是三种:
  第一种:就是绘制需要检测的区域,用Blob分析加上特征提取分别去卡控每个区域的瑕疵来判断NG-OK。
  第二种:对需要检测的物体或者区域建立差异模型,进行差异分析判断NG-OK.
  第三种:使用深度学习的分类或者目标检测,对晶圆进行分类,对瑕疵进行目标检测。然后结果进行NG-OK的判定。
实际使用中最好你的算法里三种都有,然后结合一种或者两种或者三种分别的结果一起去卡控判断,这样基本就可以符合不管是半导体,面板,LED等行业的缺陷检测了。
 
 
 
   下面一些算子的原型我就不介绍了,有看过前面教程的应该都认识这些常用的算子了。而且每个示例代码我都打了非常详细的注释,基本看着注释应该是可以理解的吧。
 
一.Blob分析加上特征提取
 
示例1:榛子威化饼的质量检测   
 
1.png

 
OK图:
2.bmp

 
NG图:
3.bmp

 
示例代码:
  1. * ​*************************************************************
  2. * 本程序演示针对榛子威化饼的质量检测
  3. * 检测方法:基于形态学处理提取目标区域,通过孔洞面积和矩形度进行缺陷判断
  4. * 工业应用:食品包装完整性检测(破损、变形检测)
  5. * 检测标准:孔洞面积>300 或 矩形度<0.92 判定为不合格
  6. * ​*************************************************************
  7. * 初始化图像和显示窗口
  8. read_image (Image, 'food/hazelnut_wafer_01')
  9. * 关闭可能存在的旧窗口
  10. dev_close_window ()
  11. * 创建自适应图像尺寸的显示窗口
  12. dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
  13. * 禁止窗口自动更新(提升执行效率)
  14. dev_update_window ('off')
  15. * 设置可视化参数
  16. * 线宽3像素用于突出显示轮廓
  17. dev_set_line_width (3)
  18. * 轮廓显示模式(节省显示资源)
  19. dev_set_draw ('margin')
  20. * 设置等宽字体便于字符对齐
  21. set_display_font (WindowHandle, 20, 'mono', 'true', 'false')
  22. * 处理24张连续拍摄的威化饼图像
  23. for Index := 1 to 2 by 1
  24.     * 读取序列图像(文件名格式:1~2.bmp)
  25.    
  26.     read_image (Image, Index+'.bmp')
  27.    
  28.     * 图像预处理
  29.     * 使用直方图平滑法进行二值化(适合低对比度场景)
  30.     binary_threshold (Image, Foreground, 'smooth_histo', 'light', UsedThreshold)
  31.     * 8.5像素半径开运算去除毛刺和小孔洞
  32.     opening_circle (Foreground, FinalRegion, 8.5)
  33.    
  34.     * 特征提取
  35.     * 计算区域内部孔洞总面积(关键缺陷指标)
  36.     area_holes (FinalRegion, AreaHoles)
  37.     * 计算区域矩形度(1为完美矩形,值越小变形越严重)
  38.     rectangularity (FinalRegion, Rectangularity)
  39.    
  40.     * 显示原始图像
  41.     dev_display (Image)
  42.    
  43.     * 质量判定逻辑
  44.     * 孔洞超标或形状变形时显示红色报警
  45.     if (AreaHoles > 300 or Rectangularity < 0.92)
  46.         dev_set_color ('red')
  47.         Text := 'Not OK'
  48.     * 合格产品显示绿色轮廓
  49.     else
  50.         dev_set_color ('forest green')
  51.         Text := 'OK'
  52.     endif
  53.    
  54.     * 显示检测结果
  55.     dev_display (FinalRegion)
  56.     * 在窗口左上角显示OK/NG状态
  57.     disp_message (WindowHandle, Text, 'window', 12, 12, '', 'false')
  58.    
  59.     * 非最后一张图像时暂停观察
  60.     if (Index < 2)
  61.         * 显示继续检测提示
  62.         disp_continue_message (WindowHandle, 'black', 'true')
  63.         stop ()  
  64.         * 模拟产线节拍控制
  65.     endif
  66. endfor
复制代码
 
示例2:鳍片检测程序(fin.hdev)  利用形态学分析与差异模型检测
 
4.png

 
两张边缘有凸出的图片:
5.bmp

 
6.bmp

 
 通过提取白色背景区域,然后进行闭运算将区域边缘小凸出闭合,然后与原始区域做个差异,得到缺陷位置,在进行开运算,消除多提出来的边的区域。
7.png

 
结果图:
 
8.png

 
实例代码:
  1. * ​*************************************************************
  2. * 鳍片检测程序(fin.hdev)
  3. * 功能:通过形态学处理检测金属鳍片缺陷
  4. * 检测逻辑:
  5. *   1. 二值化分离前景
  6. *   2. 闭运算填充结构间隙
  7. *   3. 差异检测潜在缺陷区域
  8. *   4. 开运算去除噪声
  9. * 工业应用:散热器制造质检
  10. * ​*************************************************************
  11. * 关闭窗口自动刷新(提升执行效率)
  12. dev_update_window ('off')
  13. * 读取鳍片图像序列(fin2, fin3)
  14. read_image (Fins, 'fin' + [2:3])
  15. * 初始化显示窗口
  16. get_image_size (Fins, Width, Height)
  17. dev_close_window ()
  18. * 创建与图像等大的黑色背景窗口
  19. dev_open_window (0, 0, Width[0], Height[0], 'black', WindowID)
  20. * 设置等宽字体便于信息对齐
  21. set_display_font (WindowID, 14, 'mono', 'true', 'false')
  22. * 遍历处理3个检测对象(实际图像为2张,索引从1开始)
  23. for I := 1 to 2 by 1
  24.     * 选择当前处理对象
  25.     select_obj (Fins, Fin, I)
  26.    
  27.     * 显示原始图像
  28.     dev_display (Fin)
  29.    
  30.     * 步骤1:二值化分割(最大化前景背景可分性)
  31.     binary_threshold (Fin, Background, 'max_separability', 'light', UsedThreshold)
  32.     * 蓝色显示初始分割结果
  33.     dev_set_color ('blue')
  34.     dev_set_draw ('margin')
  35.     dev_set_line_width (4)
  36.     dev_display (Background)
  37.     disp_continue_message (WindowID, 'black', 'true')
  38.     stop ()  
  39.     * 质检员确认阶段结果
  40.    
  41.     * 步骤2:大半径闭运算填充结构间隙
  42.     closing_circle (Background, ClosedBackground, 250)
  43.     * 绿色显示填充后区域
  44.     dev_set_color ('green')
  45.     dev_display (ClosedBackground)
  46.     disp_continue_message (WindowID, 'black', 'true')
  47.     stop ()  
  48.     * 确认形态学处理效果
  49.    
  50.     * 步骤3:差异检测(理想结构与实际结构对比)
  51.     difference (ClosedBackground, Background, RegionDifference)
  52.    
  53.     * 步骤4:开运算去除微小噪声
  54.     opening_rectangle1 (RegionDifference, FinRegion, 5, 5)
  55.    
  56.     * 显示最终检测结果
  57.     dev_display (Fin)        
  58.     * 原始图像背景
  59.     dev_set_color ('red')   
  60.     * 红色高亮缺陷
  61.     dev_display (FinRegion)  
  62.     * 叠加缺陷区域
  63.    
  64.     * 计算缺陷区域特征
  65.     area_center (FinRegion, FinArea, Row, Column)
  66.    
  67.     * 非最后一张图像时暂停
  68.     if (I < 2)
  69.         disp_continue_message (WindowID, 'black', 'true')
  70.         stop ()  
  71.         * 模拟产线节拍等待
  72.     endif
  73. endfor
复制代码
 
示例3:塑料网缺陷检测程序   使用动态阈值检测塑料网中的异常纹理区域     原图与均值图比对 提取出比均值图还暗的多的缺陷区域出来
9.png

 
两张测试的原图:
10.bmp

 
11.bmp

 
实例代码:
  1. * ​*************************************************************
  2. * 塑料网缺陷检测程序
  3. * 功能:使用动态阈值检测塑料网中的异常纹理区域
  4. * 检测逻辑:
  5. *   1. 图像平滑处理消除纹理干扰
  6. *   2. 动态阈值分割异常区域
  7. *   3. 连通域分析与面积筛选
  8. * 工业应用:塑料编织品质量检测
  9. * ​*************************************************************
  10. * 关闭窗口自动更新(提升执行效率)
  11. dev_update_window ('off')
  12. * 读取塑料网基准图像(用于窗口初始化)
  13. read_image (Image, 'plastic_mesh_'+[1])
  14. * 初始化显示窗口
  15. dev_close_window ()
  16. get_image_size (Image, Width, Height)
  17. dev_open_window_fit_image (Image, 0, 0, Width, Height, WindowHandle)
  18. * 设置可视化参数
  19. * 等宽字体便于信息对齐
  20. set_display_font (WindowHandle, 18, 'mono', 'true', 'false')
  21. * 轮廓显示模式(节省显示资源)
  22. dev_set_draw ('margin')
  23. * 设置检测结果轮廓线宽
  24. dev_set_line_width (3)
  25. * 处理两张塑料网图像序列
  26. for J := 1 to 2 by 1
  27.     * 读取当前检测图像(文件名格式:plastic_mesh_1.bmp~plastic_mesh_2.bmp)
  28.     read_image (Image, 'plastic_mesh_' + J+'.bmp')
  29.    
  30.     * 图像预处理:49x49均值滤波(消除高频纹理干扰)
  31.     mean_image (Image, ImageMean, 49, 49)
  32.    
  33.     * 动态阈值分割(检测比背景暗5个灰度级的异常区域)
  34.     dyn_threshold (Image, ImageMean, RegionDynThresh, 5, 'dark')
  35.    
  36.     * 连通域分析(分离独立缺陷区域)
  37.     connection (RegionDynThresh, ConnectedRegions)
  38.    
  39.     * 面积筛选(过滤500像素以下的噪声)
  40.     select_shape (ConnectedRegions, ErrorRegions, 'area', 'and', 500, 99999)
  41.    
  42.     * 统计缺陷数量
  43.     count_obj (ErrorRegions, NumErrors)
  44.    
  45.     * 显示原始图像和检测结果
  46.     dev_display (Image)
  47.     dev_set_color ('red')  
  48.     * 红色高亮缺陷
  49.     dev_display (ErrorRegions)
  50.    
  51.     * 判定结果输出
  52.     if (NumErrors > 0)
  53.         * 显示NG标识(位置:第24行,第12列)
  54.         disp_message (WindowHandle, 'Mesh not OK', 'window', 24, 12, 'black', 'true')
  55.     else
  56.         * 显示OK标识
  57.         disp_message (WindowHandle, 'Mesh OK', 'window', 24, 12, 'black', 'true')
  58.     endif
  59.    
  60.     * 非最后一张图像时显示继续提示
  61.     if (J < 2)
  62.         disp_continue_message (WindowHandle, 'black', 'true')
  63.         stop ()  
  64.         * 模拟产线节拍控制
  65.     endif
  66. endfor
复制代码
 
结果图:
12.png

 
13.png

 
 
划痕检测的还可以看看这篇surface_scratche.hdev:
14.png

 
15.png

 
16.png

 
 
 
 
 
 
OK,这里先写这几个,还有更多的都在halcon的官方案例集里,右边那一堆都是。
 
17.png

 
 
 
二.空域和频域结合的缺陷检测
这里主要的案例都来自halcon程序集的快速傅里叶变换,有兴趣详细了解的,就可以去看看。就如我一直在说的,halcon里的实例就是自己最好的老师。
 
18.png

 
先大概了解一下这个东西:
 
一、图像的两个视角:空间域 vs 频域

1. 空间域(你看到的图像)​


  • 是什么:图像由像素组成,每个像素代表某个位置的亮度值。
  • 直观理解:就像你看到的一张照片,每个点直接显示颜色或明暗。
  • 工业应用:直接观察表面划痕、颜色异常等(但复杂纹理中的小缺陷难以直接看到)。
2. 频域(图像的“成分分析”)​


  • 是什么:将图像分解为不同频率的波(高频=细节/边缘,低频=整体形状)。
  • 直观理解:像把音乐分解成不同频率的音符,高频是鼓点,低频是贝斯。
  • 工业应用:检测周期性纹理中的异常(如织物瑕疵、注塑件表面缺陷)。
二、快速傅里叶变换(FFT)是什么?


  • 核心作用:快速将图像从空间域转换到频域(反之亦可)。
  • 为什么快:优化算法,计算复杂度从O(n²)降到O(n log n),适合实时检测。
三、HALCON中的FFT操作步骤(以检测塑料表面缺陷为例)​

1. 读取图像
  1. read_image (Image, 'plastics_01.jpg')  * 读取塑料件表面图像
复制代码
2. 转换到频域
  1. * 执行FFT(空间域→频域)
  2. fft_image (Image, ImageFFT)  * 输出是复数图像(实部+虚部)
复制代码
3. 频域滤波(增强缺陷)​

 
  1. * 生成高斯低通滤波器(抑制背景纹理)
  2. gen_gauss_filter (Filter, 20, 20, 0, 'none', 'rft', Width, Height)
  3. * 频域相乘(保留高频=缺陷,抑制低频=背景)
  4. convol_fft (ImageFFT, Filter, FilteredFFT)
复制代码
4. 转换回空间域
  1. * 逆FFT(频域→空间域)
  2. fft_image_inv (FilteredFFT, ImageFiltered)  * 得到增强后的图像
复制代码
5. 缺陷检测
  1. threshold (ImageFiltered, Defects, 120, 255)  * 阈值分割
  2. connection (Defects, ConnectedRegions)       * 连通区域分析
复制代码
四、频域分析在工业中的典型应用

1. 周期性纹理检测(如织物、金属网)​


  • 问题:直接观察难以发现断丝、孔洞。
  • 解决:通过FFT找到异常频率成分。
2. 表面微小缺陷增强


  • 问题:划痕与背景纹理对比度低。
  • 解决:抑制背景纹理(低频),增强缺陷(高频)。
3. 振动分析


  • 问题:机械振动导致图像模糊。
  • 解决:在频域分离振动频率成分并修复。
五、关键注意事项

1. 图像尺寸要求


  • FFT对图像尺寸敏感,最佳性能要求尺寸为2的幂次(如512x512)。
  • HALCON会自动填充:optimize_rft_speed函数优化处理速度。
2. 滤波器设计


  • 低通滤波:gen_gauss_filter(抑制高频噪声)。
  • 高通滤波:gen_derivative_filter(增强边缘)。
  • 带阻滤波:组合高低通滤波器(去除特定频率噪声)。
3. 结果可视化


  • 查看频谱图
  1. power_real (ImageFFT, PowerSpectrum)  * 计算功率谱
  2. dev_display (PowerSpectrum)           * 显示频域能量分布
复制代码
亮点表示强频率成分(如周期性纹理)。
六、完整代码示例(塑料表面缺陷检测)​
  1. dev_update_off ()
  2. read_image (Image, 'plastics_01.jpg')
  3. get_image_size (Image, Width, Height)
  4. dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
  5. * FFT转换到频域
  6. fft_image (Image, ImageFFT)
  7. * 设计高斯滤波器(抑制低频背景)
  8. gen_gauss_filter (Filter, 15, 15, 0, 'none', 'rft', Width, Height)
  9. convol_fft (ImageFFT, Filter, FilteredFFT)
  10. * 逆FFT转回空间域
  11. fft_image_inv (FilteredFFT, ImageFiltered)
  12. * 缺陷分割与显示
  13. threshold (ImageFiltered, Defects, 100, 255)
  14. connection (Defects, ConnectedRegions)
  15. dev_display (Image)
  16. dev_set_color ('red')
  17. dev_display (ConnectedRegions)
复制代码
七、总结


  • FFT在工业中的价值:将肉眼难见的纹理异常转化为可检测的信号。
  • 学习建议:从简单滤波开始,逐步尝试带通/带阻滤波,观察频域图的变化。
  • 调试技巧:通过power_real可视化频域,调整滤波器参数观察缺陷检测效果。
  • 适用于具有一定纹理特征的图像,纹理可以理解为条纹,如布匹、木板、纸张等材质容易出现。
  • 适用于需要提取对比度低或者信噪比低的特征。
 
 
 
 
OK,接下来学习一下主要运用到的算子
 
 
 
 
1.空域转频域算子fft_image(Image : ImageFFT : : )详解:

  • 输入参数

    • Image:输入图像(必须为单通道灰度图像)。

  • 输出参数

    • ImageFFT:频域图像(复数形式,包含实部和虚部)。

工作原理


  • 复数图像结构

    • ImageFFT包含两个通道:可通过get_image_size查看通道数:Channels := 2

      • 第一个通道:实部(Real Part)
      • 第二个通道:虚部(Imaginary Part)



  • 频域特性

    • 低频分量集中在图像中心(整体形状、背景纹理)。
    • 高频分量分布在四周(细节、边缘、噪声)。

工业应用示例(塑料表面缺陷检测)​

场景描述


  • 问题:注塑件表面有微小划痕,但背景有周期性纹理干扰。
  • 目标:通过FFT抑制背景纹理,增强缺陷。
代码流程
  1. * 1. 读取图像并预处理
  2. read_image (Image, 'plastics_01.jpg')
  3. rgb1_to_gray (Image, GrayImage)  * 确保输入是灰度图
  4. * 2. 优化FFT计算速度(关键步骤!)
  5. optimize_rft_speed (Width, Height, 'standard')  * 自动填充至最优尺寸
  6. * 3. 执行FFT转换到频域
  7. fft_image (GrayImage, ImageFFT)
  8. * 4. 频域滤波(示例:高斯带阻滤波)
  9. gen_gauss_filter (GaussFilter, 15, 15, 0, 'none', 'rft', Width, Height)
  10. convol_fft (ImageFFT, GaussFilter, FilteredFFT)
  11. * 5. 逆FFT转回空间域
  12. fft_image_inv (FilteredFFT, ImageFiltered)
  13. * 6. 缺陷检测
  14. threshold (ImageFiltered, Defects, 100, 255)
  15. connection (Defects, ConnectedRegions)
复制代码
关键注意事项

1. 图像尺寸优化


  • 问题:FFT对图像尺寸敏感,非2的幂次时速度慢。
  • 解决:使用optimize_rft_speed自动填充至最优尺寸。
  1. get_image_size (Image, Width, Height)
  2. optimize_rft_speed (Width, Height, 'standard')  * 第三个参数可选:
  3.                                                 * 'standard'(平衡速度/内存)
  4.                                                 * 'explore'(深度优化)
复制代码
2. 输入数据类型


  • 必须:输入图像为byte、uint2或real类型。
  • 建议:转换到real类型避免精度损失:
  1. convert_image_type (GrayImage, ImageReal, 'real')
  2. fft_image (ImageReal, ImageFFT)
复制代码
3. 滤波器设计


  • 低频抑制​(去背景):
  1. * 大σ值高斯滤波器(σ=20)
  2. gen_gauss_filter (LowPassFilter, 20, 20, 0, 'none', 'rft', Width, Height)
复制代码
高频增强​(提取缺陷):
  1. * 高斯带阻滤波(抑制特定频率)
  2. gen_gauss_filter (BandStopFilter, 10, 10, 0, 'none', 'rft', Width, Height)
复制代码
4. 结果可视化
  1. power_real (ImageFFT, PowerSpectrum)  * 计算功率谱(实部² + 虚部²)
  2. dev_display (PowerSpectrum)           * 显示亮度表示能量强度
复制代码
常见问题解答

Q1:直接显示ImageFFT为什么是乱码?


  • 原因:频域图像是复数,无法直接显示。
  • 正确方法:需计算幅度谱或功率谱:
  1. fft_image (Image, ImageFFT)
  2. power_real (ImageFFT, PowerSpectrum)
  3. dev_display (PowerSpectrum)
复制代码
Q2:如何检测周期性缺陷?


  • 步骤

    • 在功率谱中查找对称亮斑。
    • 设计带阻滤波器消除对应频率。
    • 逆FFT后检测剩余异常区域。

Q3:处理速度慢怎么办?


  • 优化措施

    • 使用optimize_rft_speed优化尺寸。
    • 选择fft_generic的快速模式:

  1. fft_generic (Image, ImageFFT, 'to_freq', 'explore', 'complex', Width)
复制代码
总结


  • 核心价值:fft_image将图像转换到频域,使周期性纹理和微小缺陷更易分离。
  • 典型应用

    • 消除背景纹理干扰(如金属网、织物)
    • 增强低对比度缺陷(如塑料划痕)
    • 振动模糊校正(如高速生产线图像修复)

通过合理设计滤波器,您可以在频域中“过滤”掉不需要的信息,显著提升缺陷检测的准确性。
 
 
2.生成高斯滤波器算子gen_gauss_filter( : ImageGauss : Sigma1Sigma2PhiNormModeWidthHeight : )详解:
功能描述


  • 作用:生成高斯滤波器(或高斯导数滤波器),用于频域或空域滤波。
  • 典型应用

    • 抑制周期性背景纹理(如金属网、织物)
    • 增强微小缺陷(如塑料划痕、电子元件焊点缺陷)
    • 图像平滑去噪(保留边缘)

参数
类型说明工业检测调参建议ImageGauss输出对象生成的高斯滤波器图像-Sigma1实数X方向的标准差(控制滤波器的横向扩展)根据目标特征尺寸设置(例:缺陷宽度=20像素 → Sigma1=10)Sigma2实数Y方向的标准差(控制滤波器的纵向扩展)通常与Sigma1相同(各向同性滤波)Phi实数滤波器的旋转角度(弧度)0(无旋转)或根据纹理方向设置(如45°=0.785 rad)Norm字符串标准化模式:
'none':不标准化
'n':归一化到单位能量频域滤波用'none',空域滤波用'n'Mode字符串滤波器模式:
'rft':频域滤波器(复数)
'dc_center':空域滤波器频域处理必选'rft'Width整数滤波器宽度(需与待处理图像等宽)通过get_image_size获取原图尺寸Height整数滤波器高度(需与待处理图像等高)同上




    • (例:划痕宽度6像素 → Sigma=2)

2. Mode='rft'



    • 频域滤波器特性:​必须与图像等尺寸

      • 生成复数滤波器(实部+虚部),直接用于FFT频域乘法
      • 滤波器中心在图像左上角(FFT标准布局)



  1. get_image_size (Image, Width, Height)
  2. gen_gauss_filter(..., Width, Height)
复制代码
3. Norm='none'


  • 频域滤波不推荐归一化

    • 保持滤波器的绝对强度
    • 避免频域相乘后能量损失

工业应用案例:塑料表面划痕检测

场景描述


  • 问题:塑料件表面有细微划痕,但存在网状纹理背景干扰。
  • 目标:抑制网状纹理,增强划痕特征。
解决方案


  • 生成带阻高斯滤波器​(抑制特定频率的网状纹理)
  • 频域滤波后检测缺陷
代码示例
  1. * 1. 读取图像并转换为灰度
  2. read_image (Image, 'plastic_mesh_01.jpg')
  3. rgb1_to_gray (Image, GrayImage)
  4. * 2. 获取图像尺寸
  5. get_image_size (GrayImage, Width, Height)
  6. * 3. 生成高斯带阻滤波器(抑制网状纹理)
  7. Sigma1 := 25.0  * 抑制低频(对应网状纹理周期50像素)
  8. Sigma2 := 3.0    * 保留高频(划痕特征)
  9. gen_gauss_filter (GaussFilter, Sigma1, Sigma2, 0, 'none', 'rft', Width, Height)
  10. * 4. 频域滤波处理
  11. fft_image (GrayImage, ImageFFT)
  12. convol_fft (ImageFFT, GaussFilter, FilteredFFT)
  13. fft_image_inv (FilteredFFT, ImageFiltered)
  14. * 5. 检测划痕
  15. threshold (ImageFiltered, Scratches, 50, 255)
  16. dev_display (Scratches)
复制代码
滤波器效果可视化
  1. * 查看频域滤波器形状
  2. power_real (GaussFilter, PowerSpectrum)
  3. dev_display (PowerSpectrum)  * 显示为中央暗区(抑制低频)+周边亮环(保留高频)
复制代码
参数调优技巧

1. 确定Sigma值


  • 步骤

    • 对正常样本做FFT,观察功率谱中的亮斑(背景纹理频率)
    • 测量亮斑到中心的距离D(像素)
    • 设置Sigma = D/2

2. 方向性滤波(Phi调整)​


  • 应用场景:当缺陷具有方向性时(如平行划痕)
  • 设置方法
  1. * 检测到划痕方向为60度
  2. Phi := rad(60)  * 转换为弧度
  3. gen_gauss_filter(..., Phi, ...)  * 生成旋转滤波器
复制代码
3. 多尺度滤波
  1. * 组合不同Sigma值检测多尺寸缺陷
  2. for Sigma := [5, 10, 20] do
  3.     gen_gauss_filter(..., Sigma, Sigma, ...)
  4.     convol_fft(...)
  5.     * 各尺度结果融合
  6. endfor
复制代码
常见问题解决

Q1:滤波器处理后图像变暗


  • 原因:低频成分被过度抑制。
  • 解决:使用带通滤波(高斯相减):
  1. * 生成两个高斯滤波器相减
  2. gen_gauss_filter (Gauss1, 30, 30, ...)
  3. gen_gauss_filter (Gauss2, 10, 10, ...)
  4. sub_image (Gauss1, Gauss2, BandPassFilter, 1, 0)
复制代码
Q2:处理后出现振铃效应


  • 原因:滤波器边缘陡峭导致吉布斯现象。
  • 解决:增大Sigma值使滤波器过渡平滑。
Q3:滤波后缺陷丢失


  • 原因:Sigma设置过小导致缺陷频率被滤除。
  • 调试:逐步增大Sigma值,观察频域功率谱变化。
总结

参数调整策略​Sigma1根据背景纹理周期设置,越大抑制的低频越多​Sigma2根据缺陷尺寸设置,越小保留的高频细节越多​Phi沿缺陷方向设置(需先进行方向分析)​Norm频域滤波始终用'none',空域滤波用'n'​尺寸必须与输入图像等大(通过get_image_size获取)通过合理设置高斯滤波器参数,可以有效分离背景纹理与目标缺陷,提升工业视觉检测的准确性和鲁棒性。建议配合power_real可视化频域滤波器特性,进行参数调优验证。
 
 
3.频域卷积算子convol_fft(ImageFFTImageFilter : ImageConvol : : )详解:
功能描述


  • 核心作用:在频域中执行两个图像的卷积运算(等效于空域的滤波操作)。
  • 数学原理:频域卷积 = 频域图像 × 频域滤波器(复数乘法)。
  • 优势:比空域卷积快100倍以上(尤其适合大尺寸滤波器或图像)。
 
参数说明

参数类型说明工业检测注意事项ImageFFT输入经过FFT变换的输入图像(复数形式,实部+虚部)必须通过fft_image生成ImageFilter输入频域滤波器(需与ImageFFT同尺寸,复数形式)常用高斯滤波器gen_gauss_filter生成ImageConvol输出卷积结果(复数频域图像)需逆FFT转换回空间域使用 
工业应用场景(金属表面划痕检测)​

场景需求


  • 问题:金属板表面有细微划痕,但存在周期性加工纹理(低频背景)。
  • 目标:抑制背景纹理,增强划痕特征。
处理流程
  1. * 1. 读取图像并转换到频域
  2. read_image (Image, 'metal_surface_01.jpg')
  3. rgb1_to_gray (Image, GrayImage)
  4. fft_image (GrayImage, ImageFFT)  * 转换到频域
  5. * 2. 生成高通高斯滤波器(增强高频缺陷)
  6. gen_gauss_filter (Filter, 5, 5, 0, 'none', 'rft', Width, Height)
  7. * 3. 频域卷积(等效于空域滤波)
  8. convol_fft (ImageFFT, Filter, ImageConvol)
  9. * 4. 逆FFT转回空间域
  10. fft_image_inv (ImageConvol, ImageFiltered)
  11. * 5. 检测划痕
  12. threshold (ImageFiltered, Scratches, 80, 255)
  13. dev_display (Scratches)
复制代码
频域卷积效果


  • 输入频谱:ImageFFT包含金属纹理(低频中心亮区)+ 划痕(高频边缘)。
  • 滤波器:高通滤波器(中央暗区,周边亮环)。
  • 输出频谱:抑制低频纹理,保留高频划痕信号。
关键参数详解

1. 滤波器设计策略

滤波器类型生成方法适用场景​低通gen_gauss_filter大Sigma(如30)抑制高频噪声(如电子元件毛刺)​高通1 - 低通滤波器增强边缘/划痕​带阻高斯1 - 高斯2(不同Sigma)消除特定频率干扰(如网格纹理)​带通高斯低通 - 高斯高通提取特定尺寸特征2. 性能优化


  • 尺寸匹配:确保ImageFFT和ImageFilter尺寸相同(通过get_image_size验证)。
  • 预处理加速
  1. optimize_rft_speed (Width, Height, 'standard')  * 自动填充至最优尺寸
复制代码
典型问题解决方案

问题1:处理后出现振铃伪影


  • 原因:滤波器边缘陡峭导致吉布斯现象。
  • 解决
  1. * 使用渐变高斯滤波器(边缘平滑)
  2. gen_gauss_filter (Filter, 15, 15, 0, 'none', 'rft', Width, Height)
复制代码
问题2:缺陷信号被过度抑制


  • 现象:阈值分割后缺陷区域消失。
  • 调试步骤

    • 检查滤波器类型(误用低通会抑制缺陷)。
    • 可视化功率谱:

  1. power_real (ImageConvol, PowerSpectrum)
  2. dev_display (PowerSpectrum)  * 确认缺陷频率是否保留
复制代码
与空域卷积的对比

特性频域卷积 (convol_fft)空域卷积 (convol_image)​速度O(n log n) → 快(大核优势)O(n²m²) → 慢(m为滤波器尺寸)​适用场景大尺寸滤波器(>15x15)小尺寸滤波器(5的像素(增强后的划痕区域)threshold (Lines, Region, 5, 255)* 【4.2 连通域分析】 * 分离不连续的候选区域connection (Region, ConnectedRegions)* 【4.3 区域筛选】 * 保留面积5-5000像素的候选区域(过滤噪声和大面积背景)select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 5000)* 【4.4 圆形膨胀】 * 合并相邻区域,半径5.5平衡连接性和细节保留dilation_circle (SelectedRegions, RegionDilation, 5.5)* 【4.5 区域合并】 * 将所有候选区域合并为一个整体union1 (RegionDilation, RegionUnion)* 【4.6 ROI提取】 * 在原始图像上裁剪出候选区域reduce_domain (Image, RegionUnion, ImageReduced)* 【4.7 高斯线检测】 * 参数0.8: 高斯平滑系数,检测暗色条状特征lines_gauss (ImageReduced, LinesXLD, 0.8, 3, 5, 'dark', 'false', 'bar-shaped', 'false')* 【4.8 合并共线轮廓】 * 40: 最大角度差(度),3: 最大距离差,合并断裂线段union_collinear_contours_xld (LinesXLD, UnionContours, 40, 3, 3, 0.2, 'attr_keep')* 【4.9 轮廓筛选】 * 选择长度15-1000像素的轮廓(滤除短噪声)select_shape_xld (UnionContours, SelectedXLD, 'contlength', 'and', 15, 1000)* 【4.10 生成最终区域】 * 将XLD轮廓转为填充区域gen_region_contour_xld (SelectedXLD, RegionXLD, 'filled')* 【4.11 最终区域合并与膨胀】 * 合并所有区域并用10.5半径膨胀强化显示union1 (RegionXLD, RegionUnion)dilation_circle (RegionUnion, RegionScratches, 10.5)* 【5. 结果显示】* -----------------------------------------------------dev_set_draw ('margin')     * 轮廓显示模式dev_set_line_width (3)      * 设置线宽dev_set_colored (12)        * 使用12种颜色区分区域dev_display (Image)         * 显示原始图像dev_display (RegionScratches) * 叠加显示划痕检测结果[/code] 
 结果图:
19.png

 
 
 
 示例3:皮革表面缺陷检测
 
原图:
20.bmp

 
 
21.bmp

 
实例代码:
  1. dev_update_off ()
  2. read_image (Image, 'fabric_01.jpg')
  3. get_image_size (Image, Width, Height)
  4. optimize_rft_speed (Width, Height, 'standard')  * 尺寸优化
  5. * 频域转换
  6. fft_image (Image, ImageFFT)
  7. * 设计带阻滤波器(抑制织物纹理)
  8. gen_gauss_filter (LowPass, 40, 40, 0, 'none', 'rft', Width, Height)
  9. gen_gauss_filter (HighPass, 5, 5, 0, 'none', 'rft', Width, Height)
  10. sub_image (LowPass, HighPass, BandStopFilter, 1, 0)
  11. * 频域卷积
  12. convol_fft (ImageFFT, BandStopFilter, ImageConvol)
  13. * 逆变换与检测
  14. fft_image_inv (ImageConvol, ImageFiltered)
  15. threshold (ImageFiltered, Defects, 70, 255)
  16. connection (Defects, ConnectedRegions)
  17. select_shape (ConnectedRegions, FinalDefects, 'area', '>', 50)
复制代码
 
显示反照率图:
22.png

 
显示结果图:
23.png

24.png

 
 
 
 
 
 
 
未完待续。。。。。。。。。。。。
 
[table]∂x∂Vy​​交叉导数(剪切应变)
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册