参考博文
看不懂公式的先去看参考博文
一个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;//空域核d
float r = 0;//值域核r
float 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 * r
w = 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;
}
}
}