用 OpenCV 实现 Guided Filter
2015-07-03 08:55
435 查看
最近发现 OpenCV 的 C++ 接口写得和 Matlab 实在是太相似了。我用 OpenCV 2.49 来实现
Guided Filter 的时候几乎是直接照抄作者公开的
Matlab 代码。废话不多直接贴我的代码:
上面这段代码的注释就是 Guided Filter 的原作者给出的 Matlab 代码,我按照这些 Matlab 代码,一行一行改写就很快地完成了基于 OpenCV 的 Guided Filter 实现。我大致搜索了一下,似乎很难找到公开的 Guided Filter 实现,所以这里我分享一下我的代码。另,再次感谢 Guided Filter 的作者 Kaiming He 公开的 Matlab 源码。
http://research.microsoft.com/en-us/um/people/kahe/eccv10/
最近发现 OpenCV 的 C++ 接口写得和 Matlab 实在是太相似了。我用 OpenCV 2.49 来实现
Guided Filter 的时候几乎是直接照抄作者公开的
Matlab 代码。废话不多直接贴我的代码:
cv::Mat guidedFilter(cv::Mat I, cv::Mat p, int r, double eps) { /* % 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 */ cv::Mat _I; I.convertTo(_I, CV_64FC1); I = _I; cv::Mat _p; p.convertTo(_p, CV_64FC1); p = _p; //[hei, wid] = size(I); int hei = I.rows; int wid = I.cols; //N = boxfilter(ones(hei, wid), r); % the size of each local patch; N=(2r+1)^2 except for boundary pixels. cv::Mat N; cv::boxFilter(cv::Mat::ones(hei, wid, I.type()), N, CV_64FC1, cv::Size(r, r)); //mean_I = boxfilter(I, r) ./ N; cv::Mat mean_I; cv::boxFilter(I, mean_I, CV_64FC1, cv::Size(r, r)); //mean_p = boxfilter(p, r) ./ N; cv::Mat mean_p; cv::boxFilter(p, mean_p, CV_64FC1, cv::Size(r, r)); //mean_Ip = boxfilter(I.*p, r) ./ N; cv::Mat mean_Ip; cv::boxFilter(I.mul(p), mean_Ip, CV_64FC1, cv::Size(r, r)); //cov_Ip = mean_Ip - mean_I .* mean_p; % this is the covariance of (I, p) in each local patch. cv::Mat cov_Ip = mean_Ip - mean_I.mul(mean_p); //mean_II = boxfilter(I.*I, r) ./ N; cv::Mat mean_II; cv::boxFilter(I.mul(I), mean_II, CV_64FC1, cv::Size(r, r)); //var_I = mean_II - mean_I .* mean_I; cv::Mat var_I = mean_II - mean_I.mul(mean_I); //a = cov_Ip ./ (var_I + eps); % Eqn. (5) in the paper; cv::Mat a = cov_Ip / (var_I + eps); //b = mean_p - a .* mean_I; % Eqn. (6) in the paper; cv::Mat b = mean_p - a.mul(mean_I); //mean_a = boxfilter(a, r) ./ N; cv::Mat mean_a; cv::boxFilter(a, mean_a, CV_64FC1, cv::Size(r, r)); mean_a = mean_a / N; //mean_b = boxfilter(b, r) ./ N; cv::Mat mean_b; cv::boxFilter(b, mean_b, CV_64FC1, cv::Size(r, r)); mean_b = mean_b / N; //q = mean_a .* I + mean_b; % Eqn. (8) in the paper; cv::Mat q = mean_a.mul(I) + mean_b; return q; }
上面这段代码的注释就是 Guided Filter 的原作者给出的 Matlab 代码,我按照这些 Matlab 代码,一行一行改写就很快地完成了基于 OpenCV 的 Guided Filter 实现。我大致搜索了一下,似乎很难找到公开的 Guided Filter 实现,所以这里我分享一下我的代码。另,再次感谢 Guided Filter 的作者 Kaiming He 公开的 Matlab 源码。
http://research.microsoft.com/en-us/um/people/kahe/eccv10/
相关文章推荐
- StringBuilder is mutable
- UINavigationController纯代码实现细节提示
- 记录:sea.js和require.js配置 与 性能对比
- NGUI长按事件
- Google interview question: count bounded slices(min/max queue)
- 黑马程序员----java的GUI图形用户界面及编程基础
- LeetCode Unique Binary Search Trees II
- LeetCode Unique Binary Search Trees
- UIView用户事件响应
- Liferay 6.1开发学习(十九):Liferay ServiceBuilder之自定义查询
- Liferay 6.1开发学习(二十):Dynamic Query高级查询
- 去除UITableView多余分割线
- UILabel 字体超出 frame 自动缩小
- 解决iOS7和iOS8的UITableViewCell的分割线右移问题
- UITableView去除多余分割线
- ARP协议详解之Gratuitous ARP(免费ARP)
- UITextView添加一个placeholder功能
- ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
- 5 Drease-and-Conquer Fake-Coin Problem(减治法求假币问题)
- UIScrollView+UIPageControl实现图片分页