参考博文
看不懂公式的先去看参考博文
一个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;}}
}















