高斯滤波的C语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高斯滤波的C语言实现
高斯滤波是一种线性平滑滤波,适用于消除高斯噪声,广泛应用于图像处理的减噪过程。关于高斯滤波的数学原理说明可以从文章底部的参考资料中获得。
通俗的讲,高斯滤波就是对整幅图像进行加权平均的过程,每一个像素点的值,都由其本身和邻域内的其他像素值经过加权平均后得到。
高斯滤波的具体操作是:用一个模板(或称卷积、掩模)扫描图像中的每一个像素,用模板确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值。
一般的模板为3×3或5×5大小,其权值分布如下图:
若使用3×3模板,则计算公式如下:
g(x,y)={f(x-1,y-1)+f(x-1,y+1)+f(x+1,y-1)+f(x+1,y+1)+[f(x-1,y)+f(x,y-1 )+f(x+1,y)+f(x,y+1)]*2+f(x,y)*4}/16;
其中,f(x,y)为图像中(x,y)点的灰度值,g(x,y)为该点经过高斯滤波后的值。
以下是一段在OpenCV中实现的C语言程序,为一个使用3×3模板的高斯滤波函数,输入的参数依次为:当前灰度图像数据指针、图像宽度、图像高度。函数更新了灰度图像数据指针所指向的数据。
01 void gaussianFilter(uchar* data, int width, int height)
02 {
03 int i, j, index, sum;
04 int templates[9] = { 1, 2, 1,
05 2, 4, 2,
06 1, 2, 1 };
07 sum = height * width * sizeof(uchar);
08 uchar *tmpdata = (uchar*)malloc(sum);
09 memcpy((char*)tmpdata,(char*)data, sum);
10 for(i = 1;i < height - 1;i++)
11 {
12 for(j = 1;j < width - 1;j++)
13 {
14 index = sum = 0;
15 for(int m = i - 1;m < i + 2;m++)
16 {
17 for(int n = j - 1; n < j + 2;n++)
18 {
19 sum +=
20 tmpdata[m * width +
n] *
2 1
templates[index++] ;
2
2
}
23 }
24 data[i * width + j] = sum / 16;
25 }
26 }
27 free(tmpdata);
28 }