bilateral_filter 双边滤波器详细用法

一、双边滤波(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次的效果
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
双边滤波是一种可以同时考虑空间距离和像素值差异的滤波方法,可以在去除图像噪声的同时保留图像细节。下面是双边滤波的Matlab代码实现: ```matlab function [output_image] = bilateral_filter(input_image, sigma_d, sigma_r) % 双边滤波函数 % input_image: 输入图像 % sigma_d: 空域滤波器的标准差 % sigma_r: 像素值差异滤波器的标准差 % 将输入图像转换为double类型 input_image = im2double(input_image); % 获取输入图像的大小 [M, N, ~] = size(input_image); % 初始化输出图像 output_image = zeros(M, N, 3); % 定义空域滤波器 [X, Y] = meshgrid(-ceil(3*sigma_d):ceil(3*sigma_d)); space_filter = exp(-(X.^2+Y.^2)/(2*sigma_d^2)); % 对于每个像素进行滤波 for i = 1:M for j = 1:N % 计算像素值差异滤波器 pixel_filter = exp(-((input_image(i,j,1)-input_image(:,:,1)).^2+... (input_image(i,j,2)-input_image(:,:,2)).^2+... (input_image(i,j,3)-input_image(:,:,3)).^2)/(2*sigma_r^2)); % 计算双边滤波器 bilateral_filter = space_filter .* pixel_filter; % 归一化 bilateral_filter = bilateral_filter / sum(bilateral_filter(:)); % 计算输出像素值 output_image(i,j,1) = sum(sum(input_image(:,:,1).*bilateral_filter)); output_image(i,j,2) = sum(sum(input_image(:,:,2).*bilateral_filter)); output_image(i,j,3) = sum(sum(input_image(:,:,3).*bilateral_filter)); end end % 将输出图像转换为uint8类型 output_image = uint8(output_image*255); ``` 使用方法: ```matlab input_image = imread('input_image.png'); sigma_d = 2; sigma_r = 0.1; output_image = bilateral_filter(input_image, sigma_d, sigma_r); imshow(output_image); ``` 其中,`input_image.png`为输入图像的文件名,`sigma_d`为空域滤波器的标准差,`sigma_r`为像素值差异滤波器的标准差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值