图像双边滤波及时间优化

简介

  本篇主要是对之前实现图像双边滤波及其优化算法的总结记录。

基本原理及原始版本

  1、双边滤波基本原理主要在于其滤波权重同时考虑空间距离和像素值域差距:
                  
       具体原理可以参考资料:http://blog.csdn.net/abcjennifer/article/details/7616663

  原理实现相对比较简单,但是该算法有一个重要缺点:复杂度,算法消耗时间太高。
完全未做优化的该算法跑去噪,在我实验电脑上,跑798X575图像,花费时间:17.27秒。
    结果对比如下:
  

权重表版本

  预先将双边滤波权重表计算出来,遍历整个图像滤波时候的权重计算,变成了简单查表操作。能够大幅度优化算法时间。
同样在相同电脑,用798X575图像实现,花费时间:1.67秒。
    结果图像在质量上应该是一致的:
     

其他优化

  1、模仿高斯模糊加速,将二维图像双边滤波,改变为两次一维的滤波,先对行做滤波,再对列做滤波,可以减少算法时间。
  2、参考论文:Fast Bilateral Filtering for the Display of High-Dynamic-Range Images。
    基本的思想是:将双边滤波的值域权重计算进行分段,取出分段的定点值。进而前面公式中值域的权重计算f(k,l)变成了这些定点值。然后迭代分段次数,段之前像素进行插值,得到结果图像。同时该论文还提到一个加速办法,迭代权重计算时候,
 先进行下采样,做到大幅度的节约时间,但是测试结果来看,当下采样倍数太大时候,结果图像容易出现异常。
    我这边基于论文算法实现,在相同电脑,用798X575图像实现,花费时间:250ms左右。
    算法效果如下:
     

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
双边滤波是一种常见的图像滤波技术,可以在保持边缘信息的同时进行图像平滑处理。下面是MATLAB中实现图像双边滤波的示例程序: ```matlab function [img_filtered] = bilateral_filter(img, sigma_spatial, sigma_range) % 转化为灰度图像 if (size(img, 3) == 3) img = rgb2gray(img); end % 初始化输出图像 img_filtered = zeros(size(img)); % 计算空域权重 [X, Y] = meshgrid(-ceil(3*sigma_spatial):ceil(3*sigma_spatial)); spatial_weight = exp(-(X.^2+Y.^2)/(2*sigma_spatial^2)); % 填充边界 img_padding = padarray(img, [ceil(3*sigma_spatial) ceil(3*sigma_spatial)], 'replicate'); % 迭代处理每个像素 for i = 1:size(img, 1) for j = 1:size(img, 2) % 获取当前像素及其邻域 patch = img_padding(i:i+2*ceil(3*sigma_spatial), j:j+2*ceil(3*sigma_spatial)); center = patch(ceil(3*sigma_spatial)+1, ceil(3*sigma_spatial)+1); % 计算灰度值域权重 range_weight = exp(-(patch-center).^2/(2*sigma_range^2)); % 计算双边滤波权重 bilateral_weight = range_weight .* spatial_weight(1:size(patch, 1), 1:size(patch, 2)); bilateral_weight = bilateral_weight / sum(bilateral_weight(:)); % 对当前像素进行滤波 img_filtered(i, j) = sum(bilateral_weight(:) .* patch(:)); end end % 调整输出图像大小 img_filtered = img_filtered(ceil(3*sigma_spatial)+1:end-ceil(3*sigma_spatial), ceil(3*sigma_spatial)+1:end-ceil(3*sigma_spatial)); end ``` 该程序的输入参数包括: - `img`:待滤波的图像,可以是灰度图像或RGB图像; - `sigma_spatial`:空域标准差; - `sigma_range`:灰度值域标准差。 该程序的输出为双边滤波后的图像。在程序中,首先将RGB图像转换为灰度图像,然后计算空域权重和灰度值域权重,并计算它们的乘积得到双边滤波权重。最后对每个像素进行滤波,得到输出图像

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值