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;//空域核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;
        }
    }
}
  • 1
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值