https://blog.csdn.net/baimafujinji/article/details/74750283
opencv实现快速导向滤波:
#include <fstream>
#include <sstream>
#include <iostream>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
;
using namespace cv;
using namespace std;
cv::Mat fastGuidedFilter(cv::Mat I_org, cv::Mat p_org, int r, double eps, int s);
void main()
{
Mat srcImage = imread("F:\\wangjiao\\工作\\学习内容\\img.jpg");
if (!srcImage.data) {
cout << "falied to read" << endl;
system("pause");
return;
}
imshow("srcImage", srcImage);
//通道分离
vector<Mat> vSrcImage, vResultImage;
split(srcImage, vSrcImage);
Mat resultMat;
for (int i = 0; i < 3; i++) {
//分通道转换成浮点型
Mat tempImage;
tempImage = vSrcImage[i];
Mat p = tempImage.clone();
//分别进行导向滤波
Mat resultImage = fastGuidedFilter(tempImage, p, 9, 0.01,8);
vResultImage.push_back(resultImage*255);
}
//通道结果合并
merge(vResultImage, resultMat);
imwrite("F:\\wangjiao\\QQ.jpg", resultMat);
//imshow("resultMat", resultMat);
waitKey(0);
}
cv::Mat fastGuidedFilter(cv::Mat I_org, cv::Mat p_org, int r, double eps, int s)
{
/*
% GUIDEDFILTER O(N) 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;
I_org.convertTo(_I, CV_64FC1, 1.0 / 255);
resize(_I, I, Size(), 1.0 / s, 1.0 / s, 1);
cv::Mat p, _p;
p_org.convertTo(_p, CV_64FC1, 1.0 / 255);
//p = _p;
resize(_p, p, Size(), 1.0 / s, 1.0 / s, 1);
//[hei, wid] = size(I);
int hei = I.rows;
int wid = I.cols;
r = (2 * r + 1) / s + 1;//因为opencv自带的boxFilter()中的Size,比如9x9,我们说半径为4
//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));
Mat rmean_a;
resize(mean_a, rmean_a, Size(I_org.cols, I_org.rows), 1);
//mean_b = boxfilter(b, r) ./ N;
cv::Mat mean_b;
cv::boxFilter(b, mean_b, CV_64FC1, cv::Size(r, r));
Mat rmean_b;
resize(mean_b, rmean_b, Size(I_org.cols, I_org.rows), 1);
//q = mean_a .* I + mean_b; % Eqn. (8) in the paper;
cv::Mat q = rmean_a.mul(_I) + rmean_b;
return q;
}
以上代码在imshow()时中断,但是可以imwrite()