引言
機(jī)器視覺(jué)中缺陷檢測(cè)分為一下幾種:
-
blob分析+特征
-
模板匹配(定位)+差分
-
光度立體:halcon——缺陷檢測(cè)常用方法總結(jié)(光度立體)
-
特征訓(xùn)練
-
測(cè)量擬合
-
頻域+空間域結(jié)合:halcon——缺陷檢測(cè)常用方法總結(jié)(頻域空間域結(jié)合)
本篇主要總結(jié)一下缺陷檢測(cè)中的定位+差分的方法。即用形狀匹配,局部變形匹配去定位然后用差異模型去檢測(cè)缺陷。
模板匹配(定位)+差分
整體思路(形狀匹配):
-
先定位模板區(qū)域后,求得模板區(qū)域的坐標(biāo),創(chuàng)建物品的形狀模板create_shape_model,注意把模板的旋轉(zhuǎn)角度改為rad(0)和rad(360)。
-
匹配模板find_shape_model時(shí),由于物品的缺陷使形狀有局部的改變,所以要把MinScore設(shè)置小一點(diǎn),否則匹配不到模板。并求得匹配項(xiàng)的坐標(biāo)。
-
關(guān)鍵的一步,將模板區(qū)域仿射變換到匹配成功的區(qū)域。由于差集運(yùn)算是在相同的區(qū)域內(nèi)作用的,所以必須把模板區(qū)域轉(zhuǎn)換到匹配項(xiàng)的區(qū)域。
-
之后求差集,根據(jù)差集部分的面積判斷該物品是否有缺陷。
模板匹配(定位)+差分的方法主要用來(lái)檢測(cè)物品損壞,凸起,破洞,缺失,以及質(zhì)量檢測(cè)等。
halcon例程分析:
1.印刷質(zhì)量缺陷檢測(cè)(print_check.hdev)
該例程用到了差異模型,將一個(gè)或多個(gè)圖像同一個(gè)理想圖像做對(duì)比,去找到明顯的不同。進(jìn)而鑒定出有缺陷的物體。差異模型的優(yōu)勢(shì)是可以直接通過(guò)它們的灰度值做比較,并且通過(guò)差異圖像,比較可以被空間地加權(quán)。
變化模型檢測(cè)缺陷的整體思路:
-
create_variation_model —— 創(chuàng)建一個(gè)差異模型
-
get_variation_model —— 獲得差異模型
-
train_variation_model —— 訓(xùn)練差異模型
-
prepare_variation_model —— 準(zhǔn)備差異模型
-
compare_variation_model —— 比較模型與實(shí)例
-
clear_variation_model —— 清除差異模型
dev_update_off ()
選擇第1張圖像創(chuàng)建形狀模板
read_image (Image, 'pen/pen-01')
get_image_size (Image, Width, Height)
dev_close_window ()
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
set_display_font (WindowHandle, 16, 'mono', 'true', 'false')
dev_set_color ('red')
dev_display (Image)
把我感興趣的區(qū)域摳出來(lái),原則上范圍越小越好,因?yàn)檫@樣創(chuàng)建模板時(shí)干擾會(huì)少很多
threshold (Image, Region, 100, 255)
fill_up (Region, RegionFillUp)
difference (RegionFillUp, Region, RegionDifference)
shape_trans (RegionDifference, RegionTrans, 'convex')
dilation_circle (RegionTrans, RegionDilation, 8.5)
reduce_domain (Image, RegionDilation, ImageReduced)
inspect_shape_model (ImageReduced, ModelImages, ModelRegions, 1, 20)
gen_contours_skeleton_xld (ModelRegions, Model, 1, 'filter')
獲得摳圖區(qū)域的中心,這是參考點(diǎn)
area_center (RegionDilation, Area, RowRef, ColumnRef)
創(chuàng)建形狀模板
create_shape_model (ImageReduced, 5, rad(-10), rad(20), 'auto', 'none', 'use_polarity', 20, 10, ShapeModelID)* 創(chuàng)建變化模型(用于和缺陷比較)
create_variation_model (Width, Height, 'byte', 'standard', VariationModelID)
文件夾中前15張圖片是質(zhì)量良好的,可以用來(lái)訓(xùn)練模板
for I := 1 to 15 by 1
read_image (Image, 'pen/pen-' + I$'02d')
先尋找模板的實(shí)例
find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
if (|Score| == 1)
使用仿射變換,將當(dāng)前圖像平移旋轉(zhuǎn)到與模板圖像重合,注意是當(dāng)前圖像轉(zhuǎn)向模板圖像
vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
訓(xùn)練差異模型
train_variation_model (ImageTrans, VariationModelID)
dev_display (ImageTrans)
dev_display (Model)
endif
endfor
獲得差異模型
get_variation_model (MeanImage, VarImage, VariationModelID)
做檢測(cè)之前可以先用下面這個(gè)算子對(duì)可變模型進(jìn)行設(shè)參,這是一個(gè)經(jīng)驗(yàn)值,需要調(diào)試者調(diào)整
prepare_variation_model (VariationModelID, 20, 3)
dev_set_draw ('margin')
NumImages := 30
可變模板訓(xùn)練完成后,我們終于可以進(jìn)入主題,馬上對(duì)所有圖像進(jìn)行缺陷檢測(cè),思想就是差分
for I := 1 to 30 by 1
read_image (Image, 'pen/pen-' + I$'02d')
要注意做差分的兩幅圖像分辨率相同,當(dāng)然也需要通過(guò)仿射變換把待檢測(cè)的圖像轉(zhuǎn)到與模板圖像重合
先尋找模板的實(shí)例
find_shape_model (Image, ShapeModelID, rad(-10), rad(20), 0.5, 1, 0.5, 'least_squares', 0, 0.9, Row, Column, Angle, Score)
if (|Score| == 1)
使用仿射變換,將當(dāng)前圖像平移旋轉(zhuǎn)到與模板圖像重合,注意是當(dāng)前圖像轉(zhuǎn)向模板圖像
vector_angle_to_rigid (Row, Column, Angle, RowRef, ColumnRef, 0, HomMat2D)
affine_trans_image (Image, ImageTrans, HomMat2D, 'constant', 'false')
摳圖
reduce_domain (ImageTrans, RegionDilation, ImageReduced)
差分 (就是檢查兩幅圖像相減,剩下的區(qū)域就是不同的地方了,與模板圖像不同的地方就是缺陷)
這里可不能用difference做差分啊,halcon為變形模板提供了專(zhuān)門(mén)的差分算子:compare_variation_model
compare_variation_model (ImageReduced, RegionDiff, VariationModelID)
connection (RegionDiff, ConnectedRegions)
特征選擇:用一些特征來(lái)判斷這幅圖像印刷是否有缺陷,這里使用面積
其實(shí)可以考慮利用區(qū)域面積的大小來(lái)判斷缺陷的嚴(yán)重程度,這里就不過(guò)多討論了
select_shape (ConnectedRegions, RegionsError, 'area', 'and', 20, 1000000)
count_obj (RegionsError, NumError)
dev_clear_window ()
dev_display (ImageTrans)
dev_set_color ('red')
dev_display (RegionsError)
set_tposition (WindowHandle, 20, 20)
if (NumError == 0)
dev_set_color ('green')
write_string (WindowHandle, 'Clip OK')
else
dev_set_color ('red')
write_string (WindowHandle, 'Clip not OK')
endif
endif
if (I < NumImages)
disp_continue_message (WindowHandle, 'black', 'true')
stop ()
endif
endfor
結(jié)語(yǔ):如果發(fā)現(xiàn)前面作為訓(xùn)練變形模板的良好圖像也被判定為NG,
*可以調(diào)整prepare_variation_model參數(shù)
*或者調(diào)整select_shape特征篩選的標(biāo)準(zhǔn)
相關(guān)算子分析:
-
create_variation_model(創(chuàng)建一個(gè)差異模型)
create_variation_model(Width, Height, Type, Mode ,ModelID)
//創(chuàng)建一個(gè)ID為ModelID,寬為Width,高為Height,類(lèi)型為T(mén)ype的差異模型參數(shù)
參數(shù)Mode決定了創(chuàng)建標(biāo)準(zhǔn)圖像和相應(yīng)的變化圖像的方法。(可選三種方法)
-
'standard'表示標(biāo)準(zhǔn)的訓(xùn)練方法,標(biāo)準(zhǔn)圖像的位置是各訓(xùn)練圖像位置的平均,
-
'robust'表示魯棒的訓(xùn)練方法,標(biāo)準(zhǔn)圖像的位置是各訓(xùn)練圖像的中值,此模式在訓(xùn)練圖像中可能存在ERROR時(shí)使用,
-
'direct'表示標(biāo)準(zhǔn)圖像由單張圖像經(jīng)過(guò)處理得到,由此方法得到的標(biāo)準(zhǔn)圖像只能應(yīng)用prepare_direct_variation_model算子得到variation model。
-
get_variation_model(獲得差異模型)
get_variation_model(Image, VarImage ,ModelID )
//返回差異模型中的標(biāo)準(zhǔn)圖像(Image)和差異圖像(VarImage),此算子主要用來(lái)檢視創(chuàng)建的差異模型是否OK。
train_variation_model(訓(xùn)練差異模型)
train_variation_model(Images, ModelID )
prepare_variation_model(準(zhǔn)備差異模型)
prepare_variation_model( : : ModelID, AbsThreshold, VarThreshold : ) //設(shè)置variation model(差異模型)的絕對(duì)閾值和相對(duì)閾值。 //絕對(duì)閾值即待檢測(cè)圖像與標(biāo)準(zhǔn)圖像的差值, //相對(duì)閾值即待檢測(cè)圖像與variation model與VarThreshold乘積的差值。
compare_variation_model(比較模型與實(shí)例)
compare_variation_model(Image : Region : ModelID : ) //待檢測(cè)圖像與variation model進(jìn)行比較,超過(guò)閾值的區(qū)域在Rgion參數(shù)中返回。 同threshold一樣,返回的區(qū)域被看做一個(gè)區(qū)域,可以使用connection算子進(jìn)行連通性分析,然后根據(jù)區(qū)域的特征(如面積)對(duì)區(qū)域進(jìn)行選擇。
總結(jié):
差異模型(Variation Model)使用標(biāo)準(zhǔn)圖像與待檢測(cè)圖像灰度值相比較,來(lái)判斷產(chǎn)品是否OK,適用于印刷品檢測(cè)及產(chǎn)品表面檢測(cè)。
從實(shí)際算法過(guò)程可以看出,此檢測(cè)實(shí)際可分為兩部分:
對(duì)于圖像中的大面積灰度一致區(qū)域,主要利用待檢測(cè)圖像與標(biāo)準(zhǔn)圖像(ideal image)比較得出差異區(qū)域,對(duì)于圖像中的邊緣位置(edges)區(qū)域,主要利用待檢測(cè)圖像與Variation圖像(variation image)比較得出差異區(qū)域。
所以在實(shí)際應(yīng)用中,應(yīng)根據(jù)實(shí)際情況設(shè)置AbsThreshold和VarThreshold的值。
2,檢測(cè)工件孔洞毛刺缺陷 - 局部變形匹配(inspect_gasket_local_deformable.hdev)
在日常工程應(yīng)用中,我們通常通過(guò)halcon的形狀匹配(shape-based matching)進(jìn)行各種定位,正如上篇例程,當(dāng)待匹配物體有輕微變形時(shí),并不影響得到的匹配結(jié)果,然后當(dāng)待匹配物體有較大變形時(shí),如塑料產(chǎn)品在成形時(shí)變形、紡織產(chǎn)品的花紋因?yàn)轳薨欁冃蔚?,要想得到精確的定位結(jié)果就顯得捉襟見(jiàn)肘,如下圖所示,工件如果有較大變形,在用形狀匹配時(shí),定位結(jié)果就不盡如人意,因?yàn)樾螤钇ヅ浔旧淼玫降钠ヅ浣Y(jié)果只是一個(gè)點(diǎn)(row,col)。
因此本篇例程使用了局部變形匹配(local deformable matching),匹配結(jié)果可以根據(jù)待匹配物體自動(dòng)進(jìn)行變形。而且在這個(gè)案例中,create_variation_model (Width, Height, ‘byte’, ‘direct’, VariationModelID)使用的方法是’direct’,因此是不需要訓(xùn)練差異模型而可以直接使用的。
1、讀入標(biāo)準(zhǔn)圖像,創(chuàng)建差異模型以及匹配模板
1.讀入圖像
dev_update_off ()
dev_get_window (WindowHandle)
set_display_font (WindowHandle, 36, 'mono', 'true', 'false')
dev_set_draw ('margin')
read_image (ModelImage, 'gasket/gasket_model')
get_image_size (ModelImage, Width, Height)
read_image (Image, 'gasket/gasket_01')
*2.創(chuàng)建差異模型
create_variation_model (Width, Height, 'byte', 'direct', VariationModelID)
sobel_amp (ModelImage, EdgeAmplitude, 'sum_abs', 3)
*3.直接設(shè)參數(shù)+標(biāo)準(zhǔn)圖像+邊緣幅度圖像
prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 20, 2)
*4.創(chuàng)建局部變形匹配模板
create_local_deformable_model (ModelImage, 'auto', [], [], 'auto', 0.9, [], 'auto', 0.9, [], 'auto', 'none', 'use_polarity', 'auto', 'auto', [], [], ModelID)
get_deformable_model_contours (ModelContours, ModelID, 1)
area_center (ModelImage, Area, Row, Column)
標(biāo)準(zhǔn)圖像:
這里由于是用單幅圖像創(chuàng)建的差異模型,因此參數(shù)Mode設(shè)置的’direct’,故不需要再去訓(xùn)練,而是直接使用prepare_direct_variation_model (ModelImage, EdgeAmplitude, VariationModelID, 20, 2)得到差異模型。
通過(guò)匹配模板將待檢測(cè)工件定位矯正
for Index := 1 to 7 by 1
read_image (Image, 'gasket/gasket_' + Index$'02')
get_image_size (Image, Width1, Height1)
*5.查找
find_local_deformable_model (Image, ImageRectified, VectorField, DeformedContours, ModelID, rad(-10), rad(20), 1, 1, 1, 1, 0.93, 1, 0.7, 0, 0.4, ['image_rectified','vector_field','deformed_contours'], ['deformation_smoothness','expand_border','subpixel'], [25,0,1], Score, Row, Column)
if (|Score| > 0)
gen_warped_mesh_region (VectorField, MeshRegion, 25)
gen_region_contour_xld (DeformedContours, EdgeRegion, 'margin')
dilation_circle (EdgeRegion, RegionDilation, 2 * 25)
intersection (RegionDilation, MeshRegion, RegionIntersection)
dev_set_line_width (1)
dev_set_color ('yellow')
dev_display (Image)
dev_display (RegionIntersection)
= |Score|
:dev_set_line_width (2)
dev_set_color ('green')
dev_display (DeformedContours)
7.注意:這里顯示的是修正過(guò)的圖像
dev_display (ImageRectified)
endif
待檢測(cè)圖像:
局部變形匹配定位:
由于局部變形模板匹配在尋找到圖像(find_local_deformable_model)后是自動(dòng)矯正的,因此我們可以省掉仿射變換的步驟了。
通過(guò)差異模型差分得到缺陷工件
*6.差分
compare_variation_model (ImageRectified, Region, VariationModelID)
connection (Region, ConnectedRegions)
*缺陷提?。ㄌ卣鬟x擇,即面積大于60的定義為缺陷)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 60, 99999)
count_obj (SelectedRegions, Number)
*顯示
if(Number>0)
disp_message (WindowHandle, 'NG', 'image', 12, 12, 'red', 'false')
else
disp_message (WindowHandle, 'OK', 'window', 12, 12, 'magenta', 'false')
endif
dev_set_color ('red')
dev_display (SelectedRegions)
stop()
endfor
dev_update_on ()
相關(guān)算子分析:
create_local_deformable_model(創(chuàng)建局部變形匹配模板)
create_local_deformable_model(Template , NumLevels, AngleStart, AngleExtent, AngleStep, ScaleRMin, ScaleRMax, ScaleRStep, ScaleCMin,ScaleCMax, ScaleCStep, Optimization, Metric, Contrast, MinContrast, ParamName, ParamValue ,ModelID)
參數(shù)列表:
Template //輸入多通道圖像,用來(lái)創(chuàng)建model
NumLevels //金字塔層數(shù):'auto', 0,1,2,3,。。。
AngleStart //輸入起始角度(默認(rèn)-0.39)
AngleExtent//角度旋轉(zhuǎn)的范圍(默認(rèn)0.79)
AngleStep //旋轉(zhuǎn)的步長(zhǎng),即分辨率,默認(rèn)’auto'
ScaleRMin//行方向的最小縮放比例,默認(rèn)1.0,通常大于0小于1
ScaleRMax//行方向的最大縮放比例,默認(rèn)1.0,通常大于1小于1.5
ScaleRStep//行方向的縮放步長(zhǎng),可影響行方向的分辨率,默認(rèn)'auto', 0.01,0.02,0.05,。。
ScaleCMin//
ScaleCMax// 列方向,同上
ScaleCStep//
Optimization//生成模型時(shí)的優(yōu)化方式,默認(rèn)'none'可選,'auto','point_reduction_XXX'
Metric//比較時(shí)候的標(biāo)準(zhǔn),默認(rèn)'use_polarity'使用極坐標(biāo)系進(jìn)行比較
Contrast//在模板圖片的濾波或者磁滯濾波中,控制結(jié)果的對(duì)比度,默認(rèn)'auto', 10, 20....
MinContrast//在搜尋對(duì)象過(guò)程中的最小對(duì)比度,默認(rèn)'auto', 1, 2, 3, 5....
ParamName// 普通參數(shù)名字(不太清楚用途,后續(xù)研究)默認(rèn)[], 'min_size','part_size'
ParamValue//參數(shù)值, 默認(rèn)[], 可選'small', 'medium', big'
ModelID// 輸出的模型handle
變形檢測(cè)用來(lái)檢測(cè)一個(gè)對(duì)象是否局部變形,這個(gè)檢測(cè)模型在保持嚴(yán)格的基礎(chǔ)上允許一些細(xì)小的變形,和find_shape_model(在圖中找到相應(yīng)圖形的最佳匹配)不同,create_local_deformable_model更加智能化,它可以預(yù)估變形程度并且修正圖像中物體的位置(物體相對(duì)于圖像的相對(duì)位置),它可以處理更大的變形。
get_deformable_model_contours(得到局部變形模板的輪廓)
get_deformable_model_contours( ModelContours , ModelID, Level ) //Level決定了返回第幾層金字塔圖像的邊緣
find_local_deformable_model (在待匹配圖像中尋找變形模板)
find_local_deformable_model(Image ,ImageRectified, VectorField, DeformedContours : ModelID, AngleStart, AngleExtent, ScaleRMin, ScaleRMax, ScaleCMin, ScaleCMax, MinScore, NumMatches, MaxOverlap, NumLevels, Greediness, ResultType, ParamName, ParamValue : Score, Row, Column)
參數(shù)列表:
Image //輸入待匹配圖像
ImageRectified //輸出匹配到的變形矯正后模板圖像
VectorField//變形矢量區(qū)
DeformedContours //匹配到的輪廓,不是矯正后的輪廓
ModelID//模型句柄
AngleStart//起始角度
AngleExtent//角度范圍
ScaleRMin//行縮放最小比例
ScaleRMax//行縮放最大比例
ScaleCMin//
ScaleCMax//列同上
MinScore//最小相似度
NumMatches//需要幾個(gè)最佳匹配結(jié)果
MaxOverlap//最大重疊數(shù)
NumLevels//金字塔層數(shù)
Greediness//貪婪度(范圍0-1,0表示精確緩慢,1表示迅速精度不高)
ResultType//輸出的結(jié)果類(lèi)型([], 'deformed_contours', 'image_rectified', 'vector_field')
ParamName//參數(shù)名稱(chēng)
Score//輸出匹配度
Row, Column//輸出行列坐標(biāo)
這個(gè)函數(shù)的功能是在一張圖片中找到變形模型中的最佳匹配結(jié)果(可以是多個(gè),由NumMatches輸入),模型必須在之前的步驟中使用(create_local_deformable_model或者read_deformable_model)生成。這個(gè)函數(shù)會(huì)返回找到的結(jié)果的行,列坐標(biāo)(Row, Column)作為輸出。
另外函數(shù)在找到匹配的模型后,輸出矯正后的圖像(ImageRectified),向量區(qū)域(VectorField)和匹配到的輪廓(DeformedContours)通過(guò)參數(shù)ResultType去選擇需要返回哪個(gè)(默認(rèn)[],都不返回)。
ParamName可以調(diào)整參數(shù)的設(shè)置:
-
deformation_smoothness:平滑的度,對(duì)于變形越大參數(shù)越大
-
expand_border:擴(kuò)大ImageRecfified VectorField 區(qū)域
gen_warped_mesh(生成變形網(wǎng)格,封裝函數(shù))
-
機(jī)器視覺(jué)
+關(guān)注
關(guān)注
161文章
4369瀏覽量
120278 -
模板
+關(guān)注
關(guān)注
0文章
108瀏覽量
20560 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5500瀏覽量
121111
原文標(biāo)題:模板變形后如何進(jìn)行缺陷檢測(cè)
文章出處:【微信號(hào):vision263com,微信公眾號(hào):新機(jī)器視覺(jué)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論