一、引言
*缺陷檢測策略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
最終效果為: