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