Fast guided Filter
来源:互联网 发布:php int加括号 编辑:程序博客网 时间:2024/05/22 04:39
这是何凯明博士2015年提出的快速导向滤波,论文链接如下:
http://120.52.73.75/arxiv.org/pdf/1505.00996v1.pdf
下图是导向滤波的原理图
关于具体理论在博客的上一篇中有详细的介绍
这里节选出普通算法和快速导向滤波的算法对比图
对于代码,网上有很都实现,一个基于opencv的导向滤波链接如下:
http://blog.csdn.net/occupy8/article/details/40322771
大家可以参考下,作者抛出的matlab代码好简单,可以对应着自己写
这里列出fast guide filter的matlab 代码:
function q = fastguidedfilter(I, p, r, eps, s)% GUIDEDFILTER O(1) time implementation of guided filter.%% - guidance image: I (should be a gray-scale/single channel image)% - filtering input image: p (should be a gray-scale/single channel image)% - local window radius: r% - regularization parameter: eps% - subsampling ratio: s (try s = r/4 to s=r)I_sub = imresize(I, 1/s, 'nearest'); % NN is often enoughp_sub = imresize(p, 1/s, 'nearest');r_sub = r / s; % make sure this is an integer[hei, wid] = size(I_sub);N = boxfilter(ones(hei, wid), r_sub); % the size of each local patch; N=(2r+1)^2 except for boundary pixels.mean_I = boxfilter(I_sub, r_sub) ./ N;mean_p = boxfilter(p_sub, r_sub) ./ N;mean_Ip = boxfilter(I_sub.*p_sub, r_sub) ./ N;cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch.mean_II = boxfilter(I_sub.*I_sub, r_sub) ./ N;var_I = mean_II - mean_I .* mean_I;a = cov_Ip ./ (var_I + eps);b = mean_p - a .* mean_I;mean_a = boxfilter(a, r_sub) ./ N;mean_b = boxfilter(b, r_sub) ./ N;mean_a = imresize(mean_a, [size(I, 1), size(I, 2)], 'bilinear'); % bilinear is recommendedmean_b = imresize(mean_b, [size(I, 1), size(I, 2)], 'bilinear');q = mean_a .* I + mean_b;end这个是作者matlab代码的下载地址:http://research.microsoft.com/en-us/um/people/kahe/eccv10/fast-guided-filter-code-v1.rar
参考这个matlab代码,我基于opencv写出了fast guide filter的c++代码,速度提升了3倍,下面时核心部分实现:
GuidedFilter::GuidedFilter(const cv::Mat &origI, int r, double eps) : r(r), eps(eps){ if (origI.depth() == CV_32F || origI.depth() == CV_64F) I = origI.clone(); else I = convertTo(origI, CV_32F); //f mean (·, r) denotes a mean filter with a radius r. Idepth = I.depth(); cv::resize(I,I_sub,cv::Size(I.cols/4,I.rows/4),0,0); int r_sub = r / 4; //corr_I = f(I,r) in paper Algorithm1 mean_I = boxfilter(I_sub, r_sub); //mean_II = f(I.*I,r) in paper Algorithm1 cv::Mat mean_II = boxfilter(I_sub.mul(I_sub), r_sub); //var_I = corr_I-mean_I.*mean_I in paper Algorithm1 var_I = mean_II - mean_I.mul(mean_I);}cv::Mat GuidedFilter::filterSingleChannel(const cv::Mat &p) const{ cv::Mat p_sub; cv::resize(p,p_sub,cv::Size(p.cols/4,p.rows/4),0,0); cv::Mat mean_p = boxfilter(p_sub, r / 4); cv::Mat mean_Ip = boxfilter(I_sub.mul(p_sub), r / 4); cv::Mat cov_Ip = mean_Ip - mean_I.mul(mean_p); // this is the covariance of (I, p) in each local patch. // a = corr_IP ./ (var_I + eps) cv::Mat a = cov_Ip / (var_I + eps); // b = mean_p - a.*mean_I cv::Mat b = mean_p - a.mul(mean_I); cv::Mat mean_a = boxfilter(a, r / 4); cv::Mat mean_b = boxfilter(b, r / 4); //The guided filting out image q = mean_a .*I + mean_b cv::Mat mean_a_up,mean_b_up; cv::resize(mean_a,mean_a_up,cv::Size(I.cols,I.rows),0,0); cv::resize(mean_b,mean_b_up,cv::Size(I.cols,I.rows),0,0); return mean_a_up.mul(I) + mean_b_up;}
上面时针对单通道的图像,三通道的图像,只需要用opencv的split函数分离通道,分别求出三个通道的滤波图,最后再用merge函数合并通道即可
0 0
- Fast guided Filter
- Guided Filter
- guided image filter
- Introduction to guided filter
- Guided Filter 引导滤波
- 引导滤波Guided Filter
- 认识guided filter
- 用 OpenCV 实现 Guided Filter
- 导向滤波小结:从导向滤波(guided filter)到快速导向滤波(fast guide filter)的原理,应用及opencv实现代码
- 导向滤波小结:从导向滤波(guided filter)到快速导向滤波(fast guide filter)的原理,应用及opencv实现代码
- 导向滤波原理(Guided Filter)
- Single Image Haze Removal Based On Guided Filter
- 导向滤波(Guided Filter)的解析与实现
- guided Filter--引导滤波算法原理及实现
- adblock plus fast filter matching
- 【拜小白opencv】33-平滑处理6——引导滤波/导向滤波(Guided Filter)
- OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾
- OpenCV导向滤波(引导滤波)实现(Guided Filter)代码,以及使用颜色先验算法去雾
- Java 实现工厂设计模式的三种方式
- 安装Nginx+Lua开发环境
- 自动交互式脚本--expect简介
- ssh终端访问Linux中文乱码
- 自动化实施需考虑点
- Fast guided Filter
- redhat 几个命令
- 广义回归神经网络GRNN ,竞争神经网络,自组织映射神经网络
- 我与Django
- spring mvc DispatcherServlet详解之前传---FrameworkServlet
- 基于AFNetworking3.0网络封装
- Java创建excel表格并下载
- Java int[] 跟 byte[] 的相互转化,可还原
- UTF-8 的tomcat接受GBK请求乱码