导向滤波的解析与实现

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()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值