写这个的目的是想记录一下自己在不使用变长数组的情况下,用动态内存分配创建二维数组。首先是高斯核的计算,公式如下:
![](https://i-blog.csdnimg.cn/blog_migrate/874868480fd81515a71d4741fe2e2d17.png)
以上公式得到一个(2k+1)*(2k+1)大小的高斯窗口(即矩阵),i和j是被滤波的原图像矩阵的像素坐标;
我想实现一个7*7的高斯滤波器,所以要创建一个二维矩阵,使用动态内存分配malloc()函数,顺便再联系一下函数的调用,代码如下:
#include<stdio.h> #include<math.h> #include<stdlib.h> int M = 7; double **gussianFilter(); int main() { int i,j; double **a = gussianFilter(); for(i = 0; i < M; i++) { for(j = 0; j < M;j++) { printf("%lf ",a[i][j]); } printf("\n"); } for(int i=0; i < M; i++) free (a[i]); free(a); return 0; } //高斯核计算 double **gussianFilter() { double sigma=1; double sum=0.0; double **gussian = (double**)malloc(M * sizeof(double*)); for(int i = 0; i < M; i++) gussian[i] = (double*)malloc(M * sizeof(double)); //算出未归一化的高斯核 for(int i=0;i<M;i++) for(int j=0;j<M;j++) { gussian[i][j]=exp(-((i-M/2)*(i-M/2)+(j-M/2)*(j-M/2))/(2.0*sigma*sigma)); sum+=gussian[i][j]; } //进行归一化 for(int i=0;i<M;i++) { for(int j=0;j<M;j++) { gussian[i][j]=gussian[i][j]/sum; } } return gussian; }
运行结果如下:![]()