缺陷檢測分類
1.1 標準缺陷檢測
所謂標準,就是不針對行業特點,這里基本分為如下幾類:
標準預處理功能:圖像增強、腐蝕、膨脹、開運算、閉運算、濾波、傅立葉變換(頻域空間域轉換)、距離變換、差分、等
面積檢測:閾值后計算ROI內面積
Blob(閾值分割+特征提取)檢測:閾值聯通后計算Blob
濃度差檢測:計算ROI范圍內的最大濃度、最小濃度、濃度差
直線/曲線上的毛刺/缺陷:擬合直線/曲線,計算邊緣點到直線/曲線距離
標準的做法一般都是拿標準的算法塊進行組合,以達到缺陷檢測的效果,缺陷檢測標準流程一般是:
1設置基準圖模板——>2當前圖模板定位——>3生成仿射變換矩陣——>4旋轉平移圖像或者區域——>5預處理差分——>6預處理濾波/腐蝕/膨脹——>7Blob檢測——>8面積檢測
1.2 非標缺陷檢測(針對行業特性)
相對與標準做法,非標的做法就非常多,有些非標的目的是為了減少操作步驟,例如將上面的組合流程變成一個工具,這個我們稱之為業務邏輯非標。
還有一些非標主要是做圖像預處理部分,例如修改一些標準預處理的算子和預處理流程,將瑕疵提取出來。當然,對數學理論掌握程度較高的朋友,會推導理論公式,然后直接實現數學公式達到檢測效果。
2. 行業難點
傳統算法檢測缺陷:調試難度大,容易在檢測不穩定情況下反復調參,且復雜缺陷誤測多,兼容性差
機器學習檢測缺陷:一般使用類似MLP的一些單層神經網絡,對缺陷特征進行訓練分類,該方法需要事先提取出缺陷部分,一般用來與傳統分割法搭配使用,達到缺陷檢測分類的效果。
深度學習檢測缺陷(打標簽):一般需要客戶提供大量的缺陷樣本,而且缺陷種類越多、特征越不明顯,需要的缺陷樣本就越大。其次,打標簽過程很難做到自動,需要手動輔助框出缺陷位置,工作量非常大。總結就是訓練周期久,訓練樣本大,如果客戶可以提供大量樣本,那該方法是首選(半導體行業一般不會出現大量缺陷樣品)
深度學習檢測缺陷(遷移學習法):該方法我感覺會成為后面工業領域檢測瑕疵的一個大趨勢,但是需要一些公司去收集各種行業的缺陷類型圖片和訓練的網絡模型,并共享出來(突然感覺是個商機,就看誰能抓住了),然后我們可以使用遷移學習的方法學習別人訓練好的模型。
3. 常規缺陷檢測算法(Halcon)
總的來說,缺陷檢測的算法包括:
Blob分析+特征提取(常用,較簡單)
定位(Blob定位、模板匹配定位)+ 差分(常用)
光度立體
特征訓練
測量擬合(常用)
頻域+空間域結合(常用)
深度學習
3.1 差分法
標準缺陷檢測我覺得用差分法還是蠻多的。顧名思義,差分就是通過對兩幅圖像或和兩個區域作差,來找出其中有差異的區域。處理流程基本就是定位Blob分析+差分或模板匹配+差分的方式,主要用來檢測物品損壞,凸起,破洞,缺失,以及質量檢測等。兩種方式的具體流程如下:
3.1.1 blob分析+差分
檢測流程如下:
讀取圖像
對圖像進行Blob分析,提取圖像上的Roi檢測區域
在對Roi區域直接進行差分處理或者與沒有缺陷的圖像進行差分處理
ps:這里差分包含區域差分和圖像差分兩種方式。
最后求差集,根據差集部分的面積判斷該物品是否有缺陷
流程解析:以標準圖像中的灰度值為模板,計算處檢測圖像的灰度值,并與標準圖像作差,灰度值差異越大,則證明檢測圖像中存在與標準圖比有明顯灰度變化的區域,即這部分區域就是我們所要篩選出的缺陷區域。
示例分析:提取灰度值明顯的缺陷區域
*1.使用`intensity()`算子計算出模板圖(即標準圖,圖1)的檢測區域圖像的灰度平均值`OriginalMean`
intensity(OriginalRegion, ImageReduced1, OriginalMean, Deviation1)
*2.再`intensity()`算子計算出待測圖(圖2)的檢測區域圖像的灰度平均值`DetectMean`,計算出兩幅圖像灰度均值的差值
intensity (DetectRegion, ImageReduced2, DetectMean, Deviation2)
tuple_abs (OriginalMean-DetectMean, Abs)
*3.
*如果兩個區域的灰度值差值大于10(if(Abs>10)),則生成一副圖像(圖3),其灰度值為模板圖中計算得到的的平均灰度值;
*如果兩個區域的灰度值差值小于10(if(Abs<10)),則生成一副圖像(圖3),其灰度值為待測圖中計算得到的的平均灰度值。
*ps:這里計算結果是差值小于10,也就是檢測圖的灰度值差異和模板圖差異不大,直接生成一個后者的灰度均值圖像
if(Abs>10)
gen_image_proto (ImageReduced2, ImageCleared, OriginalMean)
else
gen_image_proto (ImageReduced2, ImageCleared, DetectMean)
endif
reduce_domain (ImageCleared, RegionDifference, ImageReduced1)
*4.將待測圖與新生成的灰度值圖像做差值(圖4),可以找到待測圖和模板圖灰度值有差異的區域
abs_diff_image (ImageReduced2, ImageReduced1, ImageAbsDiff, 1)
invert_image (ImageAbsDiff, ImageInvert)
threshold (ImageInvert, Region1, 0, 30)
opening_circle (Region1, RegionOpening, 1.5)
connection (RegionOpening, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 10, 99999)
檢測效果如下:
沒理解的,再列舉一些Halcon中的差分例程練練手:
1.檢測毛刺(Blob+差分法)—— fin.hdev
2.電路板線路缺陷檢測(Blob+差分法)—— pcb_inspection.hdev
3.瓶口破損缺陷檢測(Blob+差分法)—— inspect_bottle_mouth.hdev(注意直角坐標系和極坐標系之間的轉換)
3.1.2 模板匹配+差分
流程如下:
先定位模板區域后,求得模板區域的坐標,創建物品的形狀模板create_shape_model,注意把模板的旋轉角度改為rad(0)和rad(360)
匹配模板find_shape_model時,由于物品的缺陷使形狀有局部的改變,所以要把MinScore設置小一點,否則匹配不到模板。并求得匹配項的坐標
關鍵的一步,將模板區域仿射變換到匹配成功的區域。由于差集運算是在相同的區域內作用的,所以必須把模板區域轉換到匹配項的區域
最后求差集,根據差集部分的面積判斷該物品是否有缺陷
示例分析:印刷質量缺陷檢測(可變現模板匹配+差分法)—— print_check.hdev
ps:里面沒用difference做差分,而是用了Halcon為變形模板提供的專門的差分算子:compare_variation_model();
3.1.3 兩種檢測方式對比
Blob分析適用于需要整張圖都是Roi區域或圖像某處Roi區域通過預處理很容易提取出來的情況。而Blob分析沒辦法定位到圖像R區域的時候就需要用到模板匹配了,通過模板匹配(形狀匹配或局部變形匹配)定位到圖像Roi區域,然后用差異模型去檢測缺陷,可以理解為模板匹配 + 差分是Blob分析 + 差分的進階版,比較容易處理的可以交給兒子Blob分析處理,難的話爸爸模板匹配上。
3.2 頻域+空間結合法
3.2.1 傅里葉變換理論
傅里葉變換是一種函數在空間域和頻率域的變換,從空間域到頻率域的變換是傅里葉變換,而從頻率域到空間域是傅里葉的反變換。
時域與頻域:
頻域(frequency domain)
是指在對函數或信號進行分析時,分析其和頻率有關部份,而不是和時間有關的部份,和時域一詞相對。
時域(空間域)
是描述數學函數或物理信號對時間的關系。例如一個信號的時域波形可以表達信號隨著時間的變化。若考慮離散時間,時域中的函數或信號,在各個離散時間點的數值均為已知。若考慮連續時間,則函數或信號在任意時間的數值均為已知。在研究時域的信號時,常會用示波器將信號轉換為其時域的波形。
兩者相互間的變換
時域(信號對時間的函數)和頻域(信號對頻率的函數)的變換在數學上是通過積分變換實現。對周期信號可以直接使用傅立葉變換,對非周期信號則要進行周期擴展,使用拉普拉斯變換。
信號在頻率域的表現:
在頻域中,頻率越大說明原始信號 變化速度越快;頻率越小說明原始信號越平緩。當頻率為0時,表示直流信號,沒有變化。因此,頻率的大小反應了信號的變化快慢。高頻分量解釋信號的突變部分,而低頻分量決定信號的整體形象。
在圖像處理中,頻率反應了圖像在空域灰度變化劇烈程度,也就是圖像灰度的變化速度,也就是圖像的梯度大小。對圖像而言,圖像的邊緣部分是突變部分,變化較快,因此反應在頻域上是高頻分量;圖像的噪聲大部分情況下是高頻部分;圖像平緩變化部分則為低頻分量。也就是說,傅立葉變換提供另外一個角度來觀察圖像, 可以將圖像從灰度分布轉化到頻率分布上來觀察圖像的特征。書面一點說就是,傅里葉變換提供了一條從空域到頻率自由轉換的途徑。對圖像處理而言,以下概念非常的重要。
由布布丶全權冠名的“ 第一屆圖像杯拳王挑戰錦標賽 "`正式開始,有請:
高頻代表隊參賽選手:噪聲、細節和邊緣
圖像高頻分量:圖像突變部分,在某些情況下指圖像邊緣信息,某些情況下指噪聲,更多是兩者的混合。
低頻代表隊參賽選手:圖像整體輪廓
圖像低頻分量:圖像(亮度/灰度)變化平緩的部分,代表著那是連續漸變的一塊區域,這部分就是低頻。對于一幅圖像來說,除去高頻的就是低頻了,也就是邊緣以內的內容為低頻,而邊緣內的內容就是圖像的大部分信息,即圖像的大致概貌和輪廓,是圖像的近似信息。
親高頻派裁判代表:高通濾波器 —— 讓圖像高頻分量通過,抑制低頻分量。
親低頻派裁判代表:低通濾波器 —— 與高通相反,讓圖像低頻分量通過,抑制高頻分量。
鐵面無私裁判代表:帶通濾波器 —— 使圖像在某一部分的頻率信息通過,其他過低或過高都抑制。
左右逢源裁判代表:帶阻濾波器,是帶通的反。
加強理解:圖像噪聲一般是白點或者黑點,因為它與正常的點顏色不一樣了,也就是說該像素點灰度值明顯不一樣了,也就是灰度有快速地變化了,所以是高頻部分;圖像細節處也是屬于灰度值急劇變化的區域,正是因為灰度值的急劇變化,才會出現細節,也屬于高頻部分;所以一般會對信號先進行低通濾波處理,即過濾掉圖像中的高頻部分(噪聲/細節/邊緣),留下低頻(圖像輪廓),結果就是圖像模糊了。
ps:圖像處理中,有書上說低頻反應輪廓,高頻反應細節;有的文章里面說低頻反應的是背景,高頻反應的是邊緣;低頻反應輪廓,這里的輪廓指的不是邊緣(很多人會搞混覺得輪廓是指的就是邊緣),打個比方,近視眼的人摘了眼鏡,人們通常會說:“我什么也看不清,僅僅能看到一個大致輪廓。”就是類似的意思。所以圖像的邊緣提取仍是提起的邊緣的高頻信息,這兩種說法并不矛盾。
總結:低頻代表圖像整體輪廓,高頻代表了圖像噪聲、邊緣和細節,中頻代表圖像紋理等。
3.2.2 應用場景
使用傅里葉變換進行頻域分析的應用場景:
具有一定紋理特征的圖像,紋理可以理解為條紋,如布匹、木板、紙張等材質容易出現。
需要提取對比度低或者信噪比低的特征。
圖像尺寸較大或者需要與大尺寸濾波器進行計算,此時轉換至頻域計算,具有速度優勢。因為空間域濾波為卷積過程(加權求和),頻域計算直接相乘。
3.2.3 核心檢測算子
在Halcon中,使用頻域進行檢測的思路是先從空間域到頻域,在頻域中進行適當濾波,選擇自己想要的頻段,然后再返回到空間域中去,其中有兩個步驟是比較關鍵的:
1. 生成合適的濾波器
對應的關鍵算子:
gen_std_bandpass
gen_sin_bandpass
*創建一個高斯濾波器,sigma越小濾波器越小,通過的信號更加的集中在低頻,這樣做的目的是得到背景
gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )(常用)
gen_mean_filter
gen_derivative_filter
gen_bandpass
gen_bandfilter
gen_highpass
gen_lowpass
2. 快速傅里葉變換(空間域和頻域之間的相互轉換)
對應的關鍵算子:
fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType : )
rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : )
兩個算子共同點:
這兩個算子都可以進行空間域—>頻域,頻域—>空間域的變換,只需要針對參數Direction分別進行選擇,參數'to_freq'是進行的是空間域—>頻域的變換,'from_freq'是頻域—>空間域的變換
針對參數ResultType,如果是to_freq',那么ResultType一般選擇'complex';如果是'from_freq',ResultType一般選擇’byte’(灰度圖像)。
兩個算子不同點:
fft_generic:DC項在頻域中的位置可選在左上角(Mode:'dc_edge')或者原點平移到中心(Mode:'dc_center')
rft_generic:沒有設置項Mode,原點在默認在左上角。
除此之外,fft_image:也可進行快速傅里葉變化(空間域到頻域),等價于fft_generic(Image,ImageFFT,‘to_freq’,-1,‘sqrt’,‘dc_center’,‘complex’)
3.2.4 相關實際檢測案例
塑料制品的表面進行缺陷檢測 —— detect_indent_fft.hdev
* 1.對指定大小的圖片的fft速度進行優化
optimize_rft_speed (Width, Height, 'standard')
Sigma1 := 10.0
Sigma2 := 3.0
* 2.構造兩個高斯濾波器,ps:Sigma參數的選取很重要
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height)
* 兩圖片相減(灰度)
sub_image (GaussFilter1, GaussFilter2, Filter, 1.025, 0)
NumImages := 16
for Index := 1 to NumImages by 1
read_image (Image, 'plastics/plastics_' + Index$'02')
rgb1_to_gray (Image, Image)
* 3.計算一個圖像的實值快速傅里葉變換(空間域轉至頻域)
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 4.用在頻域內的濾波器使一個圖像卷積。
convol_fft (ImageFFT, Filter, ImageConvol)
* 5.卷積后的頻域圖像轉至空間域
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
* 6.濾波之后的圖像交給形態學來分析
* 空間域上的blob圖像分割
*原圖矩形內的灰度值范圍(max-min)作為輸出圖像像素值,擴大了亮的部分
gray_range_rect (ImageFiltered, ImageResult, 10, 10)
* 獲得圖像最大灰度值和最小灰度值
min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
*二值化提取( 5.55是經驗值,在調試中得到)
threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
select_shape (RegionDynThresh, SelectedRegions, 'area', 'and', 1, 99999)
對于處理這種細微的缺陷,也可使用頻域處理。該例程的關鍵就是使用兩個低通濾波器,進行相減后構造了一個帶阻濾波器(先通過高反差保留讓中高頻通過,然后通過高斯模糊抑制高頻,最終的結果是讓中頻通過)來提取缺陷分量。
此外,Halcon中關于傅里葉變換的例程還有:detect_mura_defects_texture.hdev
檢測布料表面劃痕
* 將測試圖像轉化為單通道的灰度圖像
rgb1_to_gray (Image, ImageGray)
* 1.創建一個高斯濾波器,用于將傅里葉轉換后的圖像進行濾波
gen_gauss_filter (GaussFilter, 3.0, 3.0, 0.0, 'none', 'rft', Width, Height)
* 對灰度圖像進行顏色反轉
invert_image (ImageGray, ImageInvert)
* 2.對反轉后的圖像進行傅里葉變換
rft_generic (ImageInvert, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 3.對傅里葉圖像做卷積,使用之前創建的高斯濾波器作為卷積核
convol_fft (ImageFFT, GaussFilter, ImageConvol)
* 4.將卷積后的傅里葉圖像還原為空間域圖像。可見圖像的突變部分得到了增強
rft_generic (ImageConvol, ImageFiltered, 'from_freq', 'n', 'real', Width)
* 5.設置提取線條的參數,將圖像中的有灰度差異的線條提取出來
calculate_lines_gauss_parameters (17, [25,3], Sigma, Low, High)
lines_gauss (ImageFiltered, Lines, Sigma, Low, High, 'dark', 'true', 'gaussian', 'true')
木板劃痕檢測
dev_update_off ()
dev_close_window ()
read_image (Image, '缺陷檢測木板劃痕提取.jpg')
* 1.彩色轉灰度圖
count_channels (Image, Channels)
if (Channels == 3 or Channels == 4)
rgb1_to_gray (Image, Image)
endif
get_image_size (Image, Width, Height)
dev_open_window_fit_size (0, 0, Width, Height, -1, -1, WindowHandle)
dev_display (Image)
* 2.傅里葉變換去背景
fft_generic (Image, ImageFFT, 'to_freq', -1, 'sqrt', 'dc_center', 'complex')
gen_rectangle2 (Rectangle1, 308.5, 176.56, rad(-0), 179.4, 7.725)
gen_rectangle2 (Rectangle2, 306.955, 175, rad(-90), 180.765, 4.68)
union2 (Rectangle1, Rectangle2, UnionRectangle)
paint_region (UnionRectangle, ImageFFT, ImageResult, 0, 'fill')
fft_generic (ImageResult, ImageFFT1, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')
* 3.提取劃痕
threshold (ImageFFT1, Regions, 5, 240)
connection (Regions, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 20, 99999)
union1 (SelectedRegions, RegionUnion)
dilation_rectangle1 (RegionUnion, RegionDilation, 5, 5)
connection (RegionDilation, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, ['width','height'], 'and', [30,15], [150,100])
dilation_rectangle1 (SelectedRegions1, RegionDilation1, 11, 11)
union1 (RegionDilation1, RegionUnion1)
skeleton (RegionUnion1, Skeleton)
* 4.顯示
dev_set_color ('red')
dev_display (Image)
dev_display (Skeleton)
審核編輯:劉清
-
神經網絡
+關注
關注
42文章
4771瀏覽量
100715 -
傅立葉變換
+關注
關注
3文章
105瀏覽量
32381 -
HALCON
+關注
關注
16文章
64瀏覽量
27208 -
ROI
+關注
關注
0文章
14瀏覽量
6233 -
MLP
+關注
關注
0文章
57瀏覽量
4241
原文標題:Halcon視覺:缺陷檢測分類
文章出處:【微信號:gh_a8b121171b08,微信公眾號:機器人及PLC自動化應用】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論