勇哥注:
图片过滤器是一切缺陷检测、边缘提取、图片分割前处理、分类器应用等等的基础。有很重要的研究意义。
因此勇哥会写成一个系列贴子以和大家一起分享。
-正文---------------------------------------------------------------------
本篇引自halcon的一个例程,讲述了guided_filter,bilateral_filter,anisotropic_diffusion三个滤波器的对比。
为啥要把这三个滤波器放在一起对比呢?
因为它们都属于边缘保持(Edge-perserving)滤波器,本来还应该有最小二乘滤波(WLS),但是halcon中找不到它。
bilateral_filter 双边滤波器,在本系列第2篇已经讲过,见:
http://www.skcircle.com/?id=1557
http://www.skcircle.com/?id=1659
guided_filter 导向滤波器,其原理说明见: http://www.skcircle.com/?id=1662
anisotropic_diffusion 各向异性扩散滤波器,其原理说明见: http://www.skcircle.com/?id=1663
下面来看看程序的执行结果:
下面三张为上面应用三种过滤器后效果的局部放大图,以观察细节。
执行时间统计
换一张图片继续测试。
从这里可以看到,三种过滤器的耗时跟图片纹理的复杂度有关系。
* 这个例子程序展示了如何使用各向异性扩散来平滑图像,同时保留或增强不同程度的边缘信息。 * * 准备可视化 dev_close_window () dev_open_window (0, 0, 512, 512, 'black', WindowHandle) dev_set_part (0, 0, 511, 511) set_display_font (WindowHandle, 16, 'mono', 'true', 'false') dev_clear_window () Methods := ['\'guided_filter\'','\'bilateral_filter\'','\'anisotropic_diffusion\''] Message := 'Compare different methods for' Message[1] := 'edge-preserving smoothing:' Message := [Message,' - ' + Methods] dev_disp_text (Message, 'window', 12, 12, 'white', 'box', 'false') dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () * Loops := 5 Radius := 2 Amplitude := 15 SigmaSpatial := Radius SigmaRange := Amplitude Contrast := 3 Theta := 10 Iterations := 1 * ImageFiles := ['mreut','claudia'] read_image (Images, ImageFiles) for Index := 1 to |ImageFiles| by 1 select_obj (Images, Image, Index) get_image_size (Image, ImageWidth, ImageHeight) dev_resize_window_fit_size (0, 0, ImageWidth, ImageHeight, -1, -1) dev_display (Image) Message := 'Original image' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () * * 执行导向过滤器. * * 执行一次缓存以允许更稳定的时间度量. guided_filter (Image, Image, ImageGuided, Radius, Amplitude) * 记录运行时间 count_seconds (S1) for L := 1 to Loops by 1 guided_filter (Image, Image, ImageGuided, Radius, Amplitude) endfor count_seconds (S2) TimeGuided := S2 - S1 dev_display (ImageGuided) Message := 'Guided filter' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () * * 执行双边过滤器. * * 执行一次缓存以允许更稳定的时间度量. bilateral_filter (Image, Image, ImageBilateral, SigmaSpatial, SigmaRange, [], []) * M记录运行时间 count_seconds (S3) for L := 1 to Loops by 1 bilateral_filter (Image, Image, ImageBilateral, SigmaSpatial, SigmaRange, [], []) endfor count_seconds (S4) TimeBilateral := S4 - S3 dev_display (ImageBilateral) Message := 'Bilateral filter' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () * * 利用mode方式的parabolic 边缘检测函数进行各向异性扩散。 *请注意,此函数仍允许在边之间进行轻微的扩散(平滑) * * 执行一次缓存以允许更稳定的时间度量. anisotropic_diffusion (Image, ImagePeronaMalik, 'perona-malik', Contrast, Theta, Iterations) * 记录运行时间 count_seconds (S5) for L := 1 to Loops by 1 anisotropic_diffusion (Image, ImagePeronaMalik, 'perona-malik', Contrast, Theta, Iterations) endfor count_seconds (S6) TimeAnisoDiff := S6 - S5 dev_display (ImagePeronaMalik) Message := 'Perona-Malik anisotropic diffusion' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () * * Display detail if (ImageFiles[Index - 1] == 'mreut') dev_set_part (111, 205, 181, 275) else dev_set_part (30, 80, 30 + 2 * 48, 80 + 2 * 37) endif dev_display (Image) Message := 'Original image: ' + ImageFiles[Index - 1] dev_disp_text (Message, 'window', 12, 12, 'black', [], []) stop () dev_display (ImageGuided) Message := 'Guided filter' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () dev_display (ImageBilateral) Message := 'Bilateral filter' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () dev_display (ImagePeronaMalik) Message := 'Perona-Malik anisotropic diffusion' dev_disp_text (Message, 'window', 12, 12, 'black', [], []) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () * * 比较执行时间 Time := [TimeGuided,TimeBilateral,TimeAnisoDiff] * 1000 / Loops * tuple_sort_index (Time, Indices) Colors := ['green','yellow','red'] TimeMax := Time[Indices[2]] * Width := 0.9 * ImageWidth * Time / TimeMax Row := [50,150,250] Column := gen_tuple_const(3,12) gen_rectangle1 (Rectangle, Row, Column, Row + 50, Column + Width) * dev_clear_window () dev_set_part (0, 0, ImageHeight - 1, ImageWidth - 1) dev_disp_text ('Execution times (' + ImageFiles[Index - 1] + ')', 'window', 12, 12, 'black', [], []) dev_disp_text (Methods + ': ' + Time$'.1f' + ' ms', 'image', Row + 55, Column, 'white', 'box', 'false') dev_set_color (Colors[Indices]) dev_display (Rectangle) if (Index < |ImageFiles|) dev_disp_text ('Press Run (F5) to continue', 'window', 'bottom', 'right', 'black', [], []) stop () endif endfor
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

