zoukankan      html  css  js  c++  java
  • 高斯核原理和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
    ",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 ",M[i+(k-1)/2][j+(k-1)/2]); } //printf(" "); } //归一化 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; }

    希望可以给你一点启发,加油!

  • 相关阅读:
    批处理(*.bat)文件 -> 命令
    设置柱状图:每项颜色不一样
    回到顶部 插件 遇到的一点小问题
    body的滚动事件的坑
    文章标题
    window.open()打开的新窗口被拦截的原因分析和解决方案
    常用正则表达式
    代码整洁之道,clean code
    表单序列化,获取Json对象
    利用聚合函数来去重
  • 原文地址:https://www.cnblogs.com/zhibei/p/12190440.html
Copyright © 2011-2022 走看看