傅里葉變換進行缺陷檢測detect_indent_fft.hdev(源代碼與詳細解析)

簡介

detect_indent_fft.hdev是halcon的示例程序,是傅里葉變換進行缺陷檢測的一個例子,主要是傅里葉變換在複雜背景下的缺陷檢測

這個程序展示瞭如何利用快速傅里葉變換(FFT)對塑料製品的表面進行缺陷檢測,大致分爲三步:

1、用高斯濾波器構造一個合適的濾波器(將原圖通過高斯濾波器濾波);

2、將原圖和構造的濾波器進行快速傅里葉變換;

3、利用形態學進行缺陷檢測。

程序解析

關於顯示類函數解釋https://blog.csdn.net/cashmood/article/details/93999690
dev_updata_off()

dev_close_window() //關閉活動的圖像窗口
讀入圖片
read_image(Image,’plastics/plastics_01’)
獲取圖片的長寬
//參數說明:讀入的圖片(Image); 圖片的寬(Width);圖片的高(Height)
get_image_size(Image,Width,height)

dev_open_window(0,0,Width,Height,’Black’,WindowHandle)
設置顯示字體
set_display_font (WindowHandle,14,’mono’,’ture’,’false’)

dev_set_draw(‘Margin’)

dev_set_line_width(3)

dev_set_color(’red’)

(根據圖像大小進行fft速度最優化)
對指定大小的圖片的fft速度進行優化
//參數說明:圖片大小(Width,Height);優化模式(’standard’);
optimize_rft_speed(Width,Height,’standard’)

(結合兩個高斯濾波器構造一個合適的濾波器)

定義兩個常量
Sigma1 := 10.0 Sigma2 := 3.0

在頻域生成兩個高斯濾波器
//參數說明:生成的高斯濾波器(GaussFilter); 空域中高斯在主方向上的標準差(Sigma); 空域中高斯在正交於主方向的方向上的標準差(Sigma);濾波器主方向的角度(0.0); 濾波器的規範(’none’);直流項在頻域的位置(’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) //

兩圖片相減生成一個帶通低頻濾波器
//函數原型以及運算公式: sub_image(ImageMinuend, ImageSubtrahend : ImageSub : Mult, Add : )
//g’ := (g1 - g2) * Mult + Add

sub_image(GaussFilter1,GaussFilter2,Filter,1,0) //兩圖片相減(灰度)

(開始進行圖像檢測)
NumImages := 11
for循環從1到NumImages,步長爲1
for Index := 1 to NumImages by 1

read_image(Image,’plastics/plastics_’+Index$’02’)

將圖片轉化爲灰度圖,第一個參數爲原圖
rgb1_to_gray(Image,Image)

*Perform the convolution in the frequency domain
對一幅圖片進行快速傅里葉變換
//參數說明:輸入的圖片(Image);傅里葉變換後輸出的圖片(ImageFFT);變換方向(’to_freq’或’from_freq’);變換因子的規範(’none’);輸出圖片的數據類型(’complex’);圖片的寬(Width)
rft_generic(Image,ImageFFT,’to_freq’,’none’,’complex’,Width)

圖片用一個濾波器在頻域進行卷積運算
//參數說明:輸入的圖片(ImageFFT);頻域濾波器(Filter);運算後輸出的結果
convol_fft(ImageFFT,Filter,ImageConvol) //對圖片用一個濾波器在頻域進行卷積運算

對濾波後的圖片進行快速傅里葉反變換
rft_generic(ImageConcol,ImageFiltered,’from_freq’,’n’,’real’,Width)

用一個矩形掩膜計算像素點的灰度範圍
//參數說明:輸入的圖片(ImageFiltered); 輸出的灰度範圍圖(ImageResult);矩形掩膜大小(10,10)
灰度範圍計算方法:矩形掩膜內的最大灰度值-最小灰度值

gray_range_rect(ImageFiltered,ImageResult,10,10)

求圖片灰度值的最大和最小值和變換範圍
//參數說明:待分析圖片區域(ImageResult); 圖片(ImageResult);被去除的直方圖兩邊像素點所;佔總像素數的百分比(0);得到的最小值最大值及灰度值範圍(Min,Max,Range)
min_max_rect(ImageResult,ImageResult,0,Min,Max,Range)//判斷區域內灰度值的最大和最小值

利用全局閾值對圖像進行分割
//參數說明:輸入的圖片(ImageResult);分割後得到的區域(RegionDynThresh);閾值(max([5.55,Max0.8]),255);公式:MinGray <= g <= MaxGray
threshold(ImageResult,RegionDynThresh,max([5.55,Max0.8]),255)//

分割連通域
//參數說明:輸入的區域(RegionDynThresh);分割連通域後的區域(ConnectedRegions)
connection(RegionDynThresh,ConnectedRegions)

根據面積篩選區域
select_shape (ConnectedRegions,SelectedRegions,’area’,’and’,4,99999)

合併區域
union1(SelectedRegions,RegionUnion)

使用圓形元素對區域進行閉運算
closeing_circle(RegionUnion,RegionClosing,10)

分割連通域
connection(RegionClosing,ConnectedRegions1)

根據面積篩選區域
select_shape(ConnectedRegions1,SelectedRegions1,’area’,’and’,10,99999)

計算區域的面積以及中心位置
area_center(SelectedRegions1,Area,Row,Column)

顯示結果

dev_display(Image)

定義一個變量統計區域的個數
//參數說明:在halcon中“||”代表求數組內元素的個數
Number := |Area|

判斷是否存在缺陷區域
if(Number)

如果存在缺陷區域,畫出缺陷區域

	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’

如果不存在缺陷區域,顯示OK
endif

 	 disp_message(WindowHandle,ResultMessage,’window’,12,12,Color,’ture’) if(Index#NumImages)

     disp_continue_message(WindowHandle,’black’,’ture’)

     stop()

  endif

endfor

處理結果預覽

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

算法講解

在實際的表面缺陷檢測系統中,針對的檢測表面很多是具有一定紋理的比如:布匹、皮革、塑料等,針對這一類表面的檢測就不能單純依靠幀差或者背景差來完成,因爲背景的紋理不可能和當前圖像的紋理完全相同。因此,本例程的算法通過將圖像變換到頻域進行處理,提取缺陷分量後反變換到時域,獲得缺陷的具體位置。
在本算法中,在一開始就構造了兩個高斯濾波器,高斯濾波器是一種線性平滑濾波器,適用於消除高斯噪聲。濾波器的實質是對信號進行濾波,濾除不需要的部分,得到想要的部分。一個低通的濾波器可以濾除高頻信號,對於圖像來說,噪聲和邊緣往往集中在高頻分量,因此低通能夠降噪,但是也能造成圖像的模糊。
關鍵就是使用兩個低通濾波器,進行相減後構造了一個帶阻濾波器來提取缺陷分量。這就需要保證在實際的待檢測表面中缺陷所處的頻率範圍要和背景以及噪聲有明顯的差異,並且帶阻的頻率選擇要合適。通過帶阻濾波後獲得的頻率成分對背景中的紋理要有明顯的抑制,並且突出缺陷成分,進行傅里葉反變換後重構的圖像就是缺陷圖像,經過簡單的分割就能很容易得到缺陷了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章