用C语言进行双边滤波到底错在哪里?拜托大家帮我看看
用C语言进行双边滤波到底错在哪里?拜托大家帮我看看!
大家好,我是图像处理的初学者,研究的是图像去噪,想请大家帮我看看我的这个双边滤波去噪的程序错在哪儿了,为什么双边滤波的结果不对,谢谢大家啦!
#include "stdio.h"
#include "stdlib.h"
#include "mypgm.h"
#include "time.h"
#include "math.h"
#define MAX_IMAGE_SIZE 1024
double d[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE];//d[i][j]表示入力图像,fi][j]表示出力图像。
double f[MAX_IMAGE_SIZE][MAX_IMAGE_SIZE];
void main()
{
int i,j,k,l;
int p = 3;//p决定模板大小。当p=1时,模板为3*3;当p=2时,模板为5*5;当p=n时,模板为(2n+1)*(2n+1)。
short m,n;
double a1=0.01,b1=0.002;
double aa1,bb1;//aa1,bb1为滤波模板中的各权重。
//gguiyi高斯滤波的归一化系数,bguiyi双边滤波的归一化系数,gsum高斯滤波像素的加权和,bsum双边滤波像素的加权和。
double gguiyi=0.0,bguiyi=0.0,gsum=0.0,bsum=0.0;
//读取噪声图像
load_image_data();
x_size2=x_size1;
y_size2=y_size1;
//将读取的噪声图像赋给入力图像
for(i=0;i<y_size2;i++)
{
for(j=0;j<x_size2;j++)
{
d[i][j]=image1[i][j];
}
}
//高斯滤波,双边滤波处理噪声图像
for(i=0;i<y_size2;i++)
{
for(j=0;j<x_size2;j++)
{
for(k=-p;k<=p;k++)
{
for(l=-p;l<=p;l++)
{
m=i+k; n=j+l;
//abs()返回指定数字的绝对值
if(m<0) {m=abs(i+k)-1;} if(m>y_size2-1) {m=2*y_size2-i-k-1;}
if(n<0) {n=abs(j+l)-1;} if(n>x_size2-1) {n=2*x_size2-j-l-1;}
aa1=exp(-a1*(l*l+k*k));
bb1=exp(-b1*(d[i][j]-d[m][n])*(d[i][j]-d[m][n]));
bsum+=aa1*bb1*d[m][n];
bguiyi+=aa1*bb1;
}
}
f[i][j]=bsum/bguiyi;
gguiyi=0.0,bguiyi=0.0,gsum=0.0,bsum=0.0;
}
}
//将滤波后的像素赋给新的图像
for(i=0;i<y_size2;i++)
{
for(j=0;j<x_size2;j++)
{
image2[i][j]=(unsigned char)(f[i][j]+0.5);
}
}
save_image_data();
}
load_image_data()和save_image_data()分别是mypgm.h头文件里定义的读取和创建图像的方法
拜托大家啦!真的看了太久了!觉得公式什么的都对,就是双边滤波的结果不对,愁死啦!拜托大家帮帮忙!