Halcon 傅里葉變換應用


傅里葉變換

  一個恰當的比喻是將傅里葉變換比作一個玻璃棱鏡。棱鏡是可以將光分解為不同顏色的物理儀器,每個成分的顏色由波長(或頻率)來決定。

  傅里葉變換可以看做數學上的棱鏡,將函數基於頻率分解為不同的成分。當我們考慮關時,討論它的光譜或頻率譜。同樣,傅里葉變換使我們能夠通過頻率成分來分析一個函數。

  圖像的頻率是表征圖像中灰度變化劇烈程度的指標,是灰度在平面空間上的梯度。

  傅里葉變換在圖像處理中可以做到圖像增強與圖像去噪、圖像分割之邊緣檢測、圖像特征提取、圖像壓縮等。

  如果對一幅精細的圖像使用低通濾波器,那么濾波后的結果就只剩下輪廓了。

  高頻成分:圖像細節紋理屬於高頻分量,是圖像灰度值變化劇烈的部分。

  低頻成分:圖像背景與輪廓屬於低頻分量,是圖像灰度值變化緩慢的部分。

  低通濾波器:gen_lowpass 對空間域圖像進行平滑處理,抑制高頻分量。

  高通濾波器:gen_highpass 對空間域圖像進行銳化處理,抑制低頻分量。

  帶通濾波器:gen_bandpass 使圖像在某一部分的頻率信息通過,其他過高或過低的頻率信息抑制。

  帶阻濾波器:使圖像過低或過高的頻率信息通過,某一部分頻率信息抑制。

 

相關算子

gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )
* 在頻域產生一個高斯濾波器
* 2.高斯分布在濾波器主方向上的空間域標准差,Sigma越大,高斯濾波器的頻帶就越寬,對圖像平滑程度越高。
* 3.垂直於濾波器主方向的高斯分布在空間域的標准差。
* 4.濾波器在空間域的主要方向
* 5.濾波器的歸一化因子。'n' 避免在FFT中歸一化
* 6.直流項在頻域的位置。
* 如果使用fft_generic,可以使用'dc_edge'來提高效率。
* 如果使用fft_image和fft_image_inv進行濾波,則必須使用Norm = 'none'和Mode = 'dc_center'* 如果使用rft_generic,則必須使用Mode = 'rft'
derivate_gauss (Image, ImageGauss, 3, 'none')
* 將一個圖像與高斯函數的導數進行卷積。效果與FFT進行高斯濾波差不多。
主要的區別是邊界處理:FFT的定義假設信號是周期性的,因此邊界處理是循環的延續。與此相反,derivate_gauss在圖像邊界使用灰度值的鏡像。
通過FFT進行過濾的速度已經快於在Sigma=3(排除創建過濾器的時間)中使用derivate_gauss。這種優勢隨着Simag的增大而變得更加明顯。    
'none' 僅使用平滑
'x' 沿X的一階導數    
gen_derivative_filter (DerivativeFilter, 'x', 1, 'n', 'rft', Width, Height)
* 在頻域內產生一個導數濾波器,導數過濾器沒有使用任何平滑
* 還要注意的是,不經過平滑處理的導數計算通常不會返回有用的結果,因為噪聲會被顯著放大。
gen_sin_bandpass (ImageBandpass, 0.4, 'none', 'rft', Width, Height)
* 生成一個正弦形狀的帶通濾波器
2.濾波器與直流項的最大距離
3.濾波器的歸一化因子
4.直流項在頻域的位置
5.圖像寬度
6.圖像高度
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
* 計算圖像的實值快速傅里葉變換。在正向轉換(Direction = 'to_freq')中,ResultType必須設置為'complex'* 3.'to_freq',輸入圖像必須具有實值類型,即,復雜圖像不可用作輸入。支持所有可以轉換為real類型的圖像的圖像類型。在這種情況下,輸出是一個維數(w/2+1)*h的復雜圖像,其中w和h是輸入圖像的寬度和高度。指數-1* 'from_freq',輸入圖像必須是復雜的。在這種情況下,輸入圖像的大小不足以確定輸出圖像的大小。這必須通過將寬度設置為一個有效值來實現,必須為輸入復像寬度的2*w-2或2*w-1。指數1。
* 4.變換的歸一化因子。用戶必須確保參數的一致使用。這意味着用於正向和反向轉換的歸一化因子相乘時必須產生w*h。
* 5.輸出圖像的圖像類型。
fft_generic(Image : ImageFFT : Direction, Exponent, Norm, Mode, ResultType : )
* 計算輸入圖像的快速傅里葉變換圖像。
1.輸入圖像
2.傅里葉轉換圖像
3.正向轉換還是反向轉換 'to_freq' 'from_freq'
4.指數的符號. 正向轉換-1,反向轉換1
5.轉換歸一化因子.    'n' 'none' 'sqrt'
6.直流項在頻域的位置 'dc_center' 'dc_edge'
7.輸出圖像的類型 'complex' 'byte' 'real' ....
convol_fft (ImageFFT, ImageFilter, ImageConvol)
* 在頻域內對圖像與濾波器進行卷積,將復雜圖像ImageFFT的像素乘以濾波器ImageFilter的相應像素。
首先將圖像在水平(豎直)方向與濾波器進行卷積;然后將卷積后的結果在豎直(水平)方向使用相同的濾波器函數得到的模板進行卷積運算。
gray_range_rect (ImageFiltered, ImageResult, 10, 10)
* 確定矩形內的灰度值范圍,每個圖像點在掩膜矩形內的最大和最小灰度值的差值(max - min),掩膜為奇數(偶數-1)
correlation_fft (ImageFFT, ImageFFT, ImageCorrelation)
* 計算兩個圖像在頻域的相關性
* 將ImageFFT1與ImageFFT2的共軛復數相乘,計算相關系數。
* 需要注意的是,為了在空間域實現相關性的正確縮放。
* 前向轉換必須使用帶Norm = 'none'的fft_generic或rft_generic操作符。
* 反向轉換必須使用帶Norm = 'n'的fft_generic或rft_generic操作符。
* 例程中使用local_max_sub_pix檢測時前向和反向用的都是'n'
local_max_sub_pix (ImageFFTInv, 'gauss', 3, 0.0001, Row, Column)
* 圖像局部極大值的亞像素精確檢測。 1.輸入亞像素圖像
2.偏導數的計算方法 'facet','gauss'
3.'gauss'情況下Sigma確定高斯核的大小
4.海森矩陣特征值的最小絕對值。當海森矩陣的特征值都小於-閾值時,一個點被認為是局部最大值。
5.檢測到的極大值的行坐標
6.檢測到的極大值的列坐標
power_real (ImageFFT, PowerSpectrum)
* 計算complex圖像的功率譜(頻率的模),結果圖像為real類型
binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
* 二項式濾波器是一個非常好的近似高斯濾波器,可以非常有效地實現只用整數操作。因此,binomial_filter非常快。

 

應用快速傅里葉變換處理圖像

1.使用實值傅里葉變換圖像與組合高斯濾波器卷積,計算濾波圖像的灰度值范圍gray_range_rect,通過灰度閾值檢測塑料表面小凹點。

 

2.檢測模糊圖像中的不均衡缺陷,使用實值傅里葉變換圖像與高斯濾波器進行卷積,轉換成空間域后將原圖像與濾波后圖像進行sub_image求差值,得到清晰的缺陷圖,應用lines_gauss提取線條。

 

 3.在高紋理圖像中檢測不均衡缺陷,從原始圖像減去預估的背景光照,使得缺陷變得更明顯(實值傅里葉變換+高斯濾波器卷積+圖像相減)

接着使用中值濾波平滑紋理,通過閾值從圖像中提取流域盆地,對盆地區域計算共現矩陣,得出其灰度值特征(灰度能量值),利用能量值篩選缺陷,缺陷對應的暗斑能量非常低。

 

 

 

 4.利用頻域內的自相關(correlation_fft)技術,通過檢測自相關圖像中極大值(local_max_sub_pix)的子像素精確位置來確定單個模具的位置。

 

 

 5.實值傅里葉變換計算參考圖像與檢測圖像的頻域自相關,得到網格與參考圖像相差的旋轉角度。

* 首先,使用參考圖像(旋轉角度為0°)創建邊緣方向的參考頻譜。
* 通過將任意旋轉網格邊緣方向的頻譜與參考頻譜相關聯,可以確定網格的旋轉角度。
* 計算反向傅里葉變換后圖像的灰度值get_grayval
* 根據灰度值創建函數create_funct_1d_array
* 計算函數的局部最大值和最小值local_min_max_funct_1d
* 返回函數在局部最大值位置的Y值get_y_value_funct_1d 
* 獲取最大Y值對應的局部最大值,該值-1再乘以2即是角度。Angle := 2 * (InnerMaxPos[MaxPosAbs] - 1)

 

 6.快速傅里葉轉換頻域圖,生成濾波器消除頻域圖垂直方向的干擾,反向傅里葉變換得到消除干擾后的圖像。

fft_generic(Image,ImageFFT,'to_freq',-1,'sqrt','dc_center','complex')

gen_rectangle1 (Rectangle1, 0, Width/2-2, Height/2-10, Width/2+2)
gen_rectangle1 (Rectangle2, Height/2+10, Width/2-2, Height, Width/2+2)
union2 (Rectangle1, Rectangle2, RegionUnion)

paint_region (RegionUnion, ImageFFT, ImageResult, 0, 'fill')
fft_generic(ImageResult,ImageFFT,'from_freq',1,'sqrt','dc_center','byte')

 

 6.在不均勻照明的表面檢測缺陷(划痕),創建一個合適的正弦帶通濾波器。然后通過在頻域進行濾波來增強划痕。最后,對增強缺陷進行形態學后處理。

 7.在頻域濾波下從干擾背景紋理中分離前景信息。

* 首先,對圖像進行快速傅里葉變換fft_generic以獲得其頻譜power_real。
* 然后,我們在頻譜中檢測干擾背景紋理對應的頻率峰值。
* 然后,建立一個濾除這些頻率的濾波器,並應用於頻譜。
* 通過對濾波后的頻譜進行反向傅里葉變換,得到去除背景紋理的濾波圖像。

8.消除周期性噪聲

包含周期性噪聲的圖像在傅里葉變換后的頻域圖像有多個中心(亮點),表現為高能量點。

消除這些不在頻域圖像中心的其他小亮點,就是在空間域中消除周期性噪聲。

 

read_image (zouqi,'zouqi.jpg')
dev_open_window (0, 520, Width, Height, 'black', WindowHandle1)
rgb1_to_gray (zouqi, zouqi)
fft_image (zouqi, ImageFFT4)
power_real (ImageFFT4, PowerSpectrum)
*二項式濾波(配合功率譜算子)
binomial_filter (PowerSpectrum, ImageSmooth, 9, 9)
*閾值化獲得高能量點
threshold (ImageSmooth, Region, 100, 1800)
connection (Region, ConnectedRegions)
select_shape (ConnectedRegions, SelectedRegions, 'area', 'and', 5, 100)
union1 (SelectedRegions, RegionUnion)
*獲得區域內圖像域
reduce_domain (ImageSmooth, RegionUnion, ImageReduced)
*獲得局部極大值
local_max (ImageReduced, LocalMaxima1)
*膨脹處理區域
dilation_circle (LocalMaxima1, RegionDilation, 9)
*在傅里葉變換中繪制對應區域的灰度值為0
paint_region (RegionDilation, ImageFFT4, ImageFFTFiltered, 0, 'fill')
*傅里葉逆轉換,獲得去除周期噪聲所在區域的頻率后的圖像
fft_generic (ImageFFTFiltered, ImageFiltered, 'from_freq', 1, 'sqrt', 'dc_center', 'byte')

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM