一、双边滤波(Bilateral filter)是一种可以保边去噪的滤波器。其输出像素的值依赖于邻域像素的值的加权组合。
从效果来说,双边滤波可产生类似美肤的效果。皮肤上的皱纹和斑,与正常皮肤的差异,远小于黑白眼珠之间的差异,因此前者被平滑,而后者被保留。
bilateral_filter(Image, Image, ImageBilateral, 5, 20, 'sampling_ratio', 0.5)
原图
结果图
二、下面一个缺陷检测的实例:
原图
shock_filter过滤后的效果
这个时候看到物料齿内仍然是有干扰的。
我们希望齿内外干扰尽可能去掉,并且不要把图像高频的部分去掉(好图像边缘)。
这个需求正好适用bilateral_filter
bilateral_filter过滤之后的效果,达到我们的需求。
read_image (Image, ImageFiles[14])shock_filter(Image, SharpenedImage, 0.5, 10, 'canny', 0.8)
bilateral_filter(SharpenedImage, SharpenedImage, ImageBilateral, 9, 20, [], [])
三、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当前可用于控制精度和速度之间的权衡。
四、滚动双边滤波器
双边滤波器可以迭代应用。在这种情况下,一次迭代的结果被用作下一次迭代的引导图像。这可能是有用的,例如,从原始图像中移除小结构,即使它们具有高对比度。
下面的示例显示了滚动过滤器对测试图像的效果。
在该图像中,噪声级为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次的效果