均值滤波很容易理解,直接给出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);
};