勇哥注:
图片过滤器是一切缺陷检测、边缘提取、图片分割前处理、分类器应用等等的基础。有很重要的研究意义。
因此勇哥会写成一个系列贴子以和大家一起分享。
-正文---------------------------------------------------------------------
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的加权灰度差的高斯相似性函数。
上图是取决于ImageJoint的局部滤波器掩模示例:
左边图:在均匀区域,滤镜掩模几乎是高斯的。
中间图:过滤器遮罩沿着这条线。这意味着,只有暗像素被平滑,边缘被保留。
右边图:过滤器遮罩类似于角。请注意,过滤器遮罩会穿过阴影延伸到具有类似灰度值的区域
如果Image和ImageJoint是相同的,则双边\u过滤器的行为类似于边缘保持平滑,其中SigmaSpatial定义过滤器掩码的大小。
边缘上对比度明显大于SigmaRange的像素将被保留,而同质区域中的像素将被平滑。
(1) Image和(2)ImageJoint是相同的。这导致了(3)图像的边缘保持平滑。
如果 Image和ImageJoint不同,则使用受ImageJoint影响的滤波掩模对图像的每个像素进行平滑。
在ImageJoint具有明显大于SigmaRange对比度的强边缘的位置处的像素比均匀区域中的像素平滑得少。
(1) Image和(2)ImageJoint是不同的。(3) imagebitral:只保留ImageJoint有边的地方的边。
如果ImageJoint是常量,则bilateral_filter等效于带SigmaSpatial的高斯平滑(请参见gauss_filter 或者 smooth_image)
(1) Image。(2) ImageJoint是常量。(3) 图像双边等于高斯平滑后的图像。
平滑参数的影响
下面的例子显示了SigmaRange对测试图像的影响。
在该图像中,噪声级为10个灰度值,左边缘的对比度为50个灰度值,右边缘的对比度为100个灰度值。
黄线显示水平横截面的灰度值剖面
原始图像具有叠加的灰度轮廓,用作Image和ImageJoint
SigmaRange=1时的过滤结果:没有影响,因为SigmaRange低于噪声级。因此,噪声被视为边缘和保留。
SigmaRange=25的过滤结果:平滑噪声,保留边缘
SigmaRange=50的过滤结果:较弱的边缘被平滑,较强的边缘被保留
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
(1) 输入图像和(2)图像,用于滚动滤波器的第一次迭代。
第一次迭代后的结果:删除较小的条。
第三次迭代后的结果:右侧条的边缘部分恢复
第六次迭代后的结果:右侧条的边缘完全恢复。
举一个实际的迭代例子:
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
原图
迭代2次的效果
迭代5次的效果
---------------------
作者:hackpig
来源:www.skcircle.com
版权声明:本文为博主原创文章,转载请附上博文链接!

