导向滤波(Guided Filter)相关公式及伪代码

参考文献:《张文婷_基于导向滤波的图像增强算法研究》

导向滤波器的定义:

q_{i}=\bar{a_{i}}I_{i}+\bar{b_{i}}

式中q_{i}为输出像素点,I_{i}为导向图像素点(导向图可以为输入图像,也可以是其他图像)

假设输出图像q是输入图像p减去不必要的纹理和噪声n,则可得到下述公式:

q_{i}=p_{i}-n_{i}

为了让输出图像 q 与输入图像 p 相差最小,引入了下述代价函数,式中系数 a_{k} 和 b_{k} 在窗口 w_{k} 中保持不变,则:

E(a_{k}, b_{k})=\sum_{i \epsilon w_{k}}^{}((a_{k}I_{i}+b_{k}-p_{i})^{2}+\varepsilon a_{k}^{2})

式中 \varepsilon 是正则化参数,最小化该代价函数,可得到 a_{k} 和 b_{k} 的表达式如下:

a_{k}=\frac{\frac{1}{\left | \omega \right |}\sum_{i\epsilon w_{k}}^{}I_{i}p_{i}-\mu _{k}\bar{p_{k}}}{\sigma_{k}^{2}+\varepsilon }

b_{k}=\bar{p_{k}}-a_{k}\mu _{k}

式中 \mu_{k} 和 \sigma_{k}^{2} 分别是导向图 I 在窗口w_{k} 中的均值和方差

方差与数学期望的公式为 D(X)=E(X^{2})-E(X)^2

所以,

 \bar{a_{i}}=\frac{1}{\left | \omega \right |}\sum_{k\epsilon w_{i}}^{}a_{k} ,\bar{b_{i}} = \frac{1}{\left | \omega \right |}\sum_{k\epsilon w_{i}}^{}b_{k}

伪代码:

f_{mean}  ——   模板大小为 r\times r 的均值滤波器

corr    ——   相关系数

var     ——    方差

cov     ——    协方差

输入:输入图像 p,导向图 I ,窗口半径 r ,正则化参数 \varepsilon

输出:输出图像 q

1:mean_{I}=f_{mean}(I)

     mean_{p}=f_{mean}(p)

     corr_{I}=f_{mean}(I.*I)

     corr_{Ip}=f_{mean}(I.*p)

2:var_{I}=corr_{I}-mean_{I}.*mean_{I}

      cov_{Ip}=f_{mean}(I.*p)

3:a=cov_{Ip}./(var_{I}+\varepsilon )

      b=mean_{p}-a.*mean_{I}

4:mean_{a}=f_{mean}(a)

      mean_{b}=f_{mean}(b)

5:q=mean_{a}.*I+mean_{b}

PS:用Opencv编程的话,求均值可适当使用blur函数~~~ (ง •_•)ง

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于加权中值滤波的滚动导向滤波的 MATLAB 代码示例: ```matlab function output = rolling_guided_filter(input, guidance, radius, epsilon, q) % input: 输入图像 % guidance: 引导图像 % radius: 滤波器半径 % epsilon: 正则化项 % q: 中值滤波器的权重 % 初始化输出图像 output = zeros(size(input)); % 对每个像素应用滤波 for i = 1:size(input, 1) for j = 1:size(input, 2) % 计算滤波器边界 rmin = max(i-radius, 1); rmax = min(i+radius, size(input,1)); cmin = max(j-radius, 1); cmax = min(j+radius, size(input,2)); % 提取局部窗口 input_window = input(rmin:rmax, cmin:cmax); guidance_window = guidance(rmin:rmax, cmin:cmax); % 计算权重和中值 weights = exp(-((guidance_window - guidance(i,j)).^2)./(epsilon^2)); median_val = weighted_median(input_window, weights, q); % 计算输出像素值 output(i,j) = median_val; end end end function median_val = weighted_median(input, weights, q) % input: 输入向量 % weights: 权重向量 % q: 权重中值 % 将输入向量和权重向量按升序排序 [sorted_input, idx] = sort(input(:)); sorted_weights = weights(idx); % 计算累计权重 cumulative_weights = cumsum(sorted_weights); % 找到权重中值位置 median_idx = find(cumulative_weights >= q, 1, 'first'); % 如果没有找到权重中值位置,则返回最大值 if isempty(median_idx) median_idx = numel(input); end % 返回权重中值 median_val = sorted_input(median_idx); end ``` 这个函数接受输入图像 `input` 和引导图像 `guidance`,并基于加权中值滤波进行滚动导向滤波,使用指定的半径 `radius`、正则化项 `epsilon` 和权重中值 `q`。输出是滤波后的图像 `output`。 注意,这里的加权中值滤波使用了自定义函数 `weighted_median`,它接受一个输入向量 `input`、一个权重向量 `weights` 和一个权重中值 `q`,并返回加权中值。该函数使用指定的权重向量对输入向量进行排序,并计算累计权重,然后找到权重中值位置并返回加权中值。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值