图像基本变换---快速均值模糊算法

来源:互联网 发布:mac滴管粉底液色号 编辑:程序博客网 时间:2024/04/29 18:38
本文将介绍图像滤波中常用的均值滤波算法内容。
        图像均值算法就是取一个窗口的均值,即所谓的boxfilter。一般使用积分图来加速算法。
   假设图像P的长宽分别为xy,均值为Mean

        均值滤波很容易理解,直接给出C代码如下,欢迎交流:

void FastMeanFilter(unsigned char* srcData, int width, int height ,int stride, unsigned char* dstData,int radius)

{

if(radius == 0)

return;

if(radius > MIN2(width,height) / 2)

radius = (MIN2(width, height) / 2-0.5);

int unit = 4, t = 0, t1 = 0;

int i,j,k,len = width * height * unit;

int block = (radius << 1) + 1;

int winSize = block * block;

long sumB = 0, sumG = 0,sumR = 0;

unsigned char* pSrc = srcData;

int* temp = (int*)malloc(sizeof(int)* width * unit);

memset(temp,0,sizeof(int) * width * unit);

for(k = -radius; k <= radius; k++)

{

for(j = 0; j< width; j++)

{

t = j * unit;

t1 = abs(k) * stride;

temp[t] += pSrc[t + t1];

temp[t + 1] += pSrc[t + 1 + t1];

temp[t + 2] += pSrc[t + 2 + t1];

}

}

for (i = 0; i < height; i++)

    {

        sumB = sumG = sumR = 0;

        for (j = -radius; j <= radius; j++)

        {

 t = abs(j) * unit;

             sumB += temp[t];

 sumG += temp[t + 1];

 sumR += temp[t + 2];                                       

        }

        for (j = 0; j < width; j++)

        {

 t = j * unit + i * stride;

             dstData[t] = (sumB / winSize);

 dstData[t + 1] = (sumG / winSize);

 dstData[t + 2] = (sumR / winSize);

 if (j < width - 1)

 {

 t = abs(j - radius) * unit;

 t1 = (j + radius + 1) % width * unit;

     sumB = sumB - temp[t] + temp[t1];

     sumG = sumG - temp[t + 1] + temp[t1 + 1];

     sumR = sumR - temp[t + 2] + temp[t1 + 2];

 }                                

        }

        if (i < height - 1)

        {

             for (k = 0; k < width; k++)

 {

 t = k * unit + abs(i - radius) * stride;

 t1 = k * unit + (i + radius + 1) % height * stride;

     temp[k * unit] = temp[k * unit] - pSrc[t] + pSrc[t1];

     temp[k * unit + 1] = temp[k * unit + 1] - pSrc[t + 1] + pSrc[t1 + 1];

     temp[k * unit + 2] = temp[k * unit + 2] - pSrc[t + 2] + pSrc[t1 + 2];

 }               

        }

    }

free(temp);

};


demo 下载: http://www.zealfilter.com/forum.php?mod=viewthread&tid=25&extra=page%3D2
0 0