C语言实现双边滤波

参考博文
在这里插入图片描述
看不懂公式的先去看参考博文

一个3*3窗口的代码

/**双边法滤波  3*3窗口
*参数 data[][COL]     图像数据
*参数 row             图像数据行数
*参数 varD            空域核d的标准差
*参数 varR            值域核r的标准差
*需要引用头文件math.h
*typedef unsigned char  uint8;
*typedef unsigned int   uint16;
宏定义说明
#define COL 5       //图像数组列数
*/
#define COL 5       //图像数组列数
void bilateralFilter(uint8 data[][COL], uint8 row, float varD, float varR)
{float d = 0;//空域核dfloat r = 0;//值域核rfloat w = 0;//卷积核float power = 0;//幂float sumW = 0;//卷积核的和float sumGrayW = 0;//像素与卷积核的乘积的和uint16 x = 0, y = 0, k = 0, l = 0;//遍历for(x = 1; x < row - 1; x++){for(y = 1; y < COL - 1; y++){//求卷积核(空域核d,值域核r)for(k = x - 1; k <= x + 1; k++){for(l = y - 1; l <= y + 1; l++){//d的幂power = (pow((x - k),2) + pow((y - l), 2)) /(-2 * varD * varD);d = exp(power);//r的幂power = pow((data[x][y] - data[k][l]), 2) /(-2 * varR * varR);r = exp(power);//求w  w = d * rw = d * r;//计算窗口中心像素值 = 像素与卷积核的乘积的和 / 卷积核的和sumGrayW += data[k][l] * w;//卷积核的和sumW += w;}}//计算窗口中心像素值 = 像素与卷积核的乘积的和 / 卷积核的和data[x][y] = sumGrayW / sumW;//每算完一个像素值清零sumGrayW = sumW = 0;}}
}

n*n窗口

/**双边法滤波
*参数 data[][COL]     图像数据
*参数 row             图像数据行数
*参数 varD            空域核d的标准差
*参数 varR            值域核r的标准差
*typedef unsigned char  uint8;
*typedef unsigned int   uint16;
*需要引用头文件math.h
宏定义说明
#define COL 5       //图像数组列数
#define Window_D 3  //窗口大小//Window_D = 3 代表窗口大小为:3 * 3//注意 窗口大小只能设置为奇数
*/
#define COL 5       //图像数组列数
#define Window_D 3  //窗口大小//Window_D = 3 代表窗口大小为:3 * 3//注意 窗口大小只能设置为奇数
void bilateralFilter(uint8 data[][COL], uint8 row, float varD, float varR)
{float w = 0;//卷积核float power = 0;//幂float sumW = 0;//卷积核的和float sumGrayW = 0;//像素与卷积核的乘积的和uint16 x = 0, y = 0, k = 0, l = 0;//遍历图像数据for(x = Window_D / 2; x < row - Window_D / 2; x++){for(y = Window_D / 2; y < COL - Window_D / 2; y++){//求卷积核w  w = d * r (空域核d,值域核r)for(k = x - Window_D / 2; k <= x + Window_D / 2; k++){for(l = y - Window_D / 2; l <= y + Window_D / 2; l++){power = (pow((x - k),2) + pow((y - l), 2)) /(2 * varD * varD);power += pow((data[x][y] - data[k][l]), 2) /(2 * varR * varR);w = exp(-power);//像素与卷积核的乘积的和sumGrayW += data[k][l] * w;//卷积核的和sumW += w;}}//计算窗口中心像素值 = 像素与卷积核的乘积的和 / 卷积核的和data[x][y] = sumGrayW / sumW;//每算完一个像素值清零sumGrayW = sumW = 0;}}
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部