高斯核原理和C++实现
先看下算法逻辑
高斯滤波器是通过将高斯函数由一维平面推导到二维平面,从而达到平滑图像,给图像降噪的目的。
其实还可以理解为是采用了高斯函数使得当前像素和周围像素产生关联性(这一点在图像处理中广泛应用)。
下图是基本公式和高斯模板坐标系:
高斯函数实现流程:
(1)确定高斯模板的size和均方差sigm;
(2)计算高斯模板的数值,这里要注意坐标变换;
(3)高斯模板归一化,保证图像经过高斯滤波後像素值在0-255之间(还有一种说法是为了模拟标准高斯函数覆盖面积为1,但我觉着可能没这个必要,毕竟思想才是灵魂嘛)。
实现代码:
#include <gauss.h> #include <math.h> #define pi 3.1415926 using namespace std; float** gauss_kernel(int k, float sigm) { printf("k: %d, sigm: %f\n",k,sigm);
/*****这里应注意二维数组的创建方式*****/ float **M; float sum = 0; M = new float *[k]; for(int i = 0; i < k; i++) { M[i] = new float[k]; } /******接下来要注意坐标的转换*******/ for(int i = -(k-1)/2; i < (k-1)/2+1; i++) { for(int j = -(k-1)/2; j < (k-1)/2+1; j++) { float f1 = 1./(2*pi*pow(sigm, 2)); float f2 = -(pow(i,2)+pow(j,2)); float f3 = f2/(2*pow(sigm, 2)); M[i+(k-1)/2][j+(k-1)/2] = f1*exp(f3); sum = sum+M[i+(k-1)/2][j+(k-1)/2]; //printf("%f\t",M[i+(k-1)/2][j+(k-1)/2]); } //printf("\n"); } //归一化 for(int i = 0; i < k; i++) { for(int j = 0; j < k; j++) { M[i][j] = M[i][j]/sum; } } return M; } /*******这里注意内存释放*************/ void delete_kernel(float** M,int k) { for(int i = 0; i < k; i++) { delete[] M[i]; M[i] = nullptr; } delete[] M; M = nullptr; }
希望可以给你一点启发,加油!