算法matlab,去雾算法"/>
中值滤波去雾算法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;
}
更多推荐
中值滤波去雾算法matlab,去雾算法
发布评论