傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)
文章目錄
- 簡(jiǎn)介
- 程序解析
- 處理結(jié)果預(yù)覽
- 算法講解
簡(jiǎn)介
detect_indent_fft.hdev是halcon的示例程序,是傅里葉變換進(jìn)行缺陷檢測(cè)的一個(gè)例子,主要是傅里葉變換在復(fù)雜背景下的缺陷檢測(cè)。
這個(gè)程序展示了如何利用快速傅里葉變換(FFT)對(duì)塑料制品的表面進(jìn)行缺陷檢測(cè),大致分為三步:
1、用高斯濾波器構(gòu)造一個(gè)合適的濾波器(將原圖通過(guò)高斯濾波器濾波);
2、將原圖和構(gòu)造的濾波器進(jìn)行快速傅里葉變換;
3、利用形態(tài)學(xué)進(jìn)行缺陷檢測(cè)。
程序解析
關(guān)于顯示類函數(shù)解釋https://blog.csdn.net/cashmood/article/details/93999690
dev_updata_off()
dev_close_window() //關(guān)閉活動(dòng)的圖像窗口
讀入圖片
read_image(Image,’plastics/plastics_01’)
獲取圖片的長(zhǎng)寬
//參數(shù)說(shuō)明:讀入的圖片(Image); 圖片的寬(Width);圖片的高(Height)
get_image_size(Image,Width,height)
dev_open_window(0,0,Width,Height,’Black’,WindowHandle)
設(shè)置顯示字體
set_display_font (WindowHandle,14,’mono’,’ture’,’false’)
dev_set_draw(‘Margin’)
dev_set_line_width(3)
dev_set_color(’red’)
(根據(jù)圖像大小進(jìn)行fft速度最優(yōu)化)
對(duì)指定大小的圖片的fft速度進(jìn)行優(yōu)化
//參數(shù)說(shuō)明:圖片大小(Width,Height);優(yōu)化模式(’standard’);
optimize_rft_speed(Width,Height,’standard’)
(結(jié)合兩個(gè)高斯濾波器構(gòu)造一個(gè)合適的濾波器)
定義兩個(gè)常量
Sigma1 := 10.0 Sigma2 := 3.0
在頻域生成兩個(gè)高斯濾波器
//參數(shù)說(shuō)明:生成的高斯濾波器(GaussFilter); 空域中高斯在主方向上的標(biāo)準(zhǔn)差(Sigma); 空域中高斯在正交于主方向的方向上的標(biāo)準(zhǔn)差(Sigma);濾波器主方向的角度(0.0); 濾波器的規(guī)范(’none’);直流項(xiàng)在頻域的位置(’rft’);圖片的大小(Width,Height)
gen_gauss_filter(GaussFilter1,Sigma1,Sigma1,0.0,’none’,’rft’,Width,Height)
gen_gauss_filter(GaussFilter2,Sigma2,Sigma2,0.0,’none’,’rft’,Width,Height) //
兩圖片相減生成一個(gè)帶通低頻濾波器
//函數(shù)原型以及運(yùn)算公式: sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
//g’ := (g1 - g2) * Mult + Add
sub_image(GaussFilter1,GaussFilter2,Filter,1,0) //兩圖片相減(灰度)
(開(kāi)始進(jìn)行圖像檢測(cè))
NumImages := 11
for循環(huán)從1到NumImages,步長(zhǎng)為1
for Index := 1 to NumImages by 1
read_image(Image,’plastics/plastics_’+Index$’02’)
將圖片轉(zhuǎn)化為灰度圖,第一個(gè)參數(shù)為原圖
rgb1_to_gray(Image,Image)
*Perform the convolution in the frequency domain
對(duì)一幅圖片進(jìn)行快速傅里葉變換
//參數(shù)說(shuō)明:輸入的圖片(Image);傅里葉變換后輸出的圖片(ImageFFT);變換方向(’to_freq’或’from_freq’);變換因子的規(guī)范(’none’);輸出圖片的數(shù)據(jù)類型(’complex’);圖片的寬(Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)
圖片用一個(gè)濾波器在頻域進(jìn)行卷積運(yùn)算
//參數(shù)說(shuō)明:輸入的圖片(ImageFFT);頻域?yàn)V波器(Filter);運(yùn)算后輸出的結(jié)果
convol_fft(ImageFFT,Filter,ImageConvol) //對(duì)圖片用一個(gè)濾波器在頻域進(jìn)行卷積運(yùn)算
對(duì)濾波后的圖片進(jìn)行快速傅里葉反變換
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)
用一個(gè)矩形掩膜計(jì)算像素點(diǎn)的灰度范圍
//參數(shù)說(shuō)明:輸入的圖片(ImageFiltered); 輸出的灰度范圍圖(ImageResult);矩形掩膜大小(10,10)
灰度范圍計(jì)算方法:矩形掩膜內(nèi)的最大灰度值-最小灰度值
gray_range_rect(ImageFiltered,ImageResult,10,10)
求圖片灰度值的最大和最小值和變換范圍
//參數(shù)說(shuō)明:待分析圖片區(qū)域(ImageResult); 圖片(ImageResult);被去除的直方圖兩邊像素點(diǎn)所;占總像素?cái)?shù)的百分比(0);得到的最小值最大值及灰度值范圍(Min,Max,Range)
min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判斷區(qū)域內(nèi)灰度值的最大和最小值
利用全局閾值對(duì)圖像進(jìn)行分割
//參數(shù)說(shuō)明:輸入的圖片(ImageResult);分割后得到的區(qū)域(RegionDynThresh);閾值(max([5.55,Max0.8]),255);公式:MinGray <= g <= MaxGray
threshold(ImageResult,RegionDynThresh,max([5.55,Max0.8]),255)//
分割連通域
//參數(shù)說(shuō)明:輸入的區(qū)域(RegionDynThresh);分割連通域后的區(qū)域(ConnectedRegions)
connection(RegionDynThresh,ConnectedRegions)
根據(jù)面積篩選區(qū)域
select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)
合并區(qū)域
union1(SelectedRegions,RegionUnion)
使用圓形元素對(duì)區(qū)域進(jìn)行閉運(yùn)算
closeing_circle(RegionUnion,RegionClosing,10)
分割連通域
connection(RegionClosing,ConnectedRegions1)
根據(jù)面積篩選區(qū)域
select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)
計(jì)算區(qū)域的面積以及中心位置
area_center(SelectedRegions1,Area,Row,Column)
顯示結(jié)果
dev_display(Image)
定義一個(gè)變量統(tǒng)計(jì)區(qū)域的個(gè)數(shù)
//參數(shù)說(shuō)明:在halcon中“||”代表求數(shù)組內(nèi)元素的個(gè)數(shù)
Number := |Area|
判斷是否存在缺陷區(qū)域
if(Number)
如果存在缺陷區(qū)域,畫(huà)出缺陷區(qū)域
gen_circle_contour_xld(ContCircle,Row,Column,gen_tuple_const(Number,30),gen_tuple_const(Number,0), gen_tuple_const(Number,rad(360)),’positive’,1)ResultMessage := [‘Not OK’,Number + ‘defect(s) found’]Color := [‘red’,’black’]dev_display(ContCircle) else ResultMessage := ‘OK’Color := ‘forest green’ 如果不存在缺陷區(qū)域,顯示OK
endif
endfor
處理結(jié)果預(yù)覽
算法講解
在實(shí)際的表面缺陷檢測(cè)系統(tǒng)中,針對(duì)的檢測(cè)表面很多是具有一定紋理的比如:布匹、皮革、塑料等,針對(duì)這一類表面的檢測(cè)就不能單純依靠幀差或者背景差來(lái)完成,因?yàn)楸尘暗募y理不可能和當(dāng)前圖像的紋理完全相同。因此,本例程的算法通過(guò)將圖像變換到頻域進(jìn)行處理,提取缺陷分量后反變換到時(shí)域,獲得缺陷的具體位置。
在本算法中,在一開(kāi)始就構(gòu)造了兩個(gè)高斯濾波器,高斯濾波器是一種線性平滑濾波器,適用于消除高斯噪聲。濾波器的實(shí)質(zhì)是對(duì)信號(hào)進(jìn)行濾波,濾除不需要的部分,得到想要的部分。一個(gè)低通的濾波器可以濾除高頻信號(hào),對(duì)于圖像來(lái)說(shuō),噪聲和邊緣往往集中在高頻分量,因此低通能夠降噪,但是也能造成圖像的模糊。
關(guān)鍵就是使用兩個(gè)低通濾波器,進(jìn)行相減后構(gòu)造了一個(gè)帶阻濾波器來(lái)提取缺陷分量。這就需要保證在實(shí)際的待檢測(cè)表面中缺陷所處的頻率范圍要和背景以及噪聲有明顯的差異,并且?guī)ё璧念l率選擇要合適。通過(guò)帶阻濾波后獲得的頻率成分對(duì)背景中的紋理要有明顯的抑制,并且突出缺陷成分,進(jìn)行傅里葉反變換后重構(gòu)的圖像就是缺陷圖像,經(jīng)過(guò)簡(jiǎn)單的分割就能很容易得到缺陷了。
總結(jié)
以上是生活随笔為你收集整理的傅里叶变换进行缺陷检测detect_indent_fft.hdev(源代码与详细解析)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 联想教育应用使用说明(7.6版本号)——
- 下一篇: 疯狂java讲义第六章课后习题答案