在Halcon的rft變換中,我們經常可以看到這樣的算子組合:
rft_generic (Image, ImageFFT2, 'to_freq', 'none', 'complex', Width)
convol_fft (ImageFFT2, ImageFilter, ImageConvol2)
rft_generic (ImageConvol2, ImageFiltered2, 'from_freq', 'n', 'real', Width)
這個很容易理解,即將圖片從空間域轉到頻域,然后做一次卷積計算,最后從頻域轉回空間域。
最簡單的高斯濾波器是這樣構造的:(其中,Width, Height是圖片的寬、高)
sigma :=2
gen_gauss_filter (ImageFilter, sigma, sigma, 0.0, 'none', 'rft', Width, Height)
有時候我們還會看到更復雜的高斯濾波器構造,舉例如下:
1 read_image (Image, 'C:/Users/happy xia/Desktop/lena.png') 2 get_image_size (Image, Width, Height) 3 4 GenGaussFilter (ImageFilter, 7, 30, Width, Height) 5 6 sigma :=2 7 * gen_gauss_filter (ImageFilter, sigma, sigma, 0.0, 'none', 'rft', Width, Height) 8 9 rft_generic (Image, ImageFFT2, 'to_freq', 'none', 'complex', Width) 10 convol_fft (ImageFFT2, ImageFilter, ImageConvol2) 11 rft_generic (ImageConvol2, ImageFiltered2, 'from_freq', 'n', 'real', Width) 12 * gray_range_rect (ImageFiltered2, ImageFiltered2, 11, 11) 13 * invert_image (ImageFiltered2, ImageFiltered2) 14 dev_display (ImageFiltered2) 15 min_max_gray (Image, ImageFiltered2, 0, Min, Max, Range) 16 intensity (Image, ImageFiltered2, Mean, Deviation) 17 disp_message (3600, 'Min:' + Min + ' ' +'Max:' + Max +' '+ 'Mean:' + Mean, 'image', 12, 12, 'red', 'true') 18 dump_window (3600, 'png', 'halcon_dump')
其中,函數GenGaussFilter 是這樣的:
1 gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height) 2 gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height) 3 sub_image (GaussFilter1, GaussFilter2, ImageFilter, 1, 0) 4 return ()
ImageFilter濾波器是通過一個高斯濾波器減去另一個高斯濾波器得到的,這又是什么意思呢?
我從Photoshop的高斯模糊和高反差保留濾鏡中得到了啟發。
我本人熟悉Photoshop的用法,Photoshop是一款商業圖像處理設計軟件。
事實上,下式就是一個高斯低通濾波器,即高斯模糊:
sigma :=2 gen_gauss_filter (ImageFilter, sigma, sigma, 0.0, 'none', 'rft', Width, Height)
當sigma = 2時,只是稍微模糊圖片,當sigma = 10時,則有強烈的模糊效果,這和Photoshop中的高斯模糊是一致的。
當sigma = 10時,Halcon程序跑出來的結果是:(跟Photoshop做出的效果對比,模糊程度類似,僅僅是對比度強一些)
再來看看Photoshop的高反差保留濾鏡(濾鏡——其它——高反差保留):
高反差保留濾鏡的意思是:在圖像中顏色過渡明顯(邊緣)的地方,保留指定半徑內的邊緣細節,並隱藏圖像的其它部分,值越大保留的原圖像素越多。
當參數“半徑”很小的時候,只保留高頻部分(邊緣),當“半徑”逐漸增大時,保留高頻和中頻部分,當“半徑”值極大時,中高低頻都得到保留。
並且可以證明:高反差保留 + 高斯模糊 = 原始圖像。
而對於函數GenGaussFilter 設計的濾波器ImageFilter來說:它同時兼有高反差保留和高斯模糊的特性。
1 gen_gauss_filter (GaussFilter1, Sigma1, Sigma1, 0.0, 'none', 'rft', Width, Height)
2 gen_gauss_filter (GaussFilter2, Sigma2, Sigma2, 0.0, 'none', 'rft', Width, Height) 3 sub_image (GaussFilter1, GaussFilter2, ImageFilter, 1, 0) 4 return ()
對於函數GenGaussFilter (ImageFilter, 7, 30, Width, Height)來說,可以近似理解為先對圖像進行值為30的高反差保留,然后對圖像進行值為7的高斯模糊。注意:較大的值為高反差保留的值,較小的值為高斯模糊的值,跟7或30的順序無關。
如果順序是:GenGaussFilter (ImageFilter, 30, 7, Width, Height),結果圖像其實只是反相的關系,這可以對結果圖像執行invert_image反相算子來驗證。
當這樣取值時:
GenGaussFilter (ImageFilter, 0, 1, Width, Height)
此時相當於僅進行了值為1的高反差保留,邊緣棱角分明,而低頻區域幾乎沒有任何細節。
當這樣取值時:
GenGaussFilter (ImageFilter, 0, 10, Width, Height)
此時,臉部、肩部等低頻區域(光滑的區域)細節都出來了一部分。
如果我們把值改成:
GenGaussFilter (ImageFilter, 2, 10, Width, Height)
此時圖像又被模糊了。相當於在原先的基礎上,疊加了一個值為2的高斯模糊效果。
通過上面的分析,我們知道了,高斯模糊是一個低通濾波器,而高反差保留是一個高通濾波器。GenGaussFilter (ImageFilter, 2, 10, Width, Height)則是一個帶通濾波器(或者說“帶阻濾波器”)——先通過高反差保留讓中高頻通過,然后通過高斯模糊抑制高頻,最終的結果是讓中頻通過。
當然,如果較大的那個值很大時,例如GenGaussFilter (ImageFilter, 2, 210, Width, Height),則是先讓中高低頻都通過,然后抑制高頻,結果是讓中低頻通過。
這樣設計的濾波器通常可以用來做紋理缺陷檢測(同時抑制高頻和低頻,從而找出缺陷)。
對於濾波器GenGaussFilter (ImageFilter, sigma1, sigma2, Width, Height)和最終轉回到空間域的圖像來說,本人研究出以下結論:
1、結果圖像的均值接近於0,亮的是正值,暗的是負值;
2、調換濾波器中的兩個數字,相當於對結果圖像反相;
3、大的數字相當於高反差保留,小的數字相當於高斯模糊;
4、大的數字非常大的時候,四周可能會出現暗角(未嚴格驗證);
5、大的數字取到合適的值的時候,可以消除待測物起伏不平整的影響(起伏不平整的地方通常頻率不是特別高);
6、檢測缺陷異常時,小的數字,即高斯模糊的值以剛好模糊掉紋理為佳。