图像导向滤波操作

#include <iostream>  
#include "opencv2/core/core.hpp"    
#include "opencv2/highgui/highgui.hpp"    
#include "opencv2/imgproc/imgproc.hpp"      
using namespace std;  
using namespace cv;   
// 导向滤波器 
cv::Mat guidedfilter( Mat &srcImage, Mat &srcClone, int r, double eps )   
{  
  // 转换源图像信息
  srcImage.convertTo(srcImage, CV_64FC1);      
  srcClone.convertTo(srcClone, CV_64FC1);   
  int nRows = srcImage.rows;  
  int nCols = srcImage.cols;   
  cv::Mat boxResult; 
  // 步骤一: 计算均值
  cv::boxFilter(cv::Mat::ones(nRows, nCols, srcImage.type()),
      boxResult, CV_64FC1, cv::Size(r, r));  
  // 生成导向均值mean_I    
  cv::Mat mean_I;  
  cv::boxFilter(srcImage, mean_I, CV_64FC1, cv::Size(r, r));   
  // 生成原始均值mean_p   
  cv::Mat mean_p;  
  cv::boxFilter(srcClone, mean_p, CV_64FC1, cv::Size(r, r)); 
  // 生成互相关均值mean_Ip 
  cv::Mat mean_Ip;  
  cv::boxFilter(srcImage.mul(srcClone), mean_Ip, 
      CV_64FC1, cv::Size(r, r));   
  cv::Mat cov_Ip = mean_Ip - mean_I.mul(mean_p); 
  // 生成自相关均值mean_II 
  cv::Mat mean_II;  
  cv::boxFilter(srcImage.mul(srcImage), mean_II, CV_64FC1, cv::Size(r, r)); 
  // 步骤二:计算相关系数   
  cv::Mat var_I = mean_II - mean_I.mul(mean_I); 
  cv::Mat var_Ip = mean_Ip - mean_I.mul(mean_p); 
  // 步骤三:计算参数系数a,b 
  cv::Mat a = cov_Ip/(var_I + eps);    
  cv::Mat b = mean_p - a.mul(mean_I);  
  // 步骤四:计算系数a,b均值    
  cv::Mat mean_a;  
  cv::boxFilter(a, mean_a, CV_64FC1, cv::Size(r, r));  
  mean_a = mean_a / boxResult;     
  cv::Mat mean_b;  
  cv::boxFilter(b, mean_b, CV_64FC1, cv::Size(r, r));  
  mean_b = mean_b / boxResult;   
  //步骤五:生成输出矩阵 
  cv::Mat resultMat = mean_a.mul(srcImage) + mean_b;  
  return resultMat;  
}    
int main()  
{    
    cv::Mat srcImage = cv::imread("..\\images\\flower3.jpg");
    if(srcImage.empty())
          return-1;
    cv::Mat srcGray(srcImage.size(),CV_8UC1);  
    cvtColor(srcImage,srcGray,CV_BGR2GRAY); 
    // 通道分离 
    vector<Mat> vSrcImage, vResultImage;  
    split(srcImage,vSrcImage);
    Mat resultMat;      
    for(int i=0; i < 3; i++)    
    {    
        // 分通道转换成浮点型数据
        Mat tempImage ; 
        vSrcImage[i].convertTo(tempImage, CV_64FC1,1.0/255.0);  
        Mat p = tempImage.clone();
        // 分别进行导向滤波       
        Mat resultImage = guidedfilter(tempImage, p, 4, 0.01);  
        vResultImage.push_back(resultImage);        
    } 
    // 通道结果合并   
    merge(vResultImage,resultMat);  
    cv::imshow("srcImage", srcImage);  
    cv::imshow("resultMat", resultMat);  
    cv::waitKey(0);    
    return 0;  
} 



转载:http://blog.csdn.net/zhuwei1988

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值