HALCON示例程序check_blister_mixed.hedv藥品膠囊缺陷檢測
示例程序源碼(加注釋)
- 讀入圖片與顯示相關設置
dev_close_window ()
read_image (Image, ‘blister/blister_mixed_reference’)
dev_open_window_fit_image (Image, 0, 0, -1, -1, WindowHandle)
set_display_font (WindowHandle, 14, ‘mono’, ‘true’, ‘false’)
dev_update_off ()
dev_display (Image)
dev_set_draw (‘margin’) - 首先提取每個膠囊
disp_message (WindowHandle, ‘Train gmm classifier on pill types’, ‘window’, -1, -1, ‘black’, ‘true’) - 注意注意敲黑板,劃重點。下邊的這個函數是halcon函數的封裝,里邊代碼有好多。內容是上一篇文章介紹過,大同小異,所以不理解的話看一下上一篇例子。下邊的代碼塊是extract_pill_types里邊的內容。
extract_pill_types (Image, Chambers, ChambersUnion, Classes, PhiRef, RowRef, ColumnRef, PillTypeCount)
threshold (Image, Region, 90, 255)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5000, 999999)
shape_trans (SelectedRegions, Blister, 'convex')
gen_empty_region (Chambers)
for I := 0 to 4 by 1Row := 107 + I * 70for J := 0 to 2 by 1Column := 177 + J * 150gen_rectangle2 (Rectangle, Row, Column, 0, 64, 30)concat_obj (Chambers, Rectangle, Chambers)endfor
endfor
difference (Blister, Chambers, Pattern)
union1 (Chambers, ChambersUnion)
orientation_region (Blister, PhiRef)
PhiRef := rad(180) + PhiRef
area_center (Blister, Area, RowRef, ColumnRef)* +++ Extract pattern for classification +++
select_shape (Chambers, PillType1, 'row', 'and', 1, 145)
union1 (PillType1, PillType1)
select_shape (Chambers, PillType2, 'row', 'and', 145, 270)
union1 (PillType2, PillType2)
select_shape (Chambers, PillType3, 'row', 'and', 270, 390)
union1 (PillType3, PillType3)* Extract color space of yellow pills
reduce_domain (Image, PillType1, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
threshold (ImageB, Region, 60, 95)* Extract color space of red pills
reduce_domain (Image, PillType2, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
* invert_image反轉圖像的灰度值
invert_image (ImageB, ImageInvert)
* hysteresis_threshold使用遲滯閾值操作
* 函數原型:hysteresis_threshold(Image : RegionHysteresis : Low, High, MaxLength : )
* Image :輸入圖像;RegionHysteresis :輸出區域;Low:低于這個灰度不會被選中;High:高于這個灰度立刻被選中;
* MaxLength :在Low與High之間的根據MaxLength 對比度進行選擇,和carry邊緣類似。
hysteresis_threshold (ImageInvert, RegionHysteresis2, 190, 200, 5)* Extract color space of green pills
reduce_domain (Image, PillType3, ImageReduced)
decompose3 (ImageReduced, ImageR, ImageG, ImageB)
invert_image (ImageB, ImageInvert)
hysteresis_threshold (ImageInvert, RegionHysteresis3, 180, 200, 10)* 求兩個區域的交集
intersection (Region, PillType1, PillType1)
intersection (RegionHysteresis2, PillType2, PillType2)
PillTypeCount := [3,6,6]
intersection (RegionHysteresis3, PillType3, PillType3)
concat_obj (PillType1, PillType2, Classes)
concat_obj (Classes, PillType3, Classes)
return ()
NumClasses := |PillTypeCount|
-
創建創建高斯混合模型
-
輸入參數: NumDim:幾個特征;NumClasses:樣本分類個數;NumCenters:類中心的個數;CovarType:
-
協方差矩陣(‘Spherical’,‘diag’,‘full’);Preprocessing:預處理是否使用,及特征向量轉換類型;
-
NumComponents:預處理參數,轉換特征數;RandSend:迭代次數,初始化GMM;
-
輸出參數:GMMHandle:高斯混合模型
create_class_gmm (3, 3, [1,5], ‘spherical’, ‘normalization’, 10, 42, GMMHandle) -
含義:增加訓練樣本(圖片區),放入GMM 進行訓練數據
-
輸入參數:Image:訓練的圖像(多通道);ClassRegions:圖像中用于訓練的類區域;
-
GMMHandle:高斯混合模型;Randomize:高斯噪聲標準差
add_samples_image_class_gmm (Image, Classes, GMMHandle, 0) -
含義:訓練高斯混合模型
-
輸入參數:GMMHandle:高斯混合模型;MixIter: 期望最大值算法中迭代最大數;
-
Threshold:期望誤差閾值,超過此值,計算取消;
-
ClassPriors:類的先驗概率類型;(‘training’,‘uniform’)'uniform’表示使用相同的權重,1/NumClasses;'training’表示類發生的概率是依據樣本中的概率推斷。
-
Regularize:調整值,為了防止計算中出現奇異協方差矩陣。增加到協方差矩陣的對角線上的一個很小的值
-
輸出參數:Centers:每個類的中心個數
-
Iter:每個類的迭代次數
train_class_gmm (GMMHandle, 100, 0.001, ‘training’, 0.0001, Centers, Iter) -
檢測膠囊
Count := 12
for FileIndex := 1 to Count by 1- 讀入圖片
read_image (Image, ‘blister/blister_mixed_’ + FileIndex$‘02’) - 閾值分割
threshold (Image, Region, 90, 255) - 分割連通域
connection (Region, ConnectedRegions) - 面積對區域篩選
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 5000, 9999999) - 求取最大區域邊緣
shape_trans (SelectedRegions, RegionTrans, ‘convex’) - 利用橢圓變換,得出區域角度
orientation_region (RegionTrans, Phi)
if (abs(Phi) > rad(90))
Phi := rad(180) + Phi
endif - 求取區域面積與中心坐標
area_center (RegionTrans, Area1, Row, Column) - 創建平移旋轉變換矩陣
vector_angle_to_rigid (Row, Column, Phi, RowRef, ColumnRef, PhiRef, HomMat2D) - 使用仿射變換矩陣進行任意仿射變換
affine_trans_image (Image, ImageAffinTrans, HomMat2D, ‘constant’, ‘false’) - 減少圖像定義域
reduce_domain (ImageAffinTrans, ChambersUnion, ImageReduced) - 將圖片分為rgb三通道圖像
decompose3 (ImageAffinTrans, ImageR, ImageG, ImageB) - 對每個膠囊進行識別檢測
- 含義:使用GMM分類一個圖像
- 輸入參數:Image:訓練的圖像(多通道);GMMHandle:GMM模型;
- RejectionThreshold:分類拒絕閾值,如果圖像所有的像素概率低于此值將不會分類任何類。
- 輸出參數:ClassRegions:分類的各個區域
classify_image_class_gmm (ImageReduced, ClassRegions, GMMHandle, 0.005) - 對ClassRegions進行計數
count_obj (ClassRegions, Number) - 生成空區域
gen_empty_obj (FinalClasses) - 分割連通域
connection (Chambers, ChambersRemaining)
for Index := Number to 1 by -1
dev_clear_window ()- 選擇ClassRegions區域中的第Index個對象
select_obj (ClassRegions, Region, Index) - 求交集
intersection (ChambersRemaining, Region, Region) - 使用面積與寬度進行區域篩選
select_shape (Region, PillsOfOneType, [‘area’,‘width’], ‘and’, [200,40], [3000,68]) - 求取兩個區域的差集
difference (ChambersUnion, PillsOfOneType, RegionDifference) - 分割連通域
connection (RegionDifference, ConnectedRegions) - 使用面積進行區域篩選
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 0, 7868) - 求取區域的最大邊緣
shape_trans (SelectedRegions, SelectedRegions, ‘convex’) - 聯合區域
union1 (SelectedRegions, SelectedRegions) - 求取區域差集
difference (ChambersRemaining, SelectedRegions, ChambersRemaining) - 聯合兩個區域
concat_obj (SelectedRegions, FinalClasses, FinalClasses)
endfor
- 選擇ClassRegions區域中的第Index個對象
- 得出結果進行處理得出結論
gen_empty_obj (MissingPills)
gen_empty_obj (WrongPills)
gen_empty_obj (WrongNumberOfPills)
difference (ChambersUnion, FinalClasses, LeftOvers)
area_center (LeftOvers, Area, Row1, Column1)
if (Area > 0)
connection (LeftOvers, LeftOvers)
count_obj (LeftOvers, Number)
for Index := 1 to Number by 1
select_obj (LeftOvers, ObjectSelected, Index)
intensity (ObjectSelected, ImageB, Mean, Deviation)
if (Deviation > 40)
concat_obj (WrongPills, ObjectSelected, WrongPills)
else
concat_obj (MissingPills, ObjectSelected, MissingPills)
endif
endfor
endif - Compute histogram
CountFinalClass := []
for Index := 1 to NumClasses by 1
select_obj (FinalClasses, ObjectSelected, Index)
connection (ObjectSelected, ObjectSelected)
count_obj (ObjectSelected, Size)
CountFinalClass := [CountFinalClass,Size]
endfor - Display classification results and output allover statistic
display_results (ImageAffinTrans, LeftOvers, FinalClasses, WrongPills, CountFinalClass, PillTypeCount, WindowHandle)
if (FileIndex < Count)
disp_continue_message (WindowHandle, ‘black’, ‘true’)
endif
stop ()
endfor
- 讀入圖片
-
Clear classifier handle
clear_class_gmm (GMMHandle)
處理思路
此例子使用GMM高斯分類器進行膠囊識別識別,因為一版藥上有多個種類的藥片。
后記
大家有什么問題可以向我提問哈,我看到了第一時間回復,希望在學習的路上多多結交良師益友。