C#Halcon从零开发_Day14_AOI缺陷检测策略1_Bolb分析+特征分析
一、引言
*缺陷检测策略1:Blob分析+特征分析
*Blob分析:阈值分割、开闭运算
(1) 图像预处理
-
目的:增强目标与背景的对比度,抑制噪声。
-
常用算子:
-
threshold()
:通过阈值分割将图像转换为二值图像。 -
mean_image()
/gauss_filter()
:平滑图像,减少噪声。 -
invert_image()
:反转图像(如目标为暗色时)。
-
(2) 连通区域检测
-
目的:将二值图像中的连通像素分组为Blob。
-
关键算子:
-
connection()
:根据像素连通性(4邻域或8邻域)分割Blob。 -
select_shape()
:根据特征(面积、圆度、长宽比等)筛选目标Blob。
-
(3) Blob特征提取
-
目的:量化Blob的几何和形态特征,用于后续分析。
-
常用特征:
-
面积(Area):Blob的像素数量。
-
质心(Row, Column):Blob的中心坐标。
-
长宽比(Aspect Ratio):Blob的最小外接矩形的宽度与高度比。
-
圆度(Roundness):衡量Blob接近圆形的程度。
-
方向(Orientation):Blob的最小外接矩形的旋转角度。
-
(4) Blob分类与筛选
-
目的:根据特征过滤或分类Blob。
-
常用方法:
-
范围筛选:如
select_shape(Regions, SelectedRegions, 'area', 'and', 100, 1000)
筛选面积在100到1000之间的Blob。 -
分类:如根据圆度区分圆形和矩形物体。
-
(5) 结果可视化与输出
-
目的:显示Blob分析结果或导出数据。
-
常用操作:
-
dev_display()
:显示Blob的轮廓或填充区域。 -
count_obj()
:统计Blob数量。 -
area_center()
:获取Blob的面积和质心坐标。
-
*特征分析: 空洞面积、矩形度等
(1) 几何特征
-
描述目标的基本形状和位置:
-
面积(Area):目标区域的像素数量。
-
质心(Row, Column):目标的中心坐标。
-
最小外接矩形(Bounding Box):目标的最小外接矩形的尺寸和方向。
-
长宽比(Aspect Ratio):外接矩形的宽度与高度比。
-
圆度(Roundness):衡量目标接近圆形的程度(值越接近1,越接近圆形)。
-
方向(Orientation):目标的最小外接矩形的旋转角度。
-
凸性(Convexity):目标区域与其凸包的比值。
-
(2) 形态特征
-
描述目标的复杂形状和边缘特性:
-
紧密度(Compactness):面积与周长平方的比值(值越小,形状越复杂)。
-
矩形度(Rectangularity):目标面积与其最小外接矩形面积的比值。
-
孔洞数量(Holes):目标区域内部的孔洞数量。
-
边缘长度(Contour Length):目标轮廓的像素长度。
-
(3) 灰度/纹理特征
-
描述目标的灰度分布或纹理模式:
-
灰度均值(Mean Gray Value):目标区域的平均灰度值。
-
灰度方差(Gray Value Variance):目标区域的灰度方差。
-
纹理特征:通过灰度共生矩阵(GLCM)提取的对比度、熵、能量等特征。
-
梯度特征:边缘强度、梯度方向等。
-
(4) 高级特征
-
基于模型或学习的特征:
-
形状描述符:如Zernike矩、Hu矩等。
-
深度学习特征:通过预训练的深度学习模型提取的高层特征(需结合Halcon的深度学习模块)。
-
*重要算子:ared_heoles rectangularity
二、分析饼干检测
需要对饼干的破损进行检测,破损会导致空洞面积大以及外围矩形度受损
*D:/Program Files/MVTec/Data/HALCON-23.05-Progress/examples/images/food
for Index := 1 to 24 by 1
read_image (Image, 'food/hazelnut_wafer_'+Index$'.02')
*Blob分析-对图片二值化阈值分割
binary_threshold (Image, Region, 'max_separability', 'light', UsedThreshold)
*Blob分析-对区域进行开运算 --先腐蚀后膨胀以去除杂质
opening_circle (Region, RegionOpening, 8)
*特征分析1-检测空洞的面积
area_holes (RegionOpening, Area)
*特征分析2-检测区域矩形度
rectangularity (RegionOpening, Rectangularity)
if(Area>600 or Rectangularity<0.9)
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'false', 'false')
dev_disp_text ('NG', 'window', 'top', 'left', 'red', ['box','box_color'], ['true','blue'])
stop()
else
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'false', 'false')
dev_disp_text ('OK', 'window', 'top', 'left', 'green', ['box','box_color'], ['true','blue'])
stop()
endif
endfor
最终效果为: