Halcon表面缺陷检测
Halcon表面缺陷檢測
本文章轉載自 link
1* Optimize the fft speed for the specific image size
優化特定圖像大小的FFT速度
optimize_rft_speed( : : Width, Height, Mode : )
optimize_rft_speed (Width, Height, ‘standard’)
//對指定大小的圖片的fft速度進行優化
//Width, Height圖片大小
// Mode 優化模式
((fft(Fast Fourier Transformation),即為快速傅氏變換,是離散傅氏變換(DFT)的快速算法,它是根據離散傅氏變換的奇、偶、虛、實等特性,對離散傅立葉變換的算法進行改進獲得的。)
2* Construct a suitable filter by combining two gaussian
構造兩個濾波器
gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )
sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, ‘none’, ‘rft’, Width, Height)
gen_gauss_filter(GaussFilter2, Sigma2, Sigma2, 0.0, ’none’, ’rft’, Width,Height)
//在頻域生成兩個高斯濾波器
//參數說明: 生成的高斯濾波器(GaussFilter)
// 空域中高斯在主方向上的標準差(Sigma)
// 空域中高斯在正交于主方向的方向上的標準差(Sigma)
// 濾波器主方向的角度(0.0)
// 濾波器的規范(’none’)
// 直流項在頻域的位置(’rft’)
// 圖片的大小(Width,Height)
sub_image(GaussFilter1,GaussFilter2,Filter,1,0)
//兩圖片相減(灰度) 做減法
//sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
//g’ := (g1 - g2) * Mult + Add
//以上為函數原型以及運算公式
(Enhance the scratches by filtering in the frequency domain
在頻域中通過濾波增強劃痕)
3* Perform the convolution in the frequency domain
//在頻域執行卷積
rft_generic (Image, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
convol_fft (ImageFFT, Filter, ImageConvol)
rft_generic (ImageConvol, ImageFiltered, ‘from_freq’, ‘n’, ‘real’, Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)
//對計算一幅圖片實部進行快速傅里葉變換
//參數說明: 輸入的圖片(Image)
// 傅里葉變換后輸出的圖片(ImageFFT)
// 變換方向(’to_freq’或’from_freq’)
// 變換因子的規范(’none’)
// 輸出圖片的數據類型(’complex’)
// 圖片的寬(Width)
convol_fft(ImageFFT,Filter,ImageConvol)
//對圖片用一個濾波器在頻域進行卷積運算
//參數說明: 輸入的圖片(ImageFFT)
// 頻域濾波器(Filter)
// 運算后輸出的結果
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)
//對濾波后的圖片進行傅里葉反變換
4* Process the filtered image
處理已過濾的圖像
gray_range_rect (ImageFiltered, ImageResult, 10, 10)min_max_gray (ImageResult, ImageResult, 0, Min, Max, Range)
gray_range_rect(ImageFiltered,ImageResult,10,10)
//用一個矩形掩膜計算像素點的灰度范圍
//參數說明: 輸入的圖片(ImageFiltered)
// 輸出的灰度范圍圖(ImageResult)
// 矩形掩膜大小(10,10)
min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)
//判斷區域內灰度值的最大和最小值
//參數說明: 待分析圖片區域(ImageResult)
// 圖片(ImageResult)
// 被去除的直方圖兩邊像素點所
// 占總像素數的百分比(0)
// 得到的最小值最大值及灰度值范圍(Min,Max,Range)
threshold (ImageResult, RegionDynThresh, max([5.55,Max * 0.8]), 255)
connection (RegionDynThresh, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, ‘area’, ‘and’, 4, 99999)
union1 (SelectedRegions, RegionUnion)
closing_circle (RegionUnion, RegionClosing, 10)
connection (RegionClosing, ConnectedRegions1)
select_shape (ConnectedRegions1, SelectedRegions1, ‘area’, ‘and’, 10, 99999)
area_center (SelectedRegions1, Area, Row, Column)
例程:detect_indent_fft.hdev
說明:針對的檢測表面很多是具有一定紋理的比如:布匹、皮革、塑料等的針孔瑕疵檢測。
這個程序展示了如何利用快速傅里葉變換(FFT)對塑料制品的表面進行目標(缺陷)的檢測,大致分為三步:
首先,我們用高斯濾波器構造一個合適的濾波器(將原圖通過高斯濾波器濾波);
然后,將原圖和構造的濾波器進行快速傅里葉變換;
最后,利用形態學算子將缺陷表示在濾波后的圖片上(在缺陷上畫圈)。
算法講解:在實際的表面缺陷檢測系統中,針對的檢測表面很多是具有一定紋理的比如:布匹、皮革、塑料等,針對這一類表面的檢測就不能單純依靠幀差或者背景差來完成,因為背景的紋理不可能和當前圖像的紋理完全相同。因此,本例程的算法通過將圖像變換到頻域進行處理,提取缺陷分量后反變換到時域,獲得缺陷的具體位置。
高斯濾波器:在本算法中,在一開始就構造了兩個高斯濾波器,高斯濾波器是一種線性平滑濾波器,適用于消除高斯噪聲。濾波器的實質是對信號進行濾波,濾除不需要的部分,得到想要的部分。一個低通的濾波器可以濾除高頻信號,對于圖像來說,噪聲和邊緣往往集中在高頻分量,因此低通能夠降噪,但是也能造成圖像的模糊。
本文關鍵:本文的關鍵就是使用兩個低通濾波器,進行相減后構造了一個帶阻濾波器來提取缺陷分量。這就需要保證在實際的待檢測表面中缺陷所處的頻率范圍要和背景以及噪聲有明顯的差異,并且帶阻的頻率選擇要合適。通過帶阻濾波后獲得的頻率成分對背景中的紋理要有明顯的抑制,并且突出缺陷成分,進行傅里葉反變換后重構的圖像就是缺陷圖像,經過簡單的分割就能很容易得到缺陷了。
- Enhance the scratches by filtering in the frequency domain
*在頻域中通過濾波增強劃痕
1*構造濾波器
gen_sin_bandpass( : ImageFilter : Frequency, Norm, Mode, Width, Height : )
產生帶正弦形態的帶通濾波器
gen_sin_bandpass (ImageBandpass, 0.4, ‘none’, ‘rft’, Width, Height)
//參數說明: 帶通濾波器(ImageBandpass)
// 濾波器最大距離(0.4)
// 濾波器常規因子 (none)
// 頻率譜中心位置(rft)
// 圖像的寬、高(Width,Height)
3* Perform the convolution in the frequency domain
//在頻域執行卷積
rft_generic (Image, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
convol_fft (ImageFFT, Filter, ImageConvol)
rft_generic (ImageConvol, ImageFiltered, ‘from_freq’, ‘n’, ‘real’, Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)
//對計算一幅圖片實部進行快速傅里葉變換
//參數說明: 輸入的圖片(Image)
// 傅里葉變換后輸出的圖片(ImageFFT)
// 變換方向(’to_freq’或’from_freq’)
// 變換因子的規范(’none’)
// 輸出圖片的數據類型(’complex’)
// 圖片的寬(Width)
convol_fft(ImageFFT,Filter,ImageConvol)
//對圖片用一個濾波器在頻域進行卷積運算
//參數說明: 輸入的圖片(ImageFFT)
// 頻域濾波器(Filter)
// 運算后輸出的結果
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)
//對濾波后的圖片進行傅里葉反變換
這個例子是檢查劃痕的,感覺是金屬表面劃痕
calculate_lines_gauss_parameters( : : MaxLineWidth, Contrast : Sigma, Low, High)
?
1*將圖片RGB圖像分為GRG三個通道的圖像
decompose3(MultiChannelImage : Image1, Image2, Image3 : : )
decompose3 (Image, R, G, B)
2*
gen_gauss_filter (ImageGauss, 100, 100, 0, ‘n’, ‘rft’, Width, Height)
生成高斯濾波器
‘n’=’none’
(Enhance the scratches by filtering in the frequency domain
在頻域中通過濾波增強劃痕)
- Perform the convolution in the frequency domain
//在頻域執行卷積
rft_generic (Image, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
convol_fft (ImageFFT, Filter, ImageConvol)
rft_generic (ImageConvol, ImageFiltered, ‘from_freq’, ‘n’, ‘real’, Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)
//對計算一幅圖片實部進行快速傅里葉變換
//參數說明: 輸入的圖片(Image)
// 傅里葉變換后輸出的圖片(ImageFFT)
// 變換方向(’to_freq’或’from_freq’)
// 變換因子的規范(’none’)
// 輸出圖片的數據類型(’complex’)
// 圖片的寬(Width)
convol_fft(ImageFFT,Filter,ImageConvol)
//對圖片用一個濾波器在頻域進行卷積運算
//參數說明: 輸入的圖片(ImageFFT)
// 頻域濾波器(Filter)
// 運算后輸出的結果
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)
//對濾波后的圖片進行傅里葉反變換
sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
sub_image (B, ImageFFT1, ImageSub, 2, 100)
//兩幅圖片做減法
zoom_image_factor(Image : ImageZoomed : ScaleWidth, ScaleHeight, Interpolation : )
zoom_image_factor (ImageSub, ImageZoomed, ScaleFactor, ScaleFactor, ‘constant’)
//將圖片按照給定的圖像比例進行縮放
在模糊圖像中
印痕/水痕 一類的缺陷檢測
在高紋理物體上做缺陷檢測
get_image_size (Image, Width, Height)
gen_gauss_filter (ImageGauss, 50, 50, 0, ‘n’, ‘rft’, Width, Height)
rft_generic (Image, ImageFFT, ‘to_freq’, ‘none’, ‘complex’, Width)
convol_fft (ImageFFT, ImageGauss, ImageConvol)
rft_generic (ImageConvol, IlluminationImage, ‘from_freq’, ‘none’, ‘byte’, Width)
sub_image (B, ImageFFT1, ImageSub, 2, 100)
(Sng 返回返回參數的正負。語法Sgn(number), number 參數是任何有效的數值表達式。返回值如果數字大于0,則Sgn 返回1,數字等于0,則返回0,數字小于0,則返回-1,數字參數的符號決定了Sgn 函數的返回值。)
- median filter smooths out the fine texture, simplifying the following * segmentation and final detection of defects
*中值濾波平滑的質地優良,簡化如下
*缺陷的分割和最終檢測
median_image (ImageSub, ImageMedian, ‘circle’, 9, ‘mirrored’)
watersheds_threshold (ImageMedian, Basins, 20)
后期尋找:
cooc_feature_image (Basins, ImageMedian, 6, 0, Energy, Correlation, Homogeneity, Contrast)
tuple_find (sgn(Energy - 0.05), -1, Indices)
select_obj (Basins, Defects, Indices + 1)
總結
以上是生活随笔為你收集整理的Halcon表面缺陷检测的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2 年前端面试心路历程(字节跳动、YY、
- 下一篇: 彻底理解 Window 和 Window