Halcon分類----高斯混合模型GMM


前言

現有的圖像中目標的分類常用深度學習模型處理,但是深度學習需要大量模型處理。對於明顯提取的目標,常常有幾個明顯特征,利用這幾個明顯特征使用少量圖片便可以完成圖像目標分類工作。這里介紹使用高斯混合模型GMM處理圖像。

常用算子及流程

1. 先提取特征,提取區域特征(或者邊緣,灰度特征等)
*計算區域圓度

circularity(區域,圓度值)

*計算區域面積

area_center(區域,面積)

*將兩個特征轉化為一個向量中

FeatureVector:=real([Circularity,Area])

2. 定義特征類
*定義特征面積

FeaturesArea:=[]

*定義特征圓度

FeaturesName:=[]

*定義類

ClassName:=['充電器','瓶蓋']

3. 創建分類高斯模型

creat_class_gmm(2,2,1,'spherical','normalization',10,42,GMMHandle)

//creat_class_gmm(2個類,2個特征,要分為1個,'spherical','normalization',10,42,GMMHandle)
之后,將瓶蓋的面積和圓度放到類中

add_sample_class_gum(GMMHandle,FeatureVector,0,0)

//add_sample_class_gum(GMMHandle,要存儲的訓練向量樣本,要存儲的訓練樣本的類ID,加載到樣本的標准差)

4. 訓練高斯混合模型

train_class_gmm(GMMHandle,100,0.001,'training',0.0001,centers,Iter)

//train_class_gmm(GMMHandle,最大迭代次數,期望偏差,'training',0.0001,每個類找到的中心數,每個迭代次數)

5. 使用高斯混合模型分類

classify_class_gmm(GMMHandle,FeatureVector,1,classID,classProb,Density,KSigmaProb)

//classify_class_gmm(GMMHandle,當前物體的特征向量,要確定的最大類數,對應className中的ID數,類后驗概率,概率密度,特征向量概率)


完整的高斯混合模型的案例如下,提取圖像特征用的笨方法,一個個提取的,如果成像比較好的話完全可以使用for循環,這里只是方便大家理解。

dev_close_window ()
dev_open_window (0, 0, 512, 512, 'black', WindowHandle)
*已知瓶蓋1
read_image (Image, 'D:/瓶蓋.bmp.tif')
rgb1_to_gray (Image, GrayImage)
threshold (GrayImage, Regions1, 0, 32)
connection (Regions1, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 210952, 500000)
select_shape (SelectedRegions, SelectedRegions1, 'phi', 'and', 0.4861, 0.8447)
fill_up (SelectedRegions1, RegionFillUp)
circularity (RegionFillUp, Circularity)
area_center (RegionFillUp, Area, Row, Column)
*已知瓶蓋2
read_image (Image2, 'D:/1.bmp.tif')
rgb1_to_gray (Image2, GrayImage2)
threshold (GrayImage2, Regions2, 127, 255)
connection (Regions2, ConnectedRegions2)
select_shape (ConnectedRegions2, SelectedRegions3, 'area', 'and', 147143, 500000)
fill_up (SelectedRegions3, RegionFillUp2)
circularity (RegionFillUp2, Circularity2)
area_center (RegionFillUp2, Area2, Row2, Column2)
*已知瓶蓋3
read_image (Image3, 'D:/2.bmp.tif')
rgb1_to_gray (Image3, GrayImage3)
threshold (GrayImage3, Regions3, 0, 36)
connection (Regions3, ConnectedRegions3)
select_shape (ConnectedRegions3, SelectedRegions4, 'area', 'and', 210000, 500000)
select_shape (SelectedRegions4, SelectedRegions5, 'area', 'and', 210000, 305453)
fill_up (SelectedRegions5, RegionFillUp3)
circularity (RegionFillUp3, Circularity3)
area_center (RegionFillUp3, Area3, Row3, Column3)
*已知瓶蓋4
read_image (Image4, 'D:/3.bmp.tif')
rgb1_to_gray (Image4, GrayImage4)
threshold (GrayImage4, Regions4, 121, 255)
connection (Regions4, ConnectedRegions4)
select_shape (ConnectedRegions4, SelectedRegions6, 'area', 'and', 280957, 452627)
fill_up (SelectedRegions6, RegionFillUp4)
circularity (RegionFillUp4, Circularity4)
area_center (RegionFillUp4, Area4, Row4, Column4)



*已知充電器1
read_image (Image1, 'D:/充電器.bmp.tif')
rgb1_to_gray (Image1, GrayImage1)
threshold (GrayImage1, Regions, 1, 32)
connection (Regions, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions2, 'area', 'and', 498095, 1e+006)
fill_up (SelectedRegions2, RegionFillUp1)
circularity (RegionFillUp1, Circularity1)
area_center (RegionFillUp1, Area1, Row1, Column1)
*已知充電器2
read_image (Image5, 'D:/11.bmp.tif')
rgb1_to_gray (Image5, GrayImage5)
threshold (GrayImage5, Regions5, 124, 251)
connection (Regions5, ConnectedRegions5)
select_shape (ConnectedRegions5, SelectedRegions7, 'area', 'and', 549524, 1e+006)
fill_up (SelectedRegions7, RegionFillUp5)
circularity (RegionFillUp5, Circularity5)
area_center (RegionFillUp5, Area5, Row5, Column5)
*已知充電器3
read_image (Image6, 'D:/22.bmp.tif')
rgb1_to_gray (Image6, GrayImage6)
threshold (GrayImage6, Regions7, 152, 244)
connection (Regions7, ConnectedRegions6)
select_shape (ConnectedRegions6, SelectedRegions8, 'area', 'and', 293621, 1e+006)
fill_up (SelectedRegions8, RegionFillUp6)
circularity (RegionFillUp6, Circularity6)
area_center (RegionFillUp6, Area6, Row6, Column6)
*已知充電器4
read_image (Image7, 'D:/33.bmp.tif')
rgb1_to_gray (Image7, GrayImage7)
threshold (GrayImage7, Regions6, 0, 34)
connection (Regions6, ConnectedRegions7)
select_shape (ConnectedRegions7, SelectedRegions9, 'area', 'and', 293621, 1e+006)
fill_up (SelectedRegions9, RegionFillUp7)
circularity (RegionFillUp7, Circularity7)
area_center (RegionFillUp7, Area7, Row7, Column7)



ClassNum:=['瓶蓋','充電器']
*創建一個高斯混合模型分類器
create_class_gmm (2, 2, 1, 'spherical', 'normalization', 10, 42, GMMHandle)

*增添瓶蓋的特征
FeatureVector:=real([Circularity,Area])
add_sample_class_gmm (GMMHandle, FeatureVector, 0, 0)
FeatureVector2:=real([Circularity2,Area2])
add_sample_class_gmm (GMMHandle, FeatureVector2, 0, 0)
FeatureVector3:=real([Circularity3,Area3])
add_sample_class_gmm (GMMHandle, FeatureVector3, 0, 0)
FeatureVector4:=real([Circularity4,Area4])
add_sample_class_gmm (GMMHandle, FeatureVector4, 0, 0)

*增添充電器的特征
FeatureVector1:=real([Circularity1,Area1])
add_sample_class_gmm (GMMHandle, FeatureVector1, 1, 0)
FeatureVector5:=real([Circularity5,Area5])
add_sample_class_gmm (GMMHandle, FeatureVector5, 1, 0)
FeatureVector6:=real([Circularity6,Area6])
add_sample_class_gmm (GMMHandle, FeatureVector6, 1, 0)
FeatureVector7:=real([Circularity7,Area7])
add_sample_class_gmm (GMMHandle, FeatureVector7, 1, 0)

*訓練高斯模型
train_class_gmm (GMMHandle, 100, 0.001, 'training', 0.0001, Centers, Iter)

*讀取現有瓶蓋模型
read_image (Image8, 'D:/驗證集.bmp.tif')
rgb1_to_gray (Image8, GrayImage8)
threshold (GrayImage8, Regions8, 128, 253)
connection (Regions8, ConnectedRegions8)
select_shape (ConnectedRegions8, SelectedRegions10, 'area', 'and', 150952, 500000)
fill_up (SelectedRegions10, RegionFillUp8)
circularity (RegionFillUp8, Circularity8)
area_center (RegionFillUp8, Area8, Row8, Column8)
*讀取現有充電器模型
read_image (Image9, 'D:/充電器驗證集.bmp.tif')
rgb1_to_gray (Image9, GrayImage9)
threshold (GrayImage9, Regions9, 113, 255)
connection (Regions9, ConnectedRegions9)
select_shape (ConnectedRegions9, SelectedRegions11, 'area', 'and', 787619, 1e+006)
fill_up (SelectedRegions11, RegionFillUp9)
circularity (RegionFillUp9, Circularity9)
area_center (RegionFillUp9, Area9, Row9, Column9)

*區分時,將現有瓶蓋物體特征輸入
FeatureVector8:=real([Circularity8,Area8])
classify_class_gmm (GMMHandle, FeatureVector8, 1, ClassID, ClassProb, Density, KSigmaProb)
 *分類后顯示瓶蓋類目名稱
dev_display (Image8)
disp_message (WindowHandle, '類別:'+ClassNum[ClassID], 'window', 0,0, 'black', 'true')
stop ()

*區分時,將現有充電器物體特征輸入
FeatureVector9:=real([Circularity9,Area9])
classify_class_gmm (GMMHandle, FeatureVector9, 1, ClassID, ClassProb, Density, KSigmaProb)
dev_display (Image9)
disp_message (WindowHandle, '類別:'+ClassNum[ClassID], 'window', 0,0, 'black', 'true')

*清除分類器,釋放內容
clear_class_gmm (GMMHandle) 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM