美文网首页
图像处理基础-高斯模糊

图像处理基础-高斯模糊

作者: 天叔 | 来源:发表于2020-10-25 23:05 被阅读0次

一、高斯函数

一维高斯函数:

二位高斯函数:


二位高斯函数分布

二、高斯滤波代码实现

/*************************************************************
*Function: Gauss mask compute
*Params:
*      r-radius of gauss filter
*      sigma-sigma of gauss filter
*      gaussMask-gauss weight to compute with size of (2r+1)*(2r+1)
*Return NULL
************************************************************/
void GaussMask(int r, double sigma, double gaussMask[])
{
    double PI = 3.1415926;
    double sum = 0;
    int stride = 2 * r + 1;
    for (int y = -r, h = 0; y <= r; y++, h++)
    {
        for (int x = -r, w = 0; x <= r; x++, w++)
        {
// 注意这里2.0 * PI没有开方,其实无所谓,只是求权重,2.0 * PI不影响权重的结果
            gaussMask[w + h * stride] = (1.0 / (2.0 * PI * sigma * sigma)) * (exp(-((double)x * (double)x + (double)y * (double)y) / (2.0 * sigma * sigma)));
            sum += gaussMask[w + h * stride];
        }
    }
    for (int i = 0; i < stride * stride; i++)
    {
        gaussMask[i] = gaussMask[i] / sum;
    }
};
设置参数 r = 1, sigma= 1.0 得到 3 * 3的高斯模板,如下所示: 通常对高斯分布做一定的简化:
得到:

对模板进行修正:得到我们常用的3* 3 的经典模板


同样可以得到 5 * 5 的模板

用木板的好处是,对特定半径可以直接计算,提升效率.

快速高斯模糊

直接用二维高斯模糊效率不高,因此采用快速算法,将二维高斯函数分解为



即:按行进行一次一维高斯滤波,再按列进行一次一维高斯滤波

三、快速高斯模糊代码实现:

int f_FastGaussFilter(unsigned char* srcData,int width, int height,int stride,float r)
{
    int ret = 0;
    int radius = (int)r;
    if(r == 0)
        return ret;
    unsigned char* dstData = (unsigned char*)malloc(sizeof(unsigned char)*height*stride);
    unsigned char* tempData = (unsigned char*)malloc(sizeof(unsigned char)*height*stride);
    memset(dstData, 255, sizeof(unsigned char) * height * stride);
    int totalWei = 0;
    int i,j,k;
    float sigma = r;   
    unsigned char *kernel = (unsigned char *)malloc(2*radius+1);
    for (i = -radius; i <= radius; i++)
    {        
        kernel[i+radius] = (unsigned char) (exp(-(float)i*i/(2*sigma*sigma))*128);
        totalWei += kernel[i+radius];
    }
    int tempR = 0, tempG = 0, tempB = 0;
    int v = 0;
    int K = 0;
    int rem = 0;
    int t = 0;
    int offset = stride - width * 4;
    for ( j = 0; j < height; j++)
    {
        for ( i = 0; i < width; i++)
        {
            tempR = 0; tempG = 0; tempB = 0;
            for ( k = -radius; k <= radius; k++)
            {
                rem = (abs(i + k) % width);
                t = rem * 4 + j * stride;
                K = kernel[k + radius];
                tempB += srcData[t] * K;
                tempG += srcData[t + 1] * K;
                tempR += srcData[t + 2] * K;
            }
            v = i * 4 + j * stride;
            tempData[v] = tempB / totalWei;
            tempData[v + 1] = tempG / totalWei;
            tempData[v + 2] = tempR / totalWei;
        }
    }
    for ( i = 0; i < width; i++)
    {
        for ( j = 0; j < height; j++)
        {
            tempR = 0; tempG = 0; tempB = 0;
            for ( k = -radius; k <= radius; k++)
            {
                rem = (abs(j + k) % height);
                t = rem * stride + i * 4;
                K = kernel[k + radius];
                tempB += tempData[t] * K;
                tempG += tempData[t + 1] * K;
                tempR += tempData[t + 2] * K;
            }
            v = i * 4 + j * stride;
            dstData[v] = tempB/totalWei;
            dstData[v + 1] = tempG/totalWei;
            dstData[v + 2] = tempR/totalWei;
        }
    }
    memcpy(srcData, dstData, sizeof(unsigned char) * height * stride);
    free(dstData);
    free(tempData);
    return ret;
};

todo:高斯模糊没有进行代码验证,后续需要再coding验证

相关文章

  • 图像处理基础-高斯模糊

    一、高斯函数 一维高斯函数: 二位高斯函数: 二、高斯滤波代码实现 设置参数 r = 1, sigma= 1.0 ...

  • 图像处理之高斯模糊

    有时候为了美观,背景图片会加上模糊处理。一张图片其实是由若干个像素组成,每个像素都可以用一个矩阵表示,然而,所谓的...

  • 图像处理之高斯模糊

    高斯模糊是指以中心像素为原点,指定半径(N*N矩形,N为奇数)内的所有像素,根据离中心像素的远近为每个位置分配不同...

  • webgl智慧楼宇发光效果算法系列之高斯模糊

    如果使用过PS之类的图像处理软件,相信对于模糊滤镜不会陌生,图像处理软件提供了众多的模糊算法。高斯模糊是其中的一种...

  • css3 滤镜

    原图: a. 图像高斯模糊 b. 图片进行棕褐色处理 c. 图片灰色处理 d. 图片反色处理 e. 图像饱和...

  • Android图片高斯模糊动画

    前言 这里只讲高斯模糊动画的处理,不讨论高斯模糊的处理方式。想看高斯模糊处理的可以参考这个Android 图片高斯...

  • 图像处理算法--高斯模糊

    感谢@阮一峰摘录自原文地址: http://www.ruanyifeng.com/blog/2012/11/gau...

  • 高斯模糊

    前言 通常,图像处理软件会提供"模糊"(blur)滤镜,使图片产生模糊的效果。 “模糊”的算法不只一种,高斯模糊只...

  • 高斯模糊优化

    Android图像处理系列 - 高斯模糊的几种优化方法[https://mp.weixin.qq.com/s/Mn...

  • Android图像处理 - 高斯模糊的原理及实现

    前言 高斯模糊是图像处理中几乎每个程序员都或多或少听过的名词,但是对其原理大家可能并不了解,只知道通过高斯模糊能实...

网友评论

      本文标题:图像处理基础-高斯模糊

      本文链接:https://www.haomeiwen.com/subject/bbdomktx.html