用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头文件里定义的读取和创建图像的方法
拜托大家啦!真的看了太久了!觉得公式什么的都对,就是双边滤波的结果不对,愁死啦!拜托大家帮帮忙!
大家好,我是图像处理的初学者,研究的是图像去噪,想请大家帮我看看我的这个双边滤波去噪的程序错在哪儿了,为什么双边滤波的结果不对,谢谢大家啦!
#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头文件里定义的读取和创建图像的方法
拜托大家啦!真的看了太久了!觉得公式什么的都对,就是双边滤波的结果不对,愁死啦!拜托大家帮帮忙!
...全文
相关推荐
递归双边滤波算法源码DEMO
在图像处理领域,快速双边滤波和递归双边滤波是两种常见的优化方法。快速双边滤波通过近似计算降低了计算量,而递归双边滤波则通过迭代更新减少了运算次数。
双边滤波算法
本项目是基于C++编程语言,利用Visual Studio 2010开发环境实现的双边滤波算法。**1.
双边滤波opencv和vc代码实现
VC++(Visual C++)是微软开发的一款集成开发环境,常用于编写Windows平台下的应用程序,包括与OpenCV结合进行图像处理。
cpp-一个基于双边滤波图像增强的轻量级C库
**标签解析:**" C/C++ 开发 - 图片处理" 这个标签明确了这个库的编程语言(C++)和应用领域(图像处理)。
双边滤波实现
- **高动态范围图像处理**:在HDR图像中,双边滤波可以帮助融合不同曝光的图像,同时保持细节。### 代码实现在编程语言如C++或Python中,可以使用OpenCV库来实现双边滤波。


图形处理/算法
