图像导向滤波操作

#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
    评论
GIF导向图像滤波是一种基于导向滤波图像处理方法。它主要通过引入一个导向场来帮助滤波过程。导向滤波是一种基于本地图像结构进行滤波的方法,通过在每个像素位置的局部邻域内的像素值来计算输出像素的值。 GIF导向图像滤波的原理是先计算出导向场。导向场是根据输入图像的某种特征来计算的,例如输入图像的梯度方向。这个导向场可以用于指导滤波过程中的像素值计算,使得滤波结果更加准确。 具体地说,对于每个像素,通过计算其邻域内像素的梯度方向来获得导向场的值。然后,在滤波过程中,不再仅仅考虑像素值的差异,而是同时考虑像素值的差异和导向场的差异。 在计算输出像素的值时,使用一个权重函数来结合像素值差异和导向场差异。这个权重函数可以根据具体的应用而定,常见的有高斯权重和双边滤波权重。根据权重函数,计算出邻域内像素的加权平均值,作为输出像素的值。 通过引入导向场,GIF导向图像滤波可以在保持图像细节的同时减少噪声和平滑图像。导向场能够帮助滤波器更好地理解图像的结构,从而得到更加精确的滤波结果。 总之,GIF导向图像滤波的原理是通过引入导向场来指导滤波过程,以达到更好的滤波效果。该方法在图像处理中具有广泛的应用,可以用于图像去噪、图像增强等方面。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值