勇哥的实验,常见halcon图像过滤器的测试(三):bilateral_filter双边滤波器详解

勇哥注:

图片过滤器是一切缺陷检测、边缘提取、图片分割前处理、分类器应用等等的基础。有很重要的研究意义。

因此勇哥会写成一个系列贴子以和大家一起分享。


-正文---------------------------------------------------------------------

bilateral_filter  对图像执行双边滤波

算子签名如下:

bilateral_filter(Image, ImageJoint : ImageBilateral : SigmaSpatial, SigmaRange, GenParamName, GenParamValue : )


算子描述:

bilateral_filter使用掩码图像ImageJoint对输入图像执行联合双边滤波,并将结果返回imagebitral。

Image和ImageJoint必须具有相同的大小和类型。


SigmaSpatial定义了滤波器掩模的大小,并与常规高斯滤波器的标准差相对应。值越大,过滤器的影响范围越大,保留的细节越少。

SigmaRange用于根据当前像素周围ImageJoint的像素修改过滤器掩码。

只有具有弱边缘且对比度低于SigmaRange的区域中的像素才有助于平滑。

请注意,uint2或Real图像中的对比度可能与SigmaRange的默认值显著不同,并相应地调整参数。

GenParamName和GenParamValue当前可用于控制精度和速度之间的权衡。


ImageJoint 的影响


图像的每个像素都使用依赖于ImageJoint的滤波掩模进行滤波。

该滤波掩模结合了基于SigmaSpatial的高斯贴近度函数和基于SigmaRange的加权灰度差的高斯相似性函数。

image.png



上图是取决于ImageJoint的局部滤波器掩模示例:


左边图:在均匀区域,滤镜掩模几乎是高斯的。

中间图:过滤器遮罩沿着这条线。这意味着,只有暗像素被平滑,边缘被保留。

右边图:过滤器遮罩类似于角。请注意,过滤器遮罩会穿过阴影延伸到具有类似灰度值的区域



如果Image和ImageJoint是相同的,则双边\u过滤器的行为类似于边缘保持平滑,其中SigmaSpatial定义过滤器掩码的大小。

边缘上对比度明显大于SigmaRange的像素将被保留,而同质区域中的像素将被平滑。


image.png

(1) Image和(2)ImageJoint是相同的。这导致了(3)图像的边缘保持平滑。


如果 Image和ImageJoint不同,则使用受ImageJoint影响的滤波掩模对图像的每个像素进行平滑。

在ImageJoint具有明显大于SigmaRange对比度的强边缘的位置处的像素比均匀区域中的像素平滑得少。

image.png

(1) Image和(2)ImageJoint是不同的。(3) imagebitral:只保留ImageJoint有边的地方的边。


如果ImageJoint是常量,则bilateral_filter等效于带SigmaSpatial的高斯平滑(请参见gauss_filter 或者 smooth_image)

image.png

(1) Image。(2) ImageJoint是常量。(3) 图像双边等于高斯平滑后的图像。


平滑参数的影响


下面的例子显示了SigmaRange对测试图像的影响。

在该图像中,噪声级为10个灰度值,左边缘的对比度为50个灰度值,右边缘的对比度为100个灰度值。

黄线显示水平横截面的灰度值剖面

image.png

原始图像具有叠加的灰度轮廓,用作Image和ImageJoint


image.png

SigmaRange=1时的过滤结果:没有影响,因为SigmaRange低于噪声级。因此,噪声被视为边缘和保留。


image.png

SigmaRange=25的过滤结果:平滑噪声,保留边缘

image.png

SigmaRange=50的过滤结果:较弱的边缘被平滑,较强的边缘被保留

image.png

SigmaRange=100的过滤结果:两条边都平滑



GenParamName参数


支持GenParamName的以下值:


'sampling_method'

默认情况下,双边滤波器使用双边滤波器的近似值,该近似值仅使用采样点的子集来计算局部滤波器掩码。

通过设置“sampling_method”,可以选择使用的近似值。可能的值为:


“grid”(默认)

使用规则网格对过滤器掩码进行二次采样。


'poisson_disk'

使用poisson_disk采样。此方法比“grid”慢,但可能产生较少的伪影。


'exact'

使用所有可用点。这种方法最慢,但最准确。如果使用“exact”,则忽略“sampling_ratio”。


'sampling_ratio'

控制用于局部滤波器掩码的子采样的点数。

通过将“采样率”设置为1.0,可以使用精确的方法。使用较低的采样率会导致更快的过滤,但也会导致稍微不太准确的结果。

建议值:0.25、0.5、0.75、1.0

默认值:0.50


滚动双边滤波器


双边滤波器可以迭代应用。在这种情况下,一次迭代的结果被用作下一次迭代的引导图像。这可能是有用的,例如,从原始图像中移除小结构,即使它们具有高对比度。


下面的示例显示了滚动过滤器对测试图像的效果。

在该图像中,噪声级为10个灰度值,暗区和亮区之间的对比度为100个灰度值,左亮条宽10个像素,右亮条宽40个像素。

黄线显示水平横截面的灰度值剖面。

使用的参数:ImageJoint常量,SigmaSpatial=25,SigmaRange=15。

* Apply the rolling bilateral filter
  * (use a constant guide for the first iteration).
  gen_image_proto (Image, ImageJoint, 128)
  for I := 1 to 6 by 1
    bilateral_filter (Image, ImageJoint, ImageJoint, 25, 15, [], [])
  endfor

image.png

(1) 输入图像和(2)图像,用于滚动滤波器的第一次迭代。


image.png

第一次迭代后的结果:删除较小的条。

image.png

第三次迭代后的结果:右侧条的边缘部分恢复

image.png

第六次迭代后的结果:右侧条的边缘完全恢复。


举一个实际的迭代例子:

read_image (Image, 'mreut')
* Edge-preserving smoothing
bilateral_filter (Image, Image, ImageBilateral, 5, 20, [], [])
* Rolling filter (5 iterations)
gen_image_proto (Image, ImageJoint1, 0)
for I := 1 to 5 by 1
  bilateral_filter (Image, ImageJoint1, ImageJoint1, 5, 20, [], [])
endfor


原图

image.png

迭代2次的效果

image.png

迭代5次的效果

image.png


--------------------- 

作者:hackpig
来源:
www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!


本文出自勇哥的网站《少有人走的路》wwww.skcircle.com,转载请注明出处!讨论可扫码加群:

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«    2024年3月    »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 点击查阅微信群二维码
  • 扫描加勇哥的非标自动化群,验证答案:C#/C++/VB勇哥的非标自动化群
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:
  • 留言板:

Powered By Z-BlogPHP 1.7.2

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864