生成高斯核

// makeGause.cpp : 定义控制台应用程序的入口点。
//
#include <stdio.h>
#include <math.h>
#include <memory.h>
#include <malloc.h>
#define ENumber 2.71828183f
#define PI 3.1415926f
int makeGaussianData(float ** data, int width, int height, float filterRatio){
    int i, j;
    float sum = 0.0f;
    *data = (float*)malloc(sizeof(float) * width * height);

    for(i = 0; i < height; i ++){
        for(j = 0; j < width; j ++){
            float temp = 0.0f;
            temp = -1.0f * ((j - width / 2) * (j - width / 2) + (i - height / 2) * (i - height / 2)) / (2.0f * filterRatio * filterRatio);
            temp = powf(ENumber, temp);
            (*data)[i * width + j] = (1.0f / (2.0f * PI * filterRatio * filterRatio)) * temp;
            sum += (*data)[i * width + j];
        }
    }
    printf("sum = %f\n", sum);
    for(i = 0; i < height; i ++){
        for(j = 0; j < width; j ++){

            (*data)[i * width + j] = (*data)[i * width + j] / sum;
        }
    }
    return 0;
}
int makeOneDimGaussKernel(float ** data, int num, float sigma)
{
    int i = 0;
     *data = (float*)malloc(sizeof(float) * num);
     float sum = 0.0f;
    for(i = 0; i < num; i ++)
    {
        float temp = 0.0f;
        temp = -1.0f * (i - num / 2) * (i - num / 2) / (2 * sigma * sigma);
        temp = powf(ENumber, temp);
        (*data)[i] = (1.0f / (2.0f * PI * sigma * sigma)) * temp;
        sum += (*data)[i];

    }
    printf("onesum = %f\n", sum);
    for(i = 0; i < num; i ++)
    {
        (*data)[i] = (*data)[i] / sum;
    }
    return 0;
}
int main(int argc, char* argv[])
{
    float * gaussData = NULL;
    int width = 5;
    int height = 5;
    float sigma = 0.8f;
    makeGaussianData(&gaussData, width, height, sigma);

    for(int i = 0; i < height; i ++)
    {
        for(int j = 0; j < width; j ++)
        {
            printf("%f ", gaussData[width * i + j]);
        }
        printf("\n");
    }

    float * dataOne = NULL;
    makeOneDimGaussKernel(&dataOne, width, sigma);
    printf("\n");
    for(int i = 0; i < width; i ++)
    {
        printf("%f ", dataOne[i]);
    }
    printf("\n");
    free(dataOne);
    free(gaussData);
    return 0;
}


版权声明:本文为baidu_31872269原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。