halcon的頻域影像處理

QuincyYi發表於2024-09-18

頻率特徵是影像的灰度變化特徵,低頻特徵是灰度變化不明顯,例如影像整體輪廓,高頻特徵是影像灰度變化劇烈,如影像邊緣和噪聲。

一個重要的經驗結論:低頻代表影像整體輪廓,高頻代表了影像噪聲,中頻代表影像邊緣、紋理等細節。什麼時候使用傅立葉變換進行頻域分析?
1、具有一定紋理特徵的影像,紋理可以理解為條紋,如布匹、木板、紙張等材質容易出現。
2、需要提取對比度低或者訊雜比低的特徵。
3、影像尺寸較大或者需要與大尺寸濾波器進行計算,此時轉換至頻域計算,具有速度優勢。因為空間域濾波為卷積過程(加權求和),頻域計算直接相乘。
在halcon中,使用頻域進行檢測,有兩個步驟是比較關鍵的:①生成合適的濾波器;②空間域和頻域之間的轉換。
1、高通濾波法

影像中的邊緣或細條等細節部分與影像頻譜的高頻分量相對應,因此採用高通濾波讓高頻分量順利透過,使影像的邊緣或細條等細節變得清楚,實現影像的銳化。高通濾波可用空頻法或頻域法來實現。在空間域是用卷積方法,與空域低通濾波的鄰域平均法類似,不過其中的衝激響應方陣H不同。

  • gen_gauss_filter— 在頻域生成高斯濾波器
gen_gauss_filter( : ImageGauss : Sigma1, Sigma2, Phi, Norm, Mode, Width, Height : )

引數:
ImageGauss(out) :生成的濾波器影像
Sigma1:空域(畫素域)中,高斯分佈在濾波器主方向的標準差
Sigma2:空域(畫素域)中,高斯分佈在垂直於濾波器主方向的標準差。注:Sigma1和Sigma2確定空間域內高斯函式的平滑量
Phi:濾波器在空間域的主要方向
Norm:濾波器的歸一化因子。注:如果使用fft_image和fft_image_inv進行過濾,必須設定引數Norm = 'none’和Mode = ‘dc_center’(本文未使用)
Mode:頻率圖中心位置。注: 如果使用實值快速傅立葉變換運算元rft_generic, 則Mode = ‘rft’ ;如果使用快速傅立葉變換運算元fft_generic,則可以使用Mode = 'dc_edge’來提高效率
Width, Heigh:生成濾波影像的寬、高
原理:首先產生一個高斯核,然後根據輸入的引數對這個高斯核矩陣做傅立葉變換(實現從空域或時域到頻域的轉換工具),得到特定模式和特定解析度的所謂頻域的濾波器,例如我要進行rft_generic的變換,那麼我的高斯濾波器模式就要寫為‘rft’。並透過設定引數保持頻域濾波器和原影像一致。

  • rft_generic— 計算影像的實值快速傅立葉變換,一般需要使用兩次,因為在頻域處理完之後,還需要轉換成空間域。
rft_generic(Image : ImageFFT : Direction, Norm, ResultType, Width : ) 

引數:
Image:輸入影像
ImageFFT(out) :傅立葉變換輸入影像
Direction:計算正向或反向變換。‘to_freq’是空間域—>頻域的變換,ResultType一般選擇’complex’;‘from_freq’是頻域—>空間域的變換,ResultType一般選擇’byte’(灰度影像)。
Norm:變換的歸一化因子
ResultType:輸出影像的影像型別,配合Direction引數設定
Width :輸入影像的寬度

原理:其實gen_gauss_filter得到的濾波器,就是一個影像,雖然是頻域濾波器,但是單純看物理意義,他就是一個影像。與時域空間卷積核的物理意義是相同的。對這幅頻域圖進行卷積(卷積過程與時域無差別),卷積之後影像就產生了變化,比如外環得到減弱,內環得到保留(高低通濾波器的效果),或者在某個方向上得到保留(gabor濾波器的效果),再還原到時域,發現跟原圖變化很大。

  • convol_fft— 在頻域用濾波器對影像進行卷積
convol_fft(ImageFFT, ImageFilter : ImageConvol : : ) 

原理:將複合影像ImageFFT的畫素乘以濾波影像濾波器的對應畫素。

效果:

read_image (Image, 'C:/Users/Administrator/Desktop/1.png')
get_image_size (Image, Width, Height)
*在頻域中生成高斯濾波器
gen_gauss_filter (ImageGauss, 100, 100, 0, 'n', 'rft', Width, Height)
*對影像進行傅立葉變換
rft_generic (Image, ImageFFT, 'to_freq', 'none', 'complex', Width)
*對傅立葉影像做卷積,使用之前建立的高斯濾波器作為卷積核
convol_fft (ImageFFT, ImageGauss, ImageConvol)
*將卷積後的傅立葉影像還原為空間域影像。可見影像的突變部分得到了增強
rft_generic (ImageConvol, ImageFFT1, 'from_freq', 'none', 'byte', Width)
sub_image (Image, ImageFFT1, ImageSub, 5, 100)
*對影像進行縮放,一般影像特別大的時候,縮放一下,提取效果會更好
zoom_image_factor (ImageSub, ImageZoomed, 0.4, 0.4, 'constant')
*將影像中的有灰度差異的線條提取出來
lines_gauss (ImageZoomed, Lines1, 0.2, 3, 8, 'light', 'true', 'gaussian', 'true')

注:當影像質量不理想時,提取線條的效果不好時,不妨試試這種方法,親測效果很好。

相關文章