中值滤波去雾算法matlab,去雾算法-引导滤波程序

//**************************************************************

//**************

guidedfilter() ******************************

//**功能: 引导滤波函数**

//**输入: CvMat *p 输入图像 ,必须为CV_32FC1或者CV_64FC1

**

//**

CvMat *I 引导图像 ,必须为CV_32FC1或者CV_64FC1

**

//**

int r 滤波半径**

//**

double eps 滤波参数**

//**输出: 输出滤波后的图像矩阵**

//**应imSrc的点为中心的邻域的线性叠加值**

//**Auth:

s

**

//**Date:

2014.2

**

//**注意: 参考论文《Guided Image

Filtering》Kaiming He

**

//**************************************************************

CvMat *guidedfilter(CvMat *I, CvMat *p, int r, double

eps)

{

int w=I->width;

int h=I->height;

//printf("...............%d %d",w,h);

CvMat *ones=cvCreateMat(h,w,CV_32FC1);

int i,j;

for (i=0;i

{

for (j=0;j

{

cvmSet(ones,i,j,1.0);

}

}

CvMat *N=NULL;

N=boxfilter(ones,r);

CvMat *mean_I=cvCreateMat(h,w,CV_32FC1);

CvMat *box1=NULL;

box1=boxfilter(I,r);

cvDiv(box1,N,mean_I); //mean_I=box1/N

CvMat *mean_p=cvCreateMat(h,w,CV_32FC1);

CvMat *box2=NULL;

box2=boxfilter(p,r);

cvDiv(box2,N,mean_p); //mean_p=mean_I=box2/N

CvMat *temp1=cvCreateMat(h,w,CV_32FC1);

cvMul(I,p,temp1);

//temp1=I*P 点乘

CvMat *mean_Ip=cvCreateMat(h,w,CV_32FC1);

CvMat *box3=NULL;

box3=boxfilter(temp1,r);

cvDiv(box3,N,mean_Ip);

CvMat *cov_Ip=cvCreateMat(h,w,CV_32FC1);

CvMat *temp2=cvCreateMat(h,w,CV_32FC1);

cvMul(mean_I,mean_p,temp2);

cvSub(mean_Ip,temp2,cov_Ip);

CvMat *temp3=cvCreateMat(h,w,CV_32FC1);

cvMul(I,I,temp3);

CvMat *mean_II=cvCreateMat(h,w,CV_32FC1);

CvMat *box4=NULL;

box4=boxfilter(temp3,r);

cvDiv(box4,N,mean_II);

CvMat *var_I=cvCreateMat(h,w,CV_32FC1);

CvMat *temp4=cvCreateMat(h,w,CV_32FC1);

cvMul(mean_I,mean_I,temp4);

cvSub(mean_II,temp4,var_I);

//var_I=mean_II-temp4

CvMat *temp5=cvCreateMat(h,w,CV_32FC1);

CvScalar s;

s.val[0]=eps;

cvAddS(var_I,s,temp5,0); //temp(I)=var_I(I)+s 数组与数相加

CvMat *a=cvCreateMat(h,w,CV_32FC1);

cvDiv(cov_Ip,temp5,a);

CvMat *temp6=cvCreateMat(h,w,CV_32FC1);

cvMul(a,mean_I,temp6);

CvMat *b=cvCreateMat(h,w,CV_32FC1);

cvSub(mean_p,temp6,b);

CvMat *mean_a=cvCreateMat(h,w,CV_32FC1);

CvMat *mean_b=cvCreateMat(h,w,CV_32FC1);

CvMat *q=cvCreateMat(h,w,CV_32FC1);

CvMat *box5=NULL;

box5=boxfilter(a,r);

CvMat *box6=NULL;

box6=boxfilter(b,r);

cvDiv(box5,N,mean_a);

cvDiv(box6,N,mean_b);

CvMat *temp7=cvCreateMat(h,w,CV_32FC1);

cvMul(mean_a,I,temp7);

cvAdd(temp7,mean_b,q);//两数组相加

cvReleaseMat(&ones);

cvReleaseMat(&N);

cvReleaseMat(&mean_I);

cvReleaseMat(&mean_p);

cvReleaseMat(&mean_Ip);

cvReleaseMat(&cov_Ip);

cvReleaseMat(&mean_II);

cvReleaseMat(&var_I);

cvReleaseMat(&a);

cvReleaseMat(&b);

cvReleaseMat(&mean_a);

cvReleaseMat(&mean_b);

cvReleaseMat(&temp1);

cvReleaseMat(&temp2);

cvReleaseMat(&temp3);

cvReleaseMat(&temp4);

cvReleaseMat(&temp5);

cvReleaseMat(&temp6);

cvReleaseMat(&temp7);

cvReleaseMat(&box1);

cvReleaseMat(&box2);

cvReleaseMat(&box3);

cvReleaseMat(&box4);

cvReleaseMat(&box5);

cvReleaseMat(&box6);

return q;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值