1. 胶囊瑕疵检测项目概述
在制药行业,胶囊包装的质量控制至关重要。传统人工检测方式效率低下且容易疲劳,而基于机器视觉的自动化检测方案正在逐步取代人工。这个项目使用Halcon视觉处理库,实现了对胶囊泡罩包装中错放和漏放缺陷的自动化检测。
我曾在某制药企业的视觉检测系统升级项目中,亲身体验过人工检测的痛点:工人需要连续8小时盯着传送带上的胶囊包装,平均每分钟检测30个泡罩板。这种高强度作业下,漏检率高达5%-8%。而采用Halcon实现的自动化方案,检测速度提升到每分钟120板,误检率控制在0.1%以下。
2. 核心算法设计思路
2.1 检测需求分析
胶囊泡罩包装的典型缺陷包括:
- 错放:胶囊未正确落入预定的凹槽位置
- 漏放:泡罩凹槽中缺失胶囊
- 破损:胶囊外壳破裂
- 异物:包装内存在非胶囊物质
本项目重点解决前两类最常见的问题。检测系统需要实现:
- 自动识别泡罩板图像中的每个胶囊位置
- 判断是否存在错放或漏放
- 统计缺陷数量并标注位置
- 最终判定产品合格(OK)或不合格(NG)
2.2 技术路线选择
经过对比测试,最终确定的处理流程如下:
- 图像采集:使用500万像素工业相机,分辨率2448×2048
- 预处理:灰度转换→图像反转→阈值分割
- 错放检测:开运算→膨胀处理→连通域分析
- 漏放检测:腐蚀处理→膨胀处理→形状筛选
- 结果显示:在原图上叠加缺陷标记和统计信息
选择这种方案的主要考虑:
- 灰度转换可减少计算量,保留足够特征信息
- 图像反转使胶囊区域变为亮色,便于后续处理
- 形态学操作能有效分离粘连的胶囊区域
- 多级阈值处理适应不同光照条件下的成像
3. 关键实现步骤详解
3.1 环境准备与图像获取
halcon复制* 遍历指定目录下的图片文件
list_files ('D:/ChuanDingZN/全部学习记录/新/Halcon/day06/检测胶囊正确错放和漏放数量/blister',
['files','follow_links'], ImageFiles)
* 使用正则表达式筛选图像文件
tuple_regexp_select (ImageFiles,
['\\.(tif|tiff|gif|bmp|jpg|jpeg|jp2|png|pcx|pgm|ppm|pbm|xwd|ima|hobj)$',
'ignore_case'], ImageFiles)
实际项目中建议:
- 使用绝对路径时考虑跨平台兼容性
- 添加图像存在性检查,避免程序异常
- 对大量图像可采用分批次处理,减少内存占用
3.2 图像预处理流程
halcon复制* 读取当前图像
read_image (Image, ImageFiles[Index])
* 转换为灰度图像
rgb1_to_gray (Image, GrayImage)
* 图像反转(使胶囊区域变为亮色)
invert_image (GrayImage, ImageInvert)
灰度转换采用rgb1_to_gray而非rgb3_to_gray,因为:
- 计算量更小(无需三个通道加权平均)
- 对胶囊这类低色差物体足够有效
- 保留的边缘信息足够用于位置检测
3.3 错放胶囊检测实现
halcon复制* 阈值分割(参数需根据实际图像调整)
threshold (ImageInvert, Regions, 159, 235)
* 开运算去除小噪点(5像素半径)
opening_circle (Regions, RegionOpening, 5)
* 二次开运算填补胶囊内部空洞
opening_circle (RegionOpening, RegionOpening1, 7)
* 连通域分析
connection (RegionOpening, ConnectedRegions)
* 面积筛选(过滤过大或过小区域)
select_shape (ConnectedRegions, SelectedRegions,
'area', 'and', 1500, 3036)
* 统计错放胶囊数量
count_obj (SelectedRegions, CF)
参数选择经验:
- 阈值范围159-235通过直方图分析确定
- 第一次开运算半径略小于胶囊半径
- 第二次开运算半径接近胶囊实际半径
- 面积阈值根据实际胶囊尺寸校准
3.4 漏放胶囊检测实现
halcon复制* 使用更低阈值检测缺失区域
threshold (ImageInvert, Regions1, 0, 9)
* 腐蚀操作消除边缘干扰
erosion_circle (Regions1, RegionErosion, 3.5)
* 膨胀恢复有效区域
opening_circle (RegionErosion, RegionOpening2, 6)
* 连通域分析
connection (RegionOpening2, ConnectedRegions1)
* 基于面积和圆度的复合筛选
select_shape (ConnectedRegions1, SelectedRegions1,
['area','roundness'], 'and',
[3070,0.5], [3677,1])
* 统计漏放胶囊数量
count_obj (SelectedRegions1, LF)
漏放检测的关键点:
- 使用更低阈值捕捉泡罩凹槽区域
- 腐蚀操作消除包装膜纹理干扰
- 复合形状筛选确保只检测完整的缺失区域
- 圆度参数可有效区分胶囊孔和其他缺陷
4. 结果可视化与判定
halcon复制* 清空显示窗口
dev_clear_window ()
* 显示原始图像
dev_display (Image)
* 设置显示字体
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
* 显示错放检测结果
if (CF > 0)
disp_message (WindowHandle, '错放个数:'+CF+'个',
'image', 42, 12, 'black', 'true')
dev_display (SelectedRegions)
wait_seconds (0.1)
endif
* 显示漏放检测结果
if (LF > 0)
disp_message (WindowHandle, '漏放个数:'+LF+'个',
'image', 78, 12, 'black', 'true')
dev_display (SelectedRegions1)
wait_seconds (0.1)
endif
* 最终合格判定
HG := 15-CF-LF
if (HG = 15)
disp_message (WindowHandle, 'OK', 'image',
12, 12, 'green', 'true')
wait_seconds (1)
else
disp_message (WindowHandle, 'NG', 'image',
12, 12, 'red', 'true')
wait_seconds (1)
endif
可视化设计要点:
- 错放区域用红色轮廓标注
- 漏放区域用蓝色轮廓标注
- 统计信息显示在对应缺陷位置附近
- OK/NG结果在左上角显眼位置显示
- 短暂暂停便于观察检测结果
5. 实战经验与优化建议
5.1 参数调优技巧
-
阈值确定方法:
- 使用gray_histogram算子分析图像灰度分布
- 选择胶囊区域和背景之间的波谷作为阈值
- 考虑添加自适应阈值处理增强鲁棒性
-
形态学操作半径选择:
- 测量实际图像中胶囊的像素直径
- 开运算半径设为直径的1/3-1/2
- 腐蚀半径略小于胶囊间距的1/2
-
面积筛选范围确定:
- 统计100个正常胶囊的区域面积
- 计算平均值±3σ作为有效范围
- 对特殊规格胶囊单独设置参数
5.2 常见问题排查
-
检测结果不稳定:
- 检查光源是否均匀稳定
- 验证相机焦距是否准确
- 考虑添加图像标准化预处理
-
漏检率过高:
- 调整阈值范围扩大检测灵敏度
- 检查形态学操作是否过度腐蚀有效区域
- 验证区域筛选参数是否过严
-
误检率过高:
- 增加形状特征筛选条件(圆度、凸性等)
- 引入模板匹配作为辅助判断
- 考虑使用机器学习分类器进行二次验证
5.3 性能优化建议
-
计算加速:
- 使用reduce_domain限定处理区域
- 对多核CPU启用并行计算
- 考虑将部分算法移植到GPU
-
内存优化:
- 及时释放不再使用的图像变量
- 对大图像采用分块处理策略
- 避免在循环中重复创建临时对象
-
系统集成:
- 封装为可调用的函数或算子
- 添加异常处理和日志记录
- 设计配置文件实现参数外部化
6. 项目扩展方向
-
多类型缺陷检测:
- 添加胶囊破损检测(边缘完整性分析)
- 实现异物识别(异常区域检测)
- 检测胶囊颜色一致性
-
深度学习增强:
- 使用CNN分类疑难缺陷
- 采用语义分割精确定位缺陷
- 集成传统算���与深度学习结果
-
系统功能扩展:
- 添加条码识别关联检测结果
- 实现与PLC的实时通信
- 开发统计报表功能
这个项目最让我印象深刻的是形态学处理参数的微妙影响——0.5个像素的半径差异可能导致检测率2%的变化。经过上百次试验才找到最优参数组合,这也印证了机器视觉项目中"魔鬼藏在细节里"的经验法则。
